Docker系列8:Docker file指令詳解

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下載地址

image.png

第二步:編輯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

咱們要清楚,變量在從構建鏡像,到啓動容器的過程當中,變量會傳遞兩次,以下

image.png

  • 在從鏡像構建容器的時候,也是能夠傳遞變量的,而這些變量是能夠直接從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
相關文章
相關標籤/搜索