注意細節html
「#」號開頭是註釋 ,指令不區分大小寫,順序執行node
FROM 指定基礎鏡像;注意必須是文件裏第一個非註釋行 ENV name 值 設置變量,注意沒有=號 變量引用 ${name:-chenxi} 假如變量爲空chenxi就是變量的默認值 [root@master ~]# echo ${name:-chenxi} chenxi
FROM 語法介紹mysql
FROM <指定docker鏡像名>[:<tag>] 標籤不加默認是latest FROM <指定docker鏡像名>@哈希碼
MAINTANIERlinux
MAINTANIER #做者的信息
LABEL語法web
LABEL 指定元數據信息 key=值 key=值
COPY 用於從docker 主機複製文件至建立的新鏡像文件語法redis
COPY 源文件或目錄 目標目錄 COPY ["源文件" "目標目錄"] 注意 路徑中有空白符一般使用第二個方法 文件複製準則 源文件必須是build上下文中的路徑,不能是其父目錄的文件 若是源是目錄,則其內部文件或者子目錄會被遞歸複製,但源目錄自身不會被複制 若是指定多個源文件,或者在指定源文件使用了通配符,則目標必須是個目錄,且以/結尾 若是目標不存在,它則會被自動建立,這包括其父目錄路徑
示例sql
[root@master docker]# cat Dockerfile FROM busybox COPY index.html /data/index.html [root@master docker]# echo "chwxxi" > index.html [root@master docker]# docker build -t chenxi:v01 ./ Sending build context to Docker daemon 3.072kB Step 1/2 : FROM busybox ---> 020584afccce Step 2/2 : COPY index.html /data/index.html ---> a39f70f77f61 Successfully built a39f70f77f61 Successfully tagged chenxi:v01 [root@master docker]# docker run --name cx --rm chenxi:v01 cat /data/index.html chwxxi
ADD 指令相似於COPY指令,支持使用tar文件和URL路徑語法docker
ADD 源文件 目標 ADD ["源文件" "目標文件"] 操做準則 若是源文件爲ULR切目標文件不以/結尾,則源文件指定的文件將被下載並直接建立爲目標文件 ;若是目標文件以/結尾,則文件名直接下載到目標/文件 若是源文件是本地文件系統上的壓縮格式的tar文件,它將被展開爲一個目錄,其行爲相似於tar -x 命令,然而經過ULR獲取的tar文件將不會被展開 若是<源文件>有多個,或其間接直接使用通配符,則目標文件必須是一個以/結尾的目錄路徑,若是目標文件不以/結尾的,則其是普通文件。源文件的內容將被直接寫入目標文件裏
示例json
[root@master docker]# cat Dockerfile FROM busybox COPY index.html /data/index.html ADD http://download.redis.io/releases/redis-5.0.7.tar.gz /data/ [root@master docker]# docker build -t redis:v01 ./ Sending build context to Docker daemon 1.988MB Step 1/3 : FROM busybox ---> 020584afccce Step 2/3 : COPY index.html /data/index.html ---> Using cache ---> a39f70f77f61 Step 3/3 : ADD http://download.redis.io/releases/redis-5.0.7.tar.gz /data/ Downloading [==================================================>] 1.984MB/1.984MB ---> 50adfdcc6117 Successfully built 50adfdcc6117 Successfully tagged redis:v01 [root@master docker]# docker run --name cx --rm redis:v01 ls /data/ index.html redis-5.0.7.tar.gz
示例-2centos
[root@master docker]# cat Dockerfile FROM busybox COPY index.html /data/index.html ADD redis-5.0.7.tar.gz /data/redis/ [root@master docker]# ls Dockerfile index.html redis-5.0.7.tar.gz [root@master docker]# docker build -t redis:v02 ./ Sending build context to Docker daemon 1.988MB Step 1/3 : FROM busybox ---> 020584afccce Step 2/3 : COPY index.html /data/index.html ---> Using cache ---> a39f70f77f61 Step 3/3 : ADD redis-5.0.7.tar.gz /data/redis/ ---> cbbee8a281ad Successfully built cbbee8a281ad Successfully tagged redis:v02 [root@master docker]# docker run --name cx --rm redis:v02 ls /data/redis redis-5.0.7
WORKDIR指定工做目錄
用於設定Dockerfil中全部的RUN、CMD、ENTRYPOINT、COPY和ADD設定工做目錄 WORKDIR 路徑
示例
[root@master docker]# cat Dockerfile FROM busybox COPY index.html /data/index.html WORKDIR /usr/local/src/ ADD redis-5.0.7.tar.gz ./ [root@master docker]# ls Dockerfile index.html redis-5.0.7.tar.gz [root@master docker]# docker build -t redis:v03 ./ Sending build context to Docker daemon 1.988MB Step 1/4 : FROM busybox ---> 020584afccce Step 2/4 : COPY index.html /data/index.html ---> Using cache ---> a39f70f77f61 Step 3/4 : WORKDIR /usr/local/src/ ---> Running in d2fca8af31a5 Removing intermediate container d2fca8af31a5 ---> 91323c9b4a85 Step 4/4 : ADD redis-5.0.7.tar.gz ./ ---> b2a20e26e004 Successfully built b2a20e26e004 Successfully tagged redis:v03 [root@master docker]# docker run --name cx --rm redis:v03 ls /usr/local/src/ redis-5.0.7
VOLUME 建立掛載點目錄
用於在鏡像裏建立一個掛載點目錄,用於掛着Dockre主機上的卷或其餘容器上的卷 VOLUME 目錄 若是掛載點目錄路徑下此文件存在,docker run 會在卷掛載完成後將此前文件複製到新卷裏
示例
[root@master docker]# cat Dockerfile FROM busybox COPY index.html /data/index.html WORKDIR /usr/local/src/ ADD redis-5.0.7.tar.gz ./ VOLUME /data/mysql/ [root@master docker]# docker build -t mysql:v01 ./ Sending build context to Docker daemon 1.988MB Step 1/5 : FROM busybox ---> 020584afccce Step 2/5 : COPY index.html /data/index.html ---> Using cache ---> a39f70f77f61 Step 3/5 : WORKDIR /usr/local/src/ ---> Using cache ---> 91323c9b4a85 Step 4/5 : ADD redis-5.0.7.tar.gz ./ ---> Using cache ---> b2a20e26e004 Step 5/5 : VOLUME /data/mysql/ ---> Running in 8e97168b8a38 Removing intermediate container 8e97168b8a38 ---> 36ae8d2ba3b7 Successfully built 36ae8d2ba3b7 Successfully tagged mysql:v01 [root@master docker]# docker run --name cx --rm mysql:v01 mount | grep /data/mysql /dev/mapper/centos-root on /data/mysql type xfs (rw,relatime,attr2,inode64,noquota) EXPOSE 指令 用於爲容器打開指定要監聽端口已實現與外部通訊一次能夠暴露多個端口 語法 EXPOSE 11211/tcp 11211/udp 示例 [root@master docker]# cat Dockerfile FROM busybox COPY index.html /data/index.html WORKDIR /usr/local/src/ ADD redis-5.0.7.tar.gz ./ VOLUME /data/mysql/ EXPOSE 80/tcp [root@master docker]# docker build -t http:v.01 ./ Sending build context to Docker daemon 1.988MB Step 1/6 : FROM busybox ---> 020584afccce Step 2/6 : COPY index.html /data/index.html ---> Using cache ---> a39f70f77f61 Step 3/6 : WORKDIR /usr/local/src/ ---> Using cache ---> 91323c9b4a85 Step 4/6 : ADD redis-5.0.7.tar.gz ./ ---> Using cache ---> b2a20e26e004 Step 5/6 : VOLUME /data/mysql/ ---> Using cache ---> 36ae8d2ba3b7 Step 6/6 : EXPOSE 80/tcp ---> Running in be421f20d0e8 Removing intermediate container be421f20d0e8 ---> 578864a06f74 Successfully built 578864a06f74 Successfully tagged http:v.01 [root@master docker]# docker run --name web --rm http:v.01 /bin/httpd -h /data -f -f是前臺運行 [root@master ~]# docker inspect web [ { "Id": "c6d225297b350edc4a58102d61fcdaa823b3e08892b52f397b64acf02acb1be0", "Created": "2019-11-23T02:33:08.788432916Z", "Path": "/bin/httpd", "Args": [ "-h", "/data", "-f" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 10800, "ExitCode": 0, "Error": "", "StartedAt": "2019-11-23T02:33:09.391066632Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:578864a06f740fe342194424148a0ec1b77f942c254b6442bc7a5c8af4ae4546" , "ResolvConfPath": "/var/lib/docker/containers/c6d225297b350edc4a58102d61fcdaa823b3 e08892b52f397b64acf02acb1be0/resolv.conf", "HostnamePath": "/var/lib/docker/containers/c6d225297b350edc4a58102d61fcdaa823b3e0 8892b52f397b64acf02acb1be0/hostname", "HostsPath": "/var/lib/docker/containers/c6d225297b350edc4a58102d61fcdaa823b3e0889 2b52f397b64acf02acb1be0/hosts", "LogPath": "/var/lib/docker/containers/c6d225297b350edc4a58102d61fcdaa823b3e08892b 52f397b64acf02acb1be0/c6d225297b350edc4a58102d61fcdaa823b3e08892b52f397b64acf02acb1be0-json.log", "Name": "/web", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "default", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": true, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Capabilities": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "private", "Cgroup": "", "Links": null, "OomScoreAdj": 0, "PidMode": "", "Privileged": false, "PublishAllPorts": false, "ReadonlyRootfs": false, "SecurityOpt": null, "UTSMode": "", "UsernsMode": "", "ShmSize": 67108864, "Runtime": "runc", "ConsoleSize": [ 0, 0 ], "Isolation": "", "CpuShares": 0, "Memory": 0, "NanoCpus": 0, "CgroupParent": "", "BlkioWeight": 0, "BlkioWeightDevice": [], "BlkioDeviceReadBps": null, "BlkioDeviceWriteBps": null, "BlkioDeviceReadIOps": null, "BlkioDeviceWriteIOps": null, "CpuPeriod": 0, "CpuQuota": 0, "CpuRealtimePeriod": 0, "CpuRealtimeRuntime": 0, "CpusetCpus": "", "CpusetMems": "", "Devices": [], "DeviceCgroupRules": null, "DeviceRequests": null, "KernelMemory": 0, "KernelMemoryTCP": 0, "MemoryReservation": 0, "MemorySwap": 0, "MemorySwappiness": null, "OomKillDisable": false, "PidsLimit": null, "Ulimits": null, "CpuCount": 0, "CpuPercent": 0, "IOMaximumIOps": 0, "IOMaximumBandwidth": 0, "MaskedPaths": [ "/proc/asound", "/proc/acpi", "/proc/kcore", "/proc/keys", "/proc/latency_stats", "/proc/timer_list", "/proc/timer_stats", "/proc/sched_debug", "/proc/scsi", "/sys/firmware" ], "ReadonlyPaths": [ "/proc/bus", "/proc/fs", "/proc/irq", "/proc/sys", "/proc/sysrq-trigger" ] }, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/7bf24b175acfc5ffff3ddd52aaf9b715ecd2 715da94798e3f0de3cccaf1cef2d-init/diff:/var/lib/docker/overlay2/cd4704ddb683f96a444128da1b375308e61739968544717bc0fb4cc25df3408f/diff:/var/lib/docker/overlay2/98dd3838dda54c72e44f932f27b3e6b838fe11093083391d265042c840adceed/diff:/var/lib/docker/overlay2/56bd207136154521127d96aabbd7823be2334cc15e3ed271396aca6e6ad58de0/diff:/var/lib/docker/overlay2/5cad835aa43c37ba0d434e3775feeb06fe1759f8749d4e8081f186d805b0ad8e/diff", "MergedDir": "/var/lib/docker/overlay2/7bf24b175acfc5ffff3ddd52aaf9b715ecd 2715da94798e3f0de3cccaf1cef2d/merged", "UpperDir": "/var/lib/docker/overlay2/7bf24b175acfc5ffff3ddd52aaf9b715ecd2 715da94798e3f0de3cccaf1cef2d/diff", "WorkDir": "/var/lib/docker/overlay2/7bf24b175acfc5ffff3ddd52aaf9b715ecd27 15da94798e3f0de3cccaf1cef2d/work" }, "Name": "overlay2" }, "Mounts": [ { "Type": "volume", "Name": "b855f89205224a970e2a02c5e6404aba57c1774c363256a33c88b14d8304dd35" , "Source": "/var/lib/docker/volumes/b855f89205224a970e2a02c5e6404aba57c1774 c363256a33c88b14d8304dd35/_data", "Destination": "/data/mysql", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ], "Config": { "Hostname": "c6d225297b35", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": true, "AttachStderr": true, "ExposedPorts": { "80/tcp": {} }, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/httpd", "-h", "/data", "-f" ], "Image": "http:v.01", "Volumes": { "/data/mysql/": {} }, "WorkingDir": "/usr/local/src", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "NetworkSettings": { "Bridge": "", "SandboxID": "32d53eb902a2b797942ad31bf990220c0c63dc62c6397ac87beb5c1d6dae503f ", "HairpinMode": false, "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "Ports": { "80/tcp": null }, "SandboxKey": "/var/run/docker/netns/32d53eb902a2", "SecondaryIPAddresses": null, "SecondaryIPv6Addresses": null, "EndpointID": "0bf9b2b05bc76b526798b2334957c4a9fb2a279c449e25a8bfef974d578fa3c 7", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "MacAddress": "02:42:ac:11:00:02", "Networks": { "bridge": { "IPAMConfig": null, "Links": null, "Aliases": null, "NetworkID": "20670e48b3f87b53f0426998127e8fd0658e61e8e01ace3bf7cb041a ad5bd427", "EndpointID": "0bf9b2b05bc76b526798b2334957c4a9fb2a279c449e25a8bfef974 d578fa3c7", "Gateway": "172.17.0.1", "IPAddress": "172.17.0.2", IP "IPPrefixLen": 16, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02", "DriverOpts": null } } } } ] [root@master ~]# curl 172.17.0.2 chwxxi [root@master docker]# docker run --name web -P --rm http:v.01 /bin/httpd -h /data -f -P 隨機在docker主機上暴露一個端口 [root@master docker]# docker port web 80/tcp -> 0.0.0.0:32768 [root@slave1 ~]# curl 192.168.10.5:32768 chwxxi
ENV 設置環境變量
用於爲鏡像定義所需的環境變量,並被Dockerfile文件中位於其後指令所調用 調用格式 $name 定義格式 ENV name 值 或者 name = 值 第一個只能設置一個變量,第二個能夠同時設置多個變量
示例
[root@master docker]# cat Dockerfile FROM busybox ENV DOCKER_ROOT=/data/index.html COPY index.html $DOCKER_ROOT WORKDIR /usr/local/src/ ADD redis-5.0.7.tar.gz ./ VOLUME /data/mysql/ EXPOSE 80/tcp [root@master docker]# docker build -t http:v.02 ./ Sending build context to Docker daemon 1.988MB Step 1/7 : FROM busybox ---> 020584afccce Step 2/7 : ENV DOCKER_ROOT=/data/index.html ---> Running in c36156ec361f Removing intermediate container c36156ec361f ---> b9a06f515829 Step 3/7 : COPY index.html $DOCKER_ROOT ---> d9ddba9390da Step 4/7 : WORKDIR /usr/local/src/ ---> Running in 7c7c7843262e Removing intermediate container 7c7c7843262e ---> 5bcade248353 Step 5/7 : ADD redis-5.0.7.tar.gz ./ ---> 53d3ffc442eb Step 6/7 : VOLUME /data/mysql/ ---> Running in a0fefc923333 Removing intermediate container a0fefc923333 ---> cae7c094e37d Step 7/7 : EXPOSE 80/tcp ---> Running in 5f1721b1e675 Removing intermediate container 5f1721b1e675 ---> d15cd197fe0a Successfully built d15cd197fe0a Successfully tagged http:v.02 [root@master docker]# docker run --name web --rm http:v.02 cat /data/index.html chwxxi [root@master docker]# docker run --name web --rm http:v.02 printenv PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=0f82ee34454c DOCKER_ROOT=/data/index.html HOME=/root
RUN 是構建鏡像過程是運行的命令
RUN 指令介紹 用於指定docker build過程當中運行的程序,能夠任何命令 RUN 命令 或 RUN [命令,參數] 第一種格式中,是shll 的命令。且以"/bash/sh -c"來運行它,這就意味着詞進程在容器裏PID不能爲1,不能接受Unix信號,當使用docker stop 命令中止時此進程不會接受SIGTERM信號的 第二種格式中的參數是一個JSON格式的數組,命令後面跟的參數,不能使用通配符
CMD指定容器默認啓動時的命令程序;
ENTRYPOINT
相似CMD指令的功能,用於爲容器指定默認的運行程序,從而使容器像是一個單獨的可執行的程序 與CMD不一樣的是,有ENTRYPOINT啓動的程序不會被docker run 命令指定的參數覆蓋,並且這些命令行參數會被當作參數傳遞給ENTRYPOINT指定的程序的;不過docker run 有--entrypoint選項參數能夠覆蓋ENTRYPOINT指定的程序的 格式 ENTRYPOINT 命令 docker run 命令傳入的參數會覆蓋CMD指令的內容而且附加到ENIRYPOINT命令最後做爲參數使用 使用「「」」
HEALTHCHECK檢查容器是否健康
HEALTHCHECK 語法 --interval=數字m 默認30秒 每隔多久檢測一次 --timeout=數字m 默認30秒 檢測時超時時間 --start-period=數字m 默認0秒 容器啓動會多久檢測 --retries=數字 檢測幾回失敗後定爲失敗 CMD 檢測命令 HEALTHECK --interval=數字m --timeout=數字m --retries=數字 CMD curl -f http://IP||exit 1