一、docker file的指令
創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、成都網(wǎng)站建設(shè)、塔河網(wǎng)絡(luò)推廣、小程序開發(fā)、塔河網(wǎng)絡(luò)營銷、塔河企業(yè)策劃、塔河品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供塔河建站搭建服務(wù),24小時服務(wù)熱線:028-86922220,官方網(wǎng)址:www.cdcxhl.com1、指令1:FROM指令
FROM必須是第一個非注釋指令
用于指定基礎(chǔ)鏡像,這個可以是任意的鏡像
在使用FROM指令的時候,docker daemon會自動先在本機上找所指定的鏡像,如果沒有就會去docker hub或者其他服務(wù)上找鏡像?
FROM的語法格式
格式1:FROM
格式2:FROM
注意:
第一種各式作鏡像指的是基于基礎(chǔ)鏡像的名子來做新鏡像,但是這種做可能是存在漏洞
第二種格式是基于鏡像的哈希碼做鏡像,這樣所做的鏡像就避免了這個問題
例子:基于busybox的最新版做鏡像
FROM?busybox:latest2、指令2:MAINTANIER指令
已經(jīng)被廢棄,用LABEL替換了
用于說明制作者的名稱
可選選項
例子:
MAINTAINER??"zxhk?3、指令3:LABEL指令
這是新版docker中的指令
這個命令是用來指定各種元數(shù)據(jù),指定的方法就是用kye value格式,其實作者信息只是其中的一種?
語法格式
LABEL?4、指令4:COPY指令
將宿主機中的工作目錄中的文件復(fù)制到目標(biāo)鏡像的文件系統(tǒng)中
語法格式
復(fù)制一個文件:COPY
復(fù)制多個文件:COPY [
注意:
源文件路徑,一般是相對路徑
目標(biāo)文件路徑,一般是絕對路徑
支持使用通配符
文件復(fù)制的準則
準則1:src必須是工作目錄下的目錄或者文件,不能是父目錄中的
準則2:如果dest不存在,會被動自動創(chuàng)建
準則3:如果src是目錄,那么在進行復(fù)制的時候,會將src下的全部內(nèi)容都遞歸方式復(fù)制過去,但是src自身不會被復(fù)制過去
準則4:如果如果指定了多個src或者在src中使用了通配符,那么dest必須是一個目錄,并且比用以/為結(jié)尾
例子:將當(dāng)前工作目錄下的index.html復(fù)制到目標(biāo)容器的文件系統(tǒng)中的/data/web/html下
COPY?index?/data/web/html【有了這四個指令就可以做一個鏡像了】
案例;演示創(chuàng)建docker file的過程
需求:
在容器中創(chuàng)建一個index.html
在容器中準備好yum到的配置文件
實現(xiàn)過程
第一步:創(chuàng)建工作目錄
[root@host1?~]#?mkdir?/img1 [root@host1?~]#?cd?/img1/第二步:創(chuàng)建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下
源目錄只需要指定目錄名稱,目錄下的文件會被復(fù)制過去
在目標(biāo)位置不會生成源目錄同名目錄,必須手動指定,而且必須以/為結(jié)尾
第五步:制作鏡像
[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:是用來指定鏡像的標(biāo)簽的
第六步:基于鏡像啟動一個容器
[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這個容器就是執(zhí)行一個ls命令,當(dāng)ls執(zhí)行完,這個容器也就停止了
這個容器的執(zhí)行結(jié)果是輸出repo文件名列表
5、指令5:ADD指令
與COPY類似,區(qū)別是ADD支持使用URL路徑,也就是如果你的做鏡像的這個主機可以聯(lián)網(wǎng),那么就可以將網(wǎng)絡(luò)上的一個文件下載到本地并引入到你的文件中。
ADD的另一個作用就是如果源文件是一個本地文件,并且這個文件是tar壓縮歸檔的文件,那么ADD可以自動將這個文件解壓展開到你的工作目錄.需要特別注意,如果源文件是一個網(wǎng)絡(luò)文件,那么無法自動解壓展開。
語法格式:
ADD?演示:下載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/第三步:構(gòu)建鏡像
[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的安裝包下載到本地,然后導(dǎo)入到鏡像中
Dockerfile文件內(nèi)容如下
ADD?nginx-1.17.2.tar.gz?/usr/local/src/此時是將nginx解壓到/usr/local/src目錄下
6、指令6:WORKDIR指令
用于設(shè)定工作目錄,比如上個例子中,將nginx放在了/usr/loca/src下,我們就可以將這個目錄設(shè)置為工作目錄,如下
7、指令7:VOLUME指令
用于在鏡像中創(chuàng)建一個掛載點目錄,用以掛載宿主機上的卷或者其他容器上的卷
基于dockerfile創(chuàng)建的卷,是無法指定卷所在的宿主機的目錄的,需要自動生成
語法格式
VOLUME
如果docker所指定的卷下以前有文件,那么掛載卷之后,這些文件就會出現(xiàn)在容器中
案例:修改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/第二步:構(gòu)建鏡像
[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?#也可執(zhí)行docker inspect進行查看
8、指令8:EXPOSE指令
為容器打開監(jiān)聽的端口以實現(xiàn)和外部主機進行通信
語法格式:
EXPOSE
protocol是指定協(xié)議,可以是tcp,也可以是udp,默認tcp
例子:暴漏多個端口
例子:EXPOSE 11211/udp 11211/tcp
注意:
寫在文件中的EXPOSE指令,僅僅是說端口是可以暴漏的,但并未真正暴露出來
當(dāng)需要端口暴漏出去的時候,需要在創(chuàng)建鏡像的時候用選項 -P,這個選項會自動去讀取EXPOSE的設(shè)置,來將必要的端口暴漏出來
案例:制作鏡像,暴漏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、指令9:ENV指令
用于為鏡像定義所需要的環(huán)境變量
ENV定義的環(huán)境變量可以被其后面的指令,比如COPY ADD等指令調(diào)用
ENV 可以嵌套ENV
調(diào)用變量的格式 $var 或者 ${var}
定義變量的格式:ENV
補充:
定義多個變量,需要續(xù)航的時候,可以用\
變量名中如果有空格,需要用引號引起來
案例:修改Dockerfile環(huán)境變量
#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我們要清楚,變量在從構(gòu)建鏡像,到啟動容器的過程中,變量會傳遞兩次,如下
在從鏡像構(gòu)建容器的時候,也是可以傳遞變量的,而這些變量是可以直接從Dockerfile中獲得
也可以在創(chuàng)建容器的時候,手動方式傳入變量
案例:啟動容器的時候傳遞變量
[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另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。