自制鏡像:
基於dockerfile文件制作鏡像使用
Dockerfile中可以用到的環境變量
${variable_name}
變量替換的特殊格式
如果這個變量未初始化,或者有這個變量但是值為空,這表示我要引用的是word這個字串所表示的內容。
與-號相反,變量有值就替換變量,為空就不做操作
${variable:-word}示例
[root@localhost ~]# echo ${NAME:-tom}
tom
[root@localhost ~]# NAME=jerry
[root@localhost ~]# echo ${NAME:-tom}
jerry
${variable:+word示例
[root@localhost ~]# echo $NAME
jerry
[root@localhost ~]# echo ${NAME:+tom}
tom
[root@localhost ~]# unset NAME
[root@localhost ~]# echo ${NAME:+tom}
[root@localhost ~]# echo $NAME
Dockerfile詳解
[root@localhost ~]# mkdir img1
[root@localhost ~]# cd img1/
[root@localhost img1]# vi Dockerfile
文件名的首字母必須為大寫
復制於百衲本
FROM:指定基礎鏡像,必須為第一個命令
MAINTAINER: 維護者信息,還可以使用LABEL指定各種元格式指定maintainer
COPY:功能類似ADD,但是是不會自動解壓文件,也不能訪問網絡資源
ADD:將本地文件添加到容器中,tar類型文件會自動解壓(網絡壓縮資源不會被解壓),可以訪問網絡資源,類似wget
WORKDIR:工作目錄,類似於cd命令
VOLUME :用於指定持久化目錄(指定卷,注意在dockerfile中只能指定基於docker管理的卷)
EXPOSE:用於為容器打開指定要監聽的端口以實現與外部通信
ENV:設置環境變量,用於為鏡像定義所需的環境變量,並可被dockerfile文件中位於其后的其他指令所調用
RUN:構建鏡像時執行的命令
CMD:構建容器后調用,也就是在容器啟動時才進行調用
ENTRYPOINT:配置容器,使其可執行化。配合CMD可省去"application",只使用參數
USER:指定運行容器時的用戶名或 UID,后續的 RUN 也會使用指定用戶。使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。當服務不需要管理員權限時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶**
HEALTHCHECK:健康檢查
ARG:用於指定傳遞給構建運行時的變量
FROM
FROM指令是最重要的一個且必須為Dockerfile文件開篇的第一個非注釋行,用於為映像文件構建過程指定基准鏡像,后續的指令運行於此基准鏡像所提供的運行環境實踐中,基准鏡像可以是任何可用鏡像文件,默認情況下,docker build會在docker主機上查找指定的鏡像文件,在其不存在時,則會從docker Hub Registry上拉取所需的鏡像文件
格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
示例:
FROM mysql:5.6
注:
tag或digest是可選的,如果不使用這兩個值時,會使用latest版本的基礎鏡像
MAINTAINER: 維護者信息
格式:
MAINTAINER <name>
示例:
MAINTAINER Jasper Xu
MAINTAINER sorex@163.com
MAINTAINER Jasper Xu <sorex@163.com>
LABEL
指定各種元數據。
LABEL maintainer=“MageEdu <mageNAME <docker@keji.com>>”
COPY
用於從Docker主機復制文件至創建的新映像文件
格式:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"] 用於支持包含空格的路徑
<src>:要復制的源文件或目錄,支持使用通配符
<dest>:目標路徑,即正在創建的image的文件系統路徑;建議為<dest>使用絕對路徑,否則,COPY指定則以WORKDIR為其起始路徑;
注意:在路徑中有空白字符時,通常使用第二種格式
文件復制准則
<src>必須是build上下文中的路徑,不能是其父目錄中的文件
如果<src>是目錄,則其內部文件或子目錄會被遞歸復制,但<src>目錄自身不會被復制
如果指定了多個<src>,或在<src>中使用了通配符,則<dest>必須是一個目錄,且必須以/結尾
如果<dest>事先不存在,他將會被自動創建,這包括其父目錄路徑
copy文件
[root@localhost ~]# mkdir img1
[root@localhost ~]# cd img1/
[root@localhost img1]# vi Dockerfile
文件名的首字母必須為大寫
# Description: test image
FROM busybox:latest
MAINTAINER "NAME <docker@keji.com>"
#LABEL maintainer=“MageEdu <mageNAME <docker@keji.com>>”
COPY index.html /data/web/html/index.html
~
index.html此文件需在Dockerfile文件同目錄中
創建文件
[root@localhost img1]# vi index.html
<h1>Busybox httpd server.</h1>
[root@localhost img1]# ls
Dockerfile index.html
創建鏡像
docker build
[root@localhost img1]# docker build -t tinyhttpd:v0.0-1 ./
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM busybox:latest
---> 19485c79a9bb
Step 2/3 : MAINTAINER "NAME<docker@keji.com>"
---> Running in 2057d1f2731e
Removing intermediate container 2057d1f2731e
---> c98bfa70ce79
Step 3/3 : COPY index.html /data/web/html/index.html
---> ebd7af0b04b2
Successfully built ebd7af0b04b2
Successfully tagged tinyhttpd:v0.0-1
[root@localhost img1]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tinyhttpd v0.0-1 ebd7af0b04b2 About a minute ago 1.22MB
-t 表示指定標簽
copy目錄
[root@localhost ~]# mkdir imgl
[root@localhost ~]# cd imgl/
[root@localhost imgl]# vi Dockerfile
# Description: test image
FROM busybox:latest
LABEL maintainer "NAME <docker@keji.com>"
COPY yum.repos.d /etc/yum.repos.d/
~
創建目錄在與Dockerfile同目錄
[root@localhost imgl]# cp -r /etc/yum.repos.d/ ./yum.repos.d
[root@localhost imgl]# ls
Dockerfile yum.repos.d
docker build制作鏡像
[root@localhost imgl]# docker build -t tinyhttpd:v0.1-1 ./
Sending build context to Docker daemon 21.5kB
Step 1/3 : FROM busybox:latest
---> 19485c79a9bb
Step 2/3 : LABEL maintainer "NAME <docker@keji.com>"
---> Running in 879242f88631
Removing intermediate container 879242f88631
---> 0f768995dae1
Step 3/3 : COPY yum.repos.d /etc/yum.repos.d/
---> 626da90932c0
Successfully built 626da90932c0
Successfully tagged tinyhttpd:v0.1-1
[root@localhost imgl]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tinyhttpd v0.1-1 626da90932c0 5 seconds ago 1.23MB
啟動鏡像並驗證
[root@localhost imgl]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-1 ls /etc/yum.repos.d
CentOS-Base.repo
CentOS-CR.repo
CentOS-Debuginfo.repo
CentOS-Media.repo
CentOS-Sources.repo
CentOS-Vault.repo
CentOS-fasttrack.repo
docker-ce.repo
ADD
向目標鏡像中打包文件
[root@localhost imgl]# vi Dockerfile
# Description: test image
FROM busybox:latest
LABEL maintainer "NAME <docker@keji.com>"
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
制造鏡像
[root@localhost imgl]# docker build -t tinyhttpd:v0.1-3 ./
Sending build context to Docker daemon 21.5kB
Step 1/4 : FROM busybox:latest
---> 19485c79a9bb
Step 2/4 : LABEL maintainer "NAME <docker@keji.com>"
---> Using cache
---> 0f768995dae1
Step 3/4 : COPY yum.repos.d /etc/yum.repos.d/
---> Using cache
---> 626da90932c0
Step 4/4 : ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
Downloading [==================================================>] 1.035MB/1.035MB
---> 145383f48613
Successfully built 145383f48613
Successfully tagged tinyhttpd:v0.1-3
[root@localhost imgl]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-3 ls /usr/local/src
nginx-1.17.3.tar.gz
啟動容器並驗證
[root@localhost imgl]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-3 ls /usr/local/src
nginx-1.17.3.tar.gz
[root@localhost imgl]# wget http://nginx.org/download/nginx-1.17.3.tar.gz
--2019-09-14 21:25:53-- http://nginx.org/download/nginx-1.17.3.tar.gz
正在解析主機 nginx.org (nginx.org)... 62.210.92.35, 95.211.80.227, 2001:1af8:4060:a004:21::e3
正在連接 nginx.org (nginx.org)|62.210.92.35|:80... 已連接。
已發出 HTTP 請求,正在等待回應... 200 OK
長度:1034586 (1010K) [application/octet-stream]
正在保存至: “nginx-1.17.3.tar.gz”
100%[=========================================================================================>] 1,034,586 6.40KB/s 用時 2m 16s
2019-09-14 21:28:12 (7.43 KB/s) - 已保存 “nginx-1.17.3.tar.gz” [1034586/1034586])
[root@localhost imgl]# ls
Dockerfile nginx-1.17.3.tar.gz yum.repos.d
[root@localhost imgl]# vi Dockerfile
# Description: test image
FROM busybox:latest
LABEL maintainer "NAME <docker@keji.com>"
COPY yum.repos.d /etc/yum.repos.d/
# ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
ADD nginx-1.17.3.tar.gz /usr/local/src/
~
制作鏡像
[root@localhost imgl]# docker build -t tinyhttpd:v0.1-4 ./
Sending build context to Docker daemon 1.057MB
Step 1/4 : FROM busybox:latest
---> 19485c79a9bb
Step 2/4 : LABEL maintainer "NAME <docker@keji.com>"
---> Using cache
---> 0f768995dae1
Step 3/4 : COPY yum.repos.d /etc/yum.repos.d/
---> Using cache
---> 626da90932c0
Step 4/4 : ADD nginx-1.17.3.tar.gz /usr/local/src/
---> f5bd86111d4e
Successfully built f5bd86111d4e
Successfully tagged tinyhttpd:v0.1-4
[root@localhost imgl]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tinyhttpd v0.1-4 f5bd86111d4e 9 seconds ago 7.45MB
啟動容器並驗證
[root@localhost imgl]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-4 ls /usr/local/src
nginx-1.17.3
[root@localhost imgl]# docker run --name tinyweb1 --rm tinyhttpd:v0.1-4 ls /usr/local/src/nginx-1.17.3
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
WORKDIR
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (這時工作目錄為/a)
WORKDIR b (這時工作目錄為/a/b)
WORKDIR c (這時工作目錄為/a/b/c)
注:
通過WORKDIR設置工作目錄后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會在該目錄下執行。在使用docker run運行容器時,可以通過-w參數覆蓋構建時所設置的工作目錄。
VOLUME 格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
一個卷可以存在於一個或多個容器的指定目錄,該目錄可以繞過聯合文件系統,並具有以下功能:
卷可以容器間共享和重用
容器並不一定要和其它容器共享卷
修改卷后會立即生效
對卷的修改不會對鏡像產生影響
卷會一直存在,直到沒有任何容器在使用它
[root@localhost imgl]# vi Dockerfile
# Description: test image
FROM busybox:latest
LABEL maintainer "NAME <docker@keji.com>"
COPY yum.repos.d /etc/yum.repos.d/
# ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
ADD nginx-1.17.3.tar.gz /usr/local/src/
VOLUME /data/mysql
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"
注:
一個卷可以存在於一個或多個容器的指定目錄,該目錄可以繞過聯合文件系統,並具有以下功能:
卷可以容器間共享和重用
容器並不一定要和其它容器共享卷
修改卷后會立即生效
對卷的修改不會對鏡像產生影響
卷會一直存在,直到沒有任何容器在使用它
[root@localhost imgl]# vi Dockerfile
# Description: test image
FROM busybox:latest
LABEL maintainer "NAME <docker@keji.com>"
COPY yum.repos.d /etc/yum.repos.d/
# ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
ADD nginx-1.17.3.tar.gz /usr/local/src/
VOLUME /data/mysql
制作鏡像
[root@localhost imgl]# docker build -t tinyhttpd:v0.1-5 ./
Step 1/5 : FROM busybox:latest
---> 19485c79a9bb
Step 2/5 : LABEL maintainer "NAME <docker@keji.com>"
---> Using cache
---> 0f768995dae1
Step 3/5 : COPY yum.repos.d /etc/yum.repos.d/
---> Using cache
---> 626da90932c0
Step 4/5 : ADD nginx-1.17.3.tar.gz /usr/local/src/
---> Using cache
---> f5bd86111d4e
Step 5/5 : VOLUME /data/mysql
---> Running in dc15cb73e8a9
Removing intermediate container dc15cb73e8a9
---> c75c81aed62b
Successfully built c75c81aed62b
Successfully tagged tinyhttpd:v0.1-5
啟動容器並驗證
[root@localhost imgl]# docker run --name tinyweb1 -it --rm tinyhttpd:v0.1-5
/ #
在另外終端查看
[root@localhost ~]# docker inspect tinyweb1
"Mounts": [
{
"Source": "/var/lib/docker/volumes/a758fa7908a75168cc68b772deb1cb8693a167039ee0757f8853c0b0095be7ef/_data",
"Destination": "/data/mysql",
}
],
EXPOSE
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注:
EXPOSE並不會讓容器的端口訪問到主機。要使其可訪問,需要在docker run運行容器時通過-p來發布這些端口,或通過-P參數來發布EXPOSE導出的所有端口
鏡像中指定的是待暴露的端口是隱藏的,需要加上大寫的-P選項,也可以自定義
dockerfile
[root@localhost imgl]# vi Dockerfile
# Description: test image
FROM busybox:latest
LABEL maintainer "NAME <docker@keji.com>"
COPY index.html /data/web/index.html
COPY yum.repos.d /etc/yum.repos.d/
# ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
ADD nginx-1.17.3.tar.gz /usr/local/src/
VOLUME /data/mysql
EXPOSE 80/tcp
~
暴露80端口默認是tcp協議,copy了一個網頁進行驗證,需要於Dockerfile同目錄,或同目錄下的子目錄
制作鏡像
[root@localhost imgl]# docker build -t tinyhttpd:v0.1-7 ./
Sending build context to Docker daemon 1.058MB
Step 1/7 : FROM busybox:latest
---> 19485c79a9bb
Step 2/7 : LABEL maintainer "NAME <docker@keji.com>"
---> Using cache
---> 0f768995dae1
Step 3/7 : COPY index.html /data/web/index.html
---> Using cache
---> 8521e27a3994
Step 4/7 : COPY yum.repos.d /etc/yum.repos.d/
---> Using cache
---> 9febae27cad9
Step 5/7 : ADD nginx-1.17.3.tar.gz /usr/local/src/
---> Using cache
---> a0519d8ae3e2
Step 6/7 : VOLUME /data/mysql
---> Using cache
---> e6760563c20f
Step 7/7 : EXPOSE 80/tcp
---> Using cache
---> b2d39a1470a1
Successfully built b2d39a1470a1
Successfully tagged tinyhttpd:v0.1-7
[root@localhost imgl]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tinyhttpd v0.1-6 b2d39a1470a1 13 minutes ago 7.45MB
tinyhttpd v0.1-7 b2d39a1470a1 13 minutes ago 7.45MB
運行並驗證
[root@localhost imgl]# docker run --name httpdweb --rm -P tinyhttpd:v0.1-7 /bin/httpd -f -h /data/web
-P 暴露默認端口
-f 運行在前端
-h 指定家目錄
[root@localhost ~]# docker port httpdweb
80/tcp -> 0.0.0.0:32770
http://10.192.45.116:32768/
ENV
格式:
ENV <key> <value> #<key>之后的所有內容均會被視為其<value>的組成部分,因此,一次只能設置一個變量
ENV <key>=<value> ... #可以設置多個變量,每個變量為一個"<key>=<value>"的鍵值對,如果<key>中包含空格,可以使用\來進行轉義,也可以通過""來進行標示;另外,反斜線也可以用於續行
示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat=fluffy
dockerfile
# Description: test image
FROM busybox:latest
LABEL maintainer "NAME <docker@keji.com>"
ENV DOC_ROOT=/data/web/ \
WEB_SERVER_PACKAGE="nginx-1.17.3"
COPY index.html ${DOC_ROOT:-/data/web/}
COPY yum.repos.d /etc/yum.repos.d/
WORKDIR /usr/local/
# ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
VOLUME /data/mysql
EXPOSE 80/tcp
制作鏡像
[root@localhost imgl]# docker build -t tinyhttpd:v0.1-8 ./
Sending build context to Docker daemon 1.058MB
Step 1/9 : FROM busybox:latest
---> 19485c79a9bb
Step 2/9 : LABEL maintainer "NAME <docker@keji.com>"
---> Using cache
---> 0f768995dae1
Step 3/9 : ENV DOC_ROOT=/data/web/ WEB_SERVER_PACKAGE="nginx-1.17.3"
---> Running in d976bf7233c8
Removing intermediate container d976bf7233c8
---> 71dc4801559c
Step 4/9 : COPY index.html ${DOC_ROOT:-/data/web/}
---> dab455e62922
Step 5/9 : COPY yum.repos.d /etc/yum.repos.d/
---> 30c10785b714
Step 6/9 : WORKDIR /usr/local/
---> Running in 76a92f61a2ae
Removing intermediate container 76a92f61a2ae
---> 644c7b723bda
Step 7/9 : ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
---> 1d16cc6a864f
Step 8/9 : VOLUME /data/mysql
---> Running in 704a53c80b1b
Removing intermediate container 704a53c80b1b
---> 73ea028f2145
Step 9/9 : EXPOSE 80/tcp
---> Running in e683b674553a
Removing intermediate container e683b674553a
---> 73e4840154b7
Successfully built 73e4840154b7
Successfully tagged tinyhttpd:v0.1-8
[root@localhost imgl]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tinyhttpd v0.1-8 73e4840154b7 About a minute ago 7.45MB
運行並驗證
[root@localhost imgl]# docker run --name tinyweb --rm -P tinyhttpd:v0.1-8 ls /data/web/
index.html
[root@localhost imgl]# docker run --name tinyweb --rm -P tinyhttpd:v0.1-8 ls /usr/local/src/nginx-1.17.3
CHANGES
CHANGES.ru
LICENSE
README
auto
conf
configure
contrib
html
man
src
-e選項在鏡像運行為容器的時候,指定環境變量
[root@localhost imgl]# docker run --name tinyweb --rm -P tinyhttpd:v0.1-8 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=6e5e5ba21ac4
DOC_ROOT=/data/web/
WEB_SERVER_PACKAGE=nginx-1.17.3
HOME=/root
[root@localhost imgl]# docker run --name tinyweb --rm -P -e WEB_SERVER_PACKAGE="1.17.1" tinyhttpd:v0.1-8 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=0764df783724
WEB_SERVER_PACKAGE=1.17.1
DOC_ROOT=/data/web/
HOME=/root
printenv 顯示環境變量
RUN
RUN用於在鏡像容器中執行命令,其有以下兩種命令執行方式:
shell執行
格式:
RUN <command>
exec執行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"]
RUN apk update
RUN ["/etc/execfile", "arg1", "arg1"]
注:
RUN指令創建的中間鏡像會被緩存,並會在下次構建中使用。如果不想使用這些緩存鏡像,可以在構建時指定--no-cache參數,如:docker build --no-cache
基於基礎鏡像執行,在操作時評估好基礎鏡像的能力
注意:json數組中,要使用雙引號
示例
# Description: test image
FROM busybox:latest
LABEL maintainer "NAME <docker@keji.com>"
ENV DOC_ROOT=/data/web/ \
WEB_SERVER_PACKAGE="nginx-1.17.3"
COPY index.html ${DOC_ROOT:-/data/web/}
COPY yum.repos.d /etc/yum.repos.d/
WORKDIR /usr/local/
ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
# ADD ${WEB_SERVER_PACKAGE}.tar.gz ./src/
VOLUME /data/mysql
EXPOSE 80/tcp
RUN cd /usr/local/src&& \
tar xf ${WEB_SERVER_PACKAGE}.tar.gz
~
制作鏡像
[root@localhost imgl]# docker build -t tinyhttpd:v0.1-10 ./
Sending build context to Docker daemon 1.058MB
Step 1/10 : FROM busybox:latest
---> 19485c79a9bb
Step 2/10 : LABEL maintainer "NAME <docker@keji.com>"
---> Using cache
---> 0f768995dae1
Step 3/10 : ENV DOC_ROOT=/data/web/ WEB_SERVER_PACKAGE="nginx-1.17.3"
---> Using cache
---> 71dc4801559c
Step 4/10 : COPY index.html ${DOC_ROOT:-/data/web/}
---> Using cache
---> dab455e62922
Step 5/10 : COPY yum.repos.d /etc/yum.repos.d/
---> Using cache
---> 30c10785b714
Step 6/10 : WORKDIR /usr/local/
---> Using cache
---> 644c7b723bda
Step 7/10 : ADD http://nginx.org/download/nginx-1.17.3.tar.gz /usr/local/src/
Downloading [==================================================>] 1.035MB/1.035MB
---> Using cache
---> 44bafbe3806f
Step 8/10 : VOLUME /data/mysql
---> Using cache
---> 6e1c6d12fbf0
Step 9/10 : EXPOSE 80/tcp
---> Using cache
---> 27a046c4a773
Step 10/10 : RUN cd /usr/local/src&& tar xf ${WEB_SERVER_PACKAGE}.tar.gz
---> Running in e97e7b13b137
Removing intermediate container e97e7b13b137
---> 60184a9e0e89
Successfully built 60184a9e0e89
Successfully tagged tinyhttpd:v0.1-10
運行並驗證
[root@localhost imgl]# docker run --name tinyweb --rm -P -e WEB_SERVER_PACKAGE="1.17.1" -it tinyhttpd:v0.1-10
/usr/local # cd src/
/usr/local/src # ls
nginx-1.17.3 nginx-1.17.3.tar.gz
CMD
格式:
CMD ["executable","param1","param2"] (執行可執行文件,優先)
CMD ["param1","param2"] (設置了ENTRYPOINT,則直接調用ENTRYPOINT添加參數)
CMD command param1 param2 (執行shell內部命令)
示例:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
注:
CMD不同於RUN,CMD用於指定在容器啟動時所要執行的命令,而RUN用於指定鏡像構建時所要執行的命令。
dockerfile
[root@localhost ~]# mkdir img2
[root@localhost ~]# cd img2
[root@localhost img2]# vi Dockerfile
FROM busybox
LABEL maintainer="NAME <docker@keji.com>" app="httpd"
ENV WEB_DOC_ROOT="/data/web/html"
RUN mkdir -p $WEB_DOC_ROOT && \
echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
創建鏡像
[root@localhost img2]# docker build -t tinyhttpd:v0.2.1 ./
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM busybox
---> 19485c79a9bb
Step 2/5 : LABEL maintainer="NAME <docker@keji.com>" app="httpd"
---> Running in dfd6762f6978
Removing intermediate container dfd6762f6978
---> f0cd456477dd
Step 3/5 : ENV WEB_DOC_ROOT="/data/web/html"
---> Running in 3f13bb25c496
Removing intermediate container 3f13bb25c496
---> 12393ad7a5e6
Step 4/5 : RUN mkdir -p $WEB_DOC_ROOT && echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html
---> Running in 94982e844a96
Removing intermediate container 94982e844a96
---> 84fa7d468dc4
Step 5/5 : CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
---> Running in 818d47fd2c75
Removing intermediate container 818d47fd2c75
---> 1d1dbe0f701c
Successfully built 1d1dbe0f701c
Successfully tagged tinyhttpd:v0.2.1
[root@localhost img2]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tinyhttpd v0.2.1 1d1dbe0f701c 23 seconds ago 1.22MB
運行並驗證
[root@localhost img2]# docker run --name tinyweb2 -it --rm tinyhttpd:v0.2.1
[root@localhost imgl]# docker exec -it tinyweb2 /bin/sh
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/httpd -f -h /data/web/html
6 root 0:00 /bin/sh
11 root 0:00 ps
/ # printenv
WEB_DOC_ROOT=/data/web/html
HOSTNAME=b378518b9b00
SHLVL=1
HOME=/root
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
init第一個進程不是bash而是/bin/httpd
[root@localhost imgl]# docker inspect tinyweb2
"Cmd": [
"/bin/sh",
"-c",
"/bin/httpd -f -h ${WEB_DOC_ROOT}"
ENTRYPOINT
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可執行文件, 優先)
ENTRYPOINT command param1 param2 (shell內部命令)
示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]
注:
ENTRYPOINT與CMD非常類似,不同的是通過docker run執行的命令不會覆蓋ENTRYPOINT,而docker run命令中指定的任何參數,都會被當做參數再次傳遞給ENTRYPOINT。Dockerfile中只允許有一個ENTRYPOINT命令,多指定時會覆蓋前面的設置,而只執行最后的ENTRYPOINT指令。
dockerfile
[root@localhost ~]# mkdir img3
[root@localhost ~]# cd img3
[root@localhost ~]# vi Dockerfile
FROM nginx:1.14-alpine
LABEL maintainer="NAME <docker@keji.com>"
ENV NGX_DOC_ROOT='/data/web/html/'
ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"]
index.html文件
[root@localhost img3]# vi index.html
<h1>New Ooc Root for Nginx</h1>
創建並配置腳本,
[root@localhost img3]# vi entrypoint.sh
#!/bin/sh
#
cat > /etc/nginx/conf.d/www.conf << EOF
server {
server_name ${HOSTNAME};
listen ${IP:-0.0.0.0}:${PORT:-80};
root ${NGX_DOC_ROOT:-/usr/share/nginx/html};
}
EOF
exec "$@"
[root@localhost img3]# chmod +x entrypoint.sh
制作鏡像
[root@localhost img3]# docker build -t tinyhttpd:v0.3-8 ./
Sending build context to Docker daemon 4.096kB
Step 1/7 : FROM nginx:1.14-alpine
---> 8a2fb25a19f5
Step 2/7 : LABEL maintainer="NAME <docker@keji.com>"
---> Using cache
---> ec65bc50b2fa
Step 3/7 : ENV NGX_DOC_ROOT='/data/web/html/'
---> Using cache
---> 441c1592ab8a
Step 4/7 : ADD index.html ${NGX_DOC_ROOT}
---> d06aafca9494
Step 5/7 : ADD entrypoint.sh /bin/
---> 3cf8c5d7e035
Step 6/7 : CMD ["/usr/sbin/nginx","-g","daemon off;"]
---> Running in 55b3e02aefc8
Removing intermediate container 55b3e02aefc8
---> ff948e57325b
Step 7/7 : ENTRYPOINT ["/bin/entrypoint.sh"]
---> Running in 7b27e8d7ea6e
Removing intermediate container 7b27e8d7ea6e
---> c851f6636299
Successfully built c851f6636299
Successfully tagged tinyhttpd:v0.3-8
運行並驗證
[root@localhost img3]# docker run --name myweb1 --rm -P -e "PORT=8080" tinyhttpd:v0.3-8
[root@localhost img3]# docker exec -it myweb1 /bin/sh
/ # netstat -tnl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
[root@localhost img3]# docker inspect -f {{.NetworkSettings.Networks.bridge.IPAddress}} myweb1
10.0.0.5
[root@localhost img3]# curl 10.0.0.5:8080
<h1> New Ooc Root for Nginx</h1>
USER
格式:
USER user
USER user:group
USER uid
USER uid:gid
USER user:gid
USER uid:group
示例:
USER www
注:
使用USER指定用戶后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都將使用該用戶。鏡像構建完成后,通過docker run運行容器時,可以通過-u參數來覆蓋所指定的用戶。
HEALTHCHECK
健康檢查
HEALTHCHECK指令告訴Docker如何測試容器以檢查它是否仍在工作。
即使服務器進程仍在運行,這也可以檢測到陷入無限循環且無法處理新連接的Web服務器等情況。
HEALTHCHECK指令有兩種形式:I HEALTHCHECK IOPTIONSI CMD命令(通過在容器內運行命令來檢查容器運行狀況)
HEALTHCHECK NONE(禁用從基礎圖像繼承的任何健康檢查)
健康檢查(2)
可以在CMD之前出現的選項是:
--interval = DURATION(默認值:30s)每隔多長時間
--timeout = DURATION(默認值:30秒)超時時長
--start-period = DURATION(默認值:Os)等待主進程啟動起來后,在進行檢測,等待時長
--retries=N(默認值:3)檢查次數
命令的退出狀態表示容器的運行狀況。 可能的值是:
0:成功 - 容器健康且隨時可用
1:不健康 - 容器無法正常工作
2:保留 - 不要使用此退出代碼
例如
健康檢查 - 間隔= 5M - 超時=3秒
HEALTHCHECK --interval=5m --timeout=3s \
CMD curl -f http:// localhost / || exit 1
dockerfile
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -fs http://localhost/ || exit 1
構建鏡像
$ docker build -t myweb:v1
運行容器並驗證
$ docker run -d --name web -p 80:80 myweb:v1
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03e28eb00bd0 myweb:v1 "nginx -g 'daemon off" 3 seconds ago Up 2 seconds (health: starting) 80/tcp, 443/tcp web
當運行該鏡像后,可以通過 docker container ls 看到最初的狀態為 (health: starting)
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03e28eb00bd0 myweb:v1 "nginx -g 'daemon off" 3 seconds ago Up 2 seconds (health: starting) 80/tcp, 443/tcp web
在等待幾秒鍾后,再次 docker container ls,就會看到健康狀態變化為了 (healthy)
ARG
ARG
ARG指令使用--build-arg <varname> = <value>標志定義一個變量,用戶可以使用docker build命令在構建時將該變量傳遞給構建器。
如果用戶指定了未在Dockerfile中定義的構建方案,則構建會輸出警告
語法:ARG <name> = <默認值> 1
Dockerfile可以包括一個或多個ARG指令
ARG指令可以可選地包括默認值
ARG版本1.12
ARG用戶= mageedu
