dockerFile解析
1.背景
2.先來一個hello world
在上一節中我講了容器資料卷,那麼可以在自己建一個容器卷麼
步驟:
第一步,在主機根目錄下建立一個資料夾,名稱為dockerFileData
第二步,file構建,即建立一個檔案為dockerFile01,檔案內容為:
# volume test01
FROM centos
VOLUME ["/c-dataFile01","/c-dataFile02","/c-dataFile03"]
CMD echo "finished....success"
CMD /bin/bash
第三步,上一步的檔案build生成映象,
docker build -f /dockerFileData/dockerFile01 -t testImage01/centos
大家這裡注意觀察,
截圖中的Step0.....Step1....Step2.....Step3...幾個步驟,
每一步其實就對應是我們上面的程式碼,
並且每一步都會產生一個映象id,再次印證我們之前講的映象是一層包一層的。
第四步,run執行容器
第五步,檢視執行後的根目錄下是否有c-dataFile01,c-dataFile02,c-dataFile03三個容器共享資料夾;
第六步,使用 docker inspect 容器id,檢視上一步中的上個共享檔案對應的主機繫結的預設資料夾位置;
更多內容如下:
[ { "Id": "9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa", "Created": "2020-08-08T04:22:12.6184255Z", "Path": "/bin/bash", "Args": [], "State": { "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 20613, "ExitCode": 0, "Error": "", "StartedAt": "2020-08-08T04:22:13.0093046Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "a666d14bf5bac359135485a3cf4bf9ed6b8ee60fe65b87a2fd313f252df7bfd7", "NetworkSettings": { "Bridge": "", "EndpointID": "080f5be425e241b0aad8cffb116740646b2952d34b356ad8ac571eadda22f523", "Gateway": "172.17.42.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "HairpinMode": false, "IPAddress": "172.17.0.11", "IPPrefixLen": 16, "IPv6Gateway": "", "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:0b", "NetworkID": "d548d190550d9f5933f92e5843f0f27f69ae038b4313503ad73422cf089357be", "PortMapping": null, "Ports": {}, "SandboxKey": "/var/run/docker/netns/9a28a87274f4", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null }, "ResolvConfPath": "/var/lib/docker/containers/9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa/resolv.conf", "HostnamePath": "/var/lib/docker/containers/9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa/hostname", "HostsPath": "/var/lib/docker/containers/9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa/hosts", "LogPath": "/var/lib/docker/containers/9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa/9a28a87274f471b47c39910724a5e2884b5043a0b33bf7beb3f3157cd27ad1aa-json.log", "Name": "/tender_almeida", "RestartCount": 0, "Driver": "devicemapper", "ExecDriver": "native-0.2", "MountLabel": "", "ProcessLabel": "", "Volumes": { "/c-dataFile01": "/var/lib/docker/volumes/ecbaf289768f52d0aa5357ad37c0c8588e82e6e8d320c37ec463512a631adfb6/_data", "/c-dataFile02": "/var/lib/docker/volumes/eeb5f75deed30c2798e8408d85cdaeb5e321cf5baf46e07da35004f58316bb32/_data", "/c-dataFile03": "/var/lib/docker/volumes/2e3e45108937e55a6fe713991c52271853bc1e7cf8fb74da001a7c3e081d9922/_data" }, "VolumesRW": { "/c-dataFile01": true, "/c-dataFile02": true, "/c-dataFile03": true }, "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LxcConf": [], "Memory": 0, "MemorySwap": 0, "CpuShares": 0, "CpuPeriod": 0, "CpusetCpus": "", "CpusetMems": "", "CpuQuota": 0, "BlkioWeight": 0, "OomKillDisable": false, "Privileged": false, "PortBindings": {}, "Links": null, "PublishAllPorts": false, "Dns": null, "DnsSearch": null, "ExtraHosts": null, "VolumesFrom": null, "Devices": [], "NetworkMode": "bridge", "IpcMode": "", "PidMode": "", "UTSMode": "", "CapAdd": null, "CapDrop": null, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "SecurityOpt": null, "ReadonlyRootfs": false, "Ulimits": null, "LogConfig": { "Type": "json-file", "Config": {} }, "CgroupParent": "" }, "Config": { "Hostname": "9a28a87274f4", "Domainname": "", "User": "", "AttachStdin": true, "AttachStdout": true, "AttachStderr": true, "PortSpecs": null, "ExposedPorts": null, "Tty": true, "OpenStdin": true, "StdinOnce": true, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "Image": "testimage01/centos", "Volumes": { "/c-dataFile01": {}, "/c-dataFile02": {}, "/c-dataFile03": {} }, "VolumeDriver": "", "WorkingDir": "", "Entrypoint": null, "NetworkDisabled": false, "MacAddress": "", "OnBuild": null, "Labels": { "org.label-schema.build-date": "20200611", "org.label-schema.license": "GPLv2", "org.label-schema.name": "CentOS Base Image", "org.label-schema.schema-version": "1.0", "org.label-schema.vendor": "CentOS" } } } ]View Code
檢視主機中是否有對應資料夾
第七步,測試,
在主機的共享資料夾中新增或修改檔案,是否能在對應的容器共享檔案(c-dataFile01,c-dataFile02,c-dataFile03)中看到
主機中新增檔案
容器中檢視
在容器的共享資料夾中(c-dataFile01,c-dataFile02,c-dataFile03)新增或修改檔案,是否能在對應的主機共享檔案中看到
請自己驗證
3.容器間傳遞共享
簡單的說就是,假設執行3個cento例項,這個3個例項的資料可以同等級的共享資料;
案例設計思路:
1.映象使用上一節我們自己build出來的 testimage01/centos,這個映象啟動後會自動建立3個共享的容器資料卷(c-dataFile01,c-dataFile02,c-dataFile03)
2.容器繼承體系為 centos01--》centos02--》centos03
3.每次容器執行後都在c-dataFile01裡面建立一個檔案,看是否都能共享
4.如果刪除centos02,分別在centos01和centos03中建立檔案,是否還是能共享
具體步驟:
第一步,啟動第一個容器,且命名為centos01,
並在資料卷c-dataFile01中建立test01-1.txt檔案
docker run -it --name centos01 testimage01/centos
第二步,啟動第二個容器,且命名為centos02,並且繼承自centos01,
並在資料卷c-dataFile01中建立test02-1.txt檔案,
docker run -it --name centos02 --volumes-from centos01 testimage01/centos
驗證:
在當前容器(centos02)檢視是否有容器centos01共享的test01-1.txt檔案;
進入centos01,檢視是否有centos02共享的test02-1.txt檔案;
第三步,啟動第三個容器,且命名為centos03,並且繼承自centos02,
並在資料卷c-dataFile01中建立test03-1.txt檔案
docker run -it --name centos03 --volumes-from centos02 testimage01/centos
驗證,三個容器中的資料是否都一樣,及都包括test01-1.txt、test02-1.txt、test03-1.txt檔案
在當前容器(centos03)檢視是否有容器centos01、centos02共享的test01-1.txt、test02-1.txt檔案;
進入centos01,檢視是否有容器centos02、centos03共享的test02-1.txt、test03-1.txt檔案;
進入centos02,檢視是否有容器centos01、centos03共享的test01-1.txt、test03-1.txt檔案;
第四步,停止並刪除容器centos02,在centos01、centos03分別建立檔案test01-2.txt、test03-2.txt
檢查是否仍然能共享
刪除容器centos02
centos01中
centos03中
完美!