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中

 完美!

系统化学习docker教程:

https://www.cnblogs.com/newAndHui/p/13508771.html

posted @ 2020-08-23 16:41  李东平|一线码农  阅读(264)  评论(0编辑  收藏  举报