自制鏡像:html
基於dockerfile文件製做鏡像使用前端
${variable_name}mysql
變量替換的特殊格式nginx
若是這個變量未初始化,或者有這個變量可是值爲空,這表示我要引用的是word這個字串所表示的內容。sql
${variable:+word}docker
與-號相反,變量有值就替換變量,爲空就不作操做shell
[root@localhost ~]# echo ${NAME:-tom} tom [root@localhost ~]# NAME=jerry [root@localhost ~]# echo ${NAME:-tom} jerry
[root@localhost ~]# echo $NAME jerry [root@localhost ~]# echo ${NAME:+tom} tom [root@localhost ~]# unset NAME [root@localhost ~]# echo ${NAME:+tom} [root@localhost ~]# echo $NAME
[root@localhost ~]# mkdir img1 [root@localhost ~]# cd img1/ [root@localhost img1]# vi Dockerfile 文件名的首字母必須爲大寫
複製於百衲本apache
FROM:指定基礎鏡像,必須爲第一個命令json
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指令是最重要的一個且必須爲Dockerfile文件開篇的第一個非註釋行,用於爲映像文件構建過程指定基準鏡像,後續的指令運行於此基準鏡像所提供的運行環境
實踐中,基準鏡像能夠是任何可用鏡像文件,默認狀況下,docker build會在docker主機上查找指定的鏡像文件,在其不存在時,則會從docker Hub Registry上拉取所需的鏡像文件
格式: FROM <image> FROM <image>:<tag> FROM <image>@<digest> 示例: FROM mysql:5.6 注: tag或digest是可選的,若是不使用這兩個值時,會使用latest版本的基礎鏡像
格式: MAINTAINER <name> 示例: MAINTAINER Jasper Xu MAINTAINER sorex@163.com MAINTAINER Jasper Xu <sorex@163.com>
LABEL
指定各類元數據。
LABEL maintainer=「MageEdu <mageNAME <docker@keji.com>>」
用於從Docker主機複製文件至建立的新映像文件
格式: COPY <src>... <dest> COPY ["<src>",... "<dest>"] 用於支持包含空格的路徑 <src>:要複製的源文件或目錄,支持使用通配符 <dest>:目標路徑,即正在建立的image的文件系統路徑;建議爲<dest>使用絕對路徑,不然,COPY指定則以WORKDIR爲其起始路徑; 注意:在路徑中有空白字符時,一般使用第二種格式 文件複製準則 <src>必須是build上下文中的路徑,不能是其父目錄中的文件 若是<src>是目錄,則其內部文件或子目錄會被遞歸複製,但<src>目錄自身不會被複制 若是指定了多個<src>,或在<src>中使用了通配符,則<dest>必須是一個目錄,且必須以/結尾 若是<dest>事先不存在,他將會被自動建立,這包括其父目錄路徑
[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 表示指定標籤
[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
向目標鏡像中打包文件
[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 /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
製做鏡像
[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 <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 <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用於在鏡像容器中執行命令,其有如下兩種命令執行方式: 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 ["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 ["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:group USER uid USER uid:gid USER user:gid USER uid:group 示例: USER www 注: 使用USER指定用戶後,Dockerfile中其後的命令RUN、CMD、ENTRYPOINT都將使用該用戶。鏡像構建完成後,經過docker run運行容器時,能夠經過-u參數來覆蓋所指定的用戶。
健康檢查 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指令使用--build-arg <varname> = <value>標誌定義一個變量,用戶能夠使用docker build命令在構建時將該變量傳遞給構建器。 若是用戶指定了未在Dockerfile中定義的構建方案,則構建會輸出警告 語法:ARG <name> = <默認值> 1 Dockerfile能夠包括一個或多個ARG指令 ARG指令能夠可選地包括默認值 ARG版本1.12 ARG用戶= mageedu