1、docker file的指令
html
一、指令1:FROM指令node
FROM必須是第一個非註釋指令mysql
用於指定基礎鏡像,這個能夠是任意的鏡像nginx
在使用FROM指令的時候,docker daemon會自動先在本機上找所指定的鏡像,若是沒有就會去docker hub或者其餘服務上找鏡像 web
FROM的語法格式
sql
格式1:FROM <repository>[:tag]docker
格式2:FROM <repository>@<digest>apache
注意:vim
第一種各式做鏡像指的是基於基礎鏡像的名子來作新鏡像,可是這種作多是存在漏洞centos
第二種格式是基於鏡像的哈希碼作鏡像,這樣所作的鏡像就避免了這個問題
例子:基於busybox的最新版作鏡像
FROM busybox:latest
二、指令2:MAINTANIER指令
已經被廢棄,用LABEL替換了
用於說明製做者的名稱
可選選項
例子:
MAINTAINER "zxhk <zxhk0816@qq.com>"
三、指令3:LABEL指令
這是新版docker中的指令
這個命令是用來指定各類元數據,指定的方法就是用kye value格式,其實做者信息只是其中的一種
語法格式
LABEL <KEY>=<VALUE> <KEY>=<VALUE> <KEY>=<VALUE>..
四、指令4:COPY指令
將宿主機中的工做目錄中的文件複製到目標鏡像的文件系統中
語法格式
複製一個文件:COPY <src> <dest>
複製多個文件:COPY [<src1> <src2> <src3> ... <dest>]
注意:
源文件路徑,通常是相對路徑
目標文件路徑,通常是絕對路徑
支持使用通配符
文件複製的準則
準則1:src必須是工做目錄下的目錄或者文件,不能是父目錄中的
準則2:若是dest不存在,會被動自動建立
準則3:若是src是目錄,那麼在進行復制的時候,會將src下的所有內容都遞歸方式複製過去,可是src自身不會被複制過去
準則4:若是若是指定了多個src或者在src中使用了通配符,那麼dest必須是一個目錄,而且比用以/爲結尾
例子:將當前工做目錄下的index.html複製到目標容器的文件系統中的/data/web/html下
COPY index /data/web/html
【有了這四個指令就能夠作一個鏡像了】
案例;演示建立docker file的過程
需求:
在容器中建立一個index.html
在容器中準備好yum到的配置文件
實現過程
第一步:建立工做目錄
[root@host1 ~]# mkdir /img1 [root@host1 ~]# cd /img1/
第二步:建立html文件
[root@host1 img1]# echo "test page">>index.html [root@host1 img1]# ls index.html
第三步:準備yum的配置文件
[root@host1 img1]# cp -a /etc/yum.repos.d/ ./ [root@host1 img1]# ls index.html yum.repos.d
第四步:編寫docker file文件
指定做者,可用MAINTAINER 也能夠用 LABEL
將index.html放在/data/下
將yum.repos.d下的全部文件放在/etc/yum.repos.d下
[root@host1 img1]# vim Dockerfile #my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" COPY index.html /data/ COPY yum.repos.d /etc/yum.repos.d/
源目錄只須要指定目錄名稱,目錄下的文件會被複制過去
在目標位置不會生成源目錄同名目錄,必須手動指定,並且必須以/爲結尾
第五步:製做鏡像
[root@host1 img1]# docker build -t miniser:v1-1 ./ Sending build context to Docker daemon 20.99kB Step 1/4 : FROM busybox:latest ---> b534869c81f0 Step 2/4 : MAINTAINER "zxhk <237745635@qq.com>" ---> Running in 9f9f8d0793fa Removing intermediate container 9f9f8d0793fa ---> c928cd55b12c Step 3/4 : COPY index.html /data/ ---> 5fe09215a0e2 Step 4/4 : COPY yum.repos.d /etc/yum.repos.d/ ---> 679710cab9bf Successfully built 679710cab9bf Successfully tagged miniser:v1-1
-t:是用來指定鏡像的標籤的
[root@host1 img1]# docker image ls | grep mini miniser v1-1 679710cab9bf 2 minutes ago 1.23MB
第六步:基於鏡像啓動一個容器
[root@host1 img1]# docker run --name t123 \ > --rm miniser:v1-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.repo
這個容器就是執行一個ls命令,當ls執行完,這個容器也就中止了
這個容器的執行結果是輸出repo文件名列表
五、指令5:ADD指令
與COPY相似,區別是ADD支持使用URL路徑,也就是若是你的作鏡像的這個主機能夠聯網,那麼就能夠將網絡上的一個文件下載到本地並引入到你的文件中。
ADD的另外一個做用就是若是源文件是一個本地文件,而且這個文件是tar壓縮歸檔的文件,那麼ADD能夠自動將這個文件解壓展開到你的工做目錄.須要特別注意,若是源文件是一個網絡文件,那麼沒法自動解壓展開。
語法格式:
ADD <src> <dest> ADD ["<src>" "<src>" ... "<dest>"]
演示:下載nginx並放入到鏡像的/var/usr/src下
第一步:去找nginx下載地址
第二步:編輯docker file文件
#my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" COPY index.html /data/ COPY yum.repos.d /etc/yum.repos.d/ ADD http://nginx.org/download/nginx-1.17.6.tar.gz /var/usr/src/
第三步:構建鏡像
[root@host1 img1]# docker build -t miniser:v1-2 ./
[root@host1 img1]# docker image ls | grep mini miniser v1-2 eaceb1156a52 2 minutes ago 2.27MB miniser v1-1 679710cab9bf 23 minutes ago 1.23MB
注意:也能夠先將nginx的安裝包下載到本地,而後導入到鏡像中
Dockerfile文件內容以下
ADD nginx-1.17.2.tar.gz /usr/local/src/
此時是將nginx解壓到/usr/local/src目錄下
六、指令6:WORKDIR指令
用於設定工做目錄,好比上個例子中,將nginx放在了/usr/loca/src下,咱們就能夠將這個目錄設置爲工做目錄,以下
#my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" COPY index.html /data/ COPY yum.repos.d /etc/yum.repos.d/ WORKDIR /var/usr/src/ ADD http://nginx.org/download/nginx-1.17.6.tar.gz ./
七、指令7:VOLUME指令
用於在鏡像中建立一個掛載點目錄,用以掛載宿主機上的卷或者其餘容器上的卷
基於dockerfile建立的卷,是沒法指定卷所在的宿主機的目錄的,須要自動生成
語法格式
VOLUME <mountpoint>
若是docker所指定的卷下之前有文件,那麼掛載卷以後,這些文件就會出如今容器中
案例:修改Dockerfile,將/data/mysql做爲卷
第一步:修改Dockerfile文件
#my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" COPY index.html /data/ COPY yum.repos.d /etc/yum.repos.d/ WORKDIR /var/usr/src/ ADD http://nginx.org/download/nginx-1.17.6.tar.gz ./ VOLUME /data/mysql/
第二步:構建鏡像
[root@host1 img1]# docker build -t miniser:v1-3 ./
第三步:啓動容器,查看掛載狀況
[root@host1 img1]# docker run --rm -it --name t100 miniser:v1-3 /var/usr/src # /var/usr/src # mount | grep mysql /dev/mapper/centos-root on /data/mysql type xfs (rw,seclabel,relatime,attr2,inode64,noquota) /var/usr/src #
也可執行docker inspect進行查看
八、指令8:EXPOSE指令
爲容器打開監聽的端口以實現和外部主機進行通訊
語法格式:
EXPOSE <port>[/<protocol>] <port>[/<protocol>] <port>[/<protocol>] ...
protocol是指定協議,能夠是tcp,也能夠是udp,默認tcp
例子:暴漏多個端口
例子:EXPOSE 11211/udp 11211/tcp
注意:
寫在文件中的EXPOSE指令,僅僅是說端口是能夠暴漏的,但並未真正暴露出來
當須要端口暴漏出去的時候,須要在建立鏡像的時候用選項 -P,這個選項會自動去讀取EXPOSE的設置,來將必要的端口暴漏出來
案例:製做鏡像,暴漏80端口
第一步:製做dockerfile
#my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" COPY index.html /data/ COPY yum.repos.d /etc/yum.repos.d/ WORKDIR /var/usr/src/ ADD nginx-1.17.6.tar.gz ./ VOLUME /data/mysql/ EXPOSE 80/tcp 53/udp
第二步製做鏡像文件
[root@host1 img1]# docker build -t miniser:v1-4 ./
第二步:啓動容器,在啓動的時候,運行apache
[root@host1 img1]# docker run --name t100 -it --rm miniser:v1-4 httpd -f -h /data
檢查一下地址
[root@host1 img1]# docker inspect t100 -f '{{.NetworkSettings.IPAddress}}' 172.17.0.3
直接訪問容器的地址
[root@host1 img1]# curl 172.17.0.3 test page
能夠查看,此時是否暴漏端口了
[root@host1 img1]# docker port t100 [root@host1 img1]#
沒有暴漏任何端口
接下來,重啓運行一個容器,而且用-p選項
[root@host1 img1]# docker run --name t101 -p 80 -it --rm miniser:v1-4 httpd -f -h /data
再次檢查暴漏的端口
[root@host1 ~]# docker port t101 80/tcp -> 0.0.0.0:32768
其實此時還能夠配合-p 選項來暴漏那些鏡像中沒有要指定暴漏的端口
九、指令9:ENV指令
用於爲鏡像定義所須要的環境變量
ENV定義的環境變量能夠被其後面的指令,好比COPY ADD等指令調用
ENV 能夠嵌套ENV
調用變量的格式 $var 或者 ${var}
定義變量的格式:ENV <key> <value> 或者 ENV <key>=<value>
補充:
定義多個變量,須要續航的時候,能夠用\
變量名中若是有空格,須要用引號引發來
案例:修改Dockerfile環境變量
#my first docker file FROM busybox:latest MAINTAINER "zxhk <237745635@qq.com>" ENV SOFT_NGX=nginx-1.17.6.tar.gz \ DOC_ROOT=/data/ \ WORK_DIR=/var/usr/src/ \ REPO_DIR=/etc/yum.repos.d/ \ MYSQL_DIR=/data/mysql/ COPY index.html ${DOC_ROOT:-/var/www/html/} COPY yum.repos.d $REPO_DIR WORKDIR $WORK_DIR ADD $SOFT_NGX ./ VOLUME $MYSQL_DIR EXPOSE 80/tcp 53/udp
製做鏡像
[root@host1 img1]# docker build -t miniser:v1-5 ./
[root@host1 img1]# docker run --name t103 --rm miniser:v1-5 printenv PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=a93864cdbbce SOFT_NGX=nginx-1.17.6.tar.gz DOC_ROOT=/data/ WORK_DIR=/var/usr/src/ REPO_DIR=/etc/yum.repos.d/ MYSQL_DIR=/data/mysql/ HOME=/root
咱們要清楚,變量在從構建鏡像,到啓動容器的過程當中,變量會傳遞兩次,以下
在從鏡像構建容器的時候,也是能夠傳遞變量的,而這些變量是能夠直接從Dockerfile中得到
也能夠在建立容器的時候,手動方式傳入變量
案例:啓動容器的時候傳遞變量
[root@host1 img1]# docker run --name t103 --rm \ > --env DOC_ROOT=/data/html/ \ > miniser:v1-5 printenv PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=d76460e0f8cd DOC_ROOT=/data/html/ SOFT_NGX=nginx-1.17.6.tar.gz WORK_DIR=/var/usr/src/ REPO_DIR=/etc/yum.repos.d/ MYSQL_DIR=/data/mysql/ HOME=/root