10、指令10:RUN指令
企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對(duì)外擴(kuò)展宣傳的重要窗口,一個(gè)合格的網(wǎng)站不僅僅能為公司帶來巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺(tái),成都創(chuàng)新互聯(lián)公司面向各種領(lǐng)域:成都集裝箱等成都網(wǎng)站設(shè)計(jì)、成都營(yíng)銷網(wǎng)站建設(shè)解決方案、網(wǎng)站設(shè)計(jì)等建站排名服務(wù)。
RUM命令是基于Dockerfile構(gòu)建鏡像的時(shí)候要運(yùn)行的命令
比如基于url的方式獲取nginx安裝包:獲取到gz包以后需要使用RUN指令來運(yùn)行tar來解壓展開這個(gè)nginx的包了。
案例:編寫docker file,并制作鏡像
#my?first?docker?file FROM?busybox:latest MAINTAINER?"zxhk?<237745635@qq.com>" ENV?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?http://nginx.org/download/nginx-1.17.6.tar.gz?./ RUN?cd?${WORK_DIR}?&&?tar?-xf?nginx-1.17.6.tar.gz?&&?mv?nginx-1.17.6?nginx VOLUME?$MYSQL_DIR EXPOSE?80/tcp?53/udp
[root@host1?img1]#?docker?build?-t?miniser:v1-8?./
基于鏡像啟動(dòng)一個(gè)容器,檢測(cè)是否已經(jīng)解壓
[root@host1?img1]#?docker?run?--rm?--name?t1?miniser:v1-8?ls?/var/usr/src/ nginx nginx-1.17.6.tar.gz
11、指令11:CMD指令
CMD是定義一個(gè)鏡像文件啟動(dòng)為容器的時(shí)候,默認(rèn)要運(yùn)行的程序,也就是那個(gè)pid為1的程序
CMD可以有多個(gè),但是只有最后一個(gè)才是生效的。
CMD指令有三種格式
格式1:CMD <命令>
這種格式的話,會(huì)自動(dòng)的將這個(gè)命令運(yùn)行為shell的子進(jìn)程,這樣的好處就是在這個(gè)命令中可以有各種的特殊的符號(hào),但是缺點(diǎn)就得是這個(gè)命令的進(jìn)程號(hào)不是 1
也可以借助于exec,讓這個(gè)進(jìn)程的ID成為1
格式2:CMD ["<命令>", "<參數(shù)1>","<參數(shù)2>"]
這種格式的話是直接將這個(gè)進(jìn)程啟動(dòng)為ID為1的進(jìn)程
格式3:CMD ["<參數(shù)1>","<參數(shù)2>"]
這種格式需要借助于ENTRYPOINT才能運(yùn)行
案例1:使用格式1讓容器運(yùn)行的時(shí)候,自動(dòng)運(yùn)行apache
第一步:創(chuàng)建dockerfile
FROM?busybox LABEL?maintainer="zxhk<237745635@qq.com>" ENV?DOC_ROOT="/var/www/html/" RUN?mkdir?-p?${DOC_ROOT}?&&?\ ????echo?"<h2>test</h2>">${DOC_ROOT}index.html CMD?/bin/httpd?-f?-h?${DOC_ROOT}
第二步:制作鏡像
[root@host1?img2]#?docker?build?-t?miniser:v2-1?./
第三步:查看鏡像的詳細(xì)信息
[root@host1?img2]#?docker?inspect?miniser:v2-1?-f?'{{.ContainerConfig.Cmd}}' [/bin/sh?-c?#(nop)??CMD?["/bin/sh"?"-c"?"/bin/httpd?-f?-h?${DOC_ROOT}"]]
第四步:創(chuàng)建容器
[root@host1?img2]#?docker?run?--name?t1?--rm?-d?miniser:v2-1
第五步:登錄容器,查看容器信息
[root@host1?img2]#?docker?exec?-it?t1?/bin/sh /?#? /?#?netstat?-an Active?Internet?connections?(servers?and?established) Proto?Recv-Q?Send-Q?Local?Address???????????Foreign?Address?????????State??????? tcp????????0??????0?:::80???????????????????:::*????????????????????LISTEN?????? /?#? /?#?ps PID???USER?????TIME??COMMAND ????1?root??????0:00?/bin/httpd?-f?-h?/var/www/html/ ???10?root??????0:00?/bin/sh ???15?root??????0:00?ps /?#
案例2:使用格式2讓容器運(yùn)行的時(shí)候,自動(dòng)運(yùn)行apache
FROM?busybox LABEL?maintainer="zxhk<237745635@qq.com>" ENV?DOC_ROOT="/var/www/html/" RUN?mkdir?-p?${DOC_ROOT}?&&?\ ????echo?"<h2>test</h2>">${DOC_ROOT}index.html CMD?["/bin/sh",?"-c",?"/bin/httpd",?"-f",?"-h",?"${DOC_ROOT}"]
11、指令11:ENTRYPOINT指令
ENTRYPOINT的功能就是和CMD類似的,用于指定容器啟動(dòng)后要默認(rèn)運(yùn)行的程序
在啟動(dòng)容器的時(shí)候,run后面指定的命令,可以覆蓋鏡像中的CMD命令
ENTRYPOINT所運(yùn)行的命令不會(huì)不被docker run所指定的命令覆蓋
案例:用ENTRYPOINT制作鏡像實(shí)現(xiàn)啟動(dòng)容器自動(dòng)運(yùn)行apache
FROM?busybox LABEL?maintainer="zxhk<237745635@qq.com>" ENV?DOC_ROOT="/var/www/html/" RUN?mkdir?-p?${DOC_ROOT}?&&?\ ????echo?"<h2>test</h2>">${DOC_ROOT}index.html ENTRYPOINT?/bin/httpd?-f?-h?${DOC_ROOT}
制作鏡像并啟動(dòng)容器測(cè)試
[root@host1?img2]#?docker?build?-t?miniser:v2-2?./ [root@host1?img2]#?docker?run?--name?t2?--rm?-it?miniser:v2-2?ls?/data
此時(shí)命令會(huì)卡住
ls /data會(huì)作為參數(shù)傳遞給httpd -f -h? /data,因?yàn)閔ttpd無法識(shí)別這個(gè)參數(shù),因此會(huì)卡住
ENTRYPOINT和CMD組合使用的情況
此時(shí)CMD后的內(nèi)容就會(huì)作為默認(rèn)參數(shù)傳遞給ENTRYPOINT
FROM?busybox LABEL?maintainer="zxhk<237745635@qq.com>" ENV?DOC_ROOT="/var/www/html/" RUN?mkdir?-p?${DOC_ROOT}?&&?\ ????echo?"<h2>test</h2>">${DOC_ROOT}index.html CMD?["/bin/httpd",?"-f",?"-h",?"${DOC_ROOT}"] ENTRYPOINT?["/bin/sh","-c"]
使用ENTRYPOINT的好處是,他比CMD更方便,因?yàn)樗梢栽趩?dòng)容器的時(shí)候,直接向容器傳遞命令
案例:在啟動(dòng)容器的時(shí)候,動(dòng)態(tài)生成配置文件
1、創(chuàng)建工作目錄
[root@host1?img3]#?mkdir?/img3 [root@host1?img3]#?cd?/img3
2、準(zhǔn)備一個(gè)shell腳本,用于生成配置文件
[root@host1?img3]#?vim?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?"$@"
3、創(chuàng)建測(cè)試頁(yè)面
[root@host1?img3]#?echo?"test?page">index.html
4、編寫Dockerfile文件
[root@host1?img3]#?vim?Dockerfile
FROM?nginx:1.14-alpine LABEL?author="zxhk<237745635@qq.com>" ENV?NGX_DOC_ROOT='/data/web/html/' ADD?index.html?${NGX_DOC_ROOT} ADD?entrypoint.sh?/bin/ #nginx的配置文件必須以;為結(jié)尾 CMD?["/usr/sbin/nginx","-g","daemon?off;"] ENTRYPOINT?["/bin/entrypoint.sh"]
在執(zhí)行dockerfile的時(shí)候,CMD的內(nèi)容會(huì)傳遞到ENTRYPOINT中
ENTRYPOIN會(huì)啟動(dòng)運(yùn)行這個(gè)shell腳本,shell腳本就是pid為1的進(jìn)程,shell腳本就會(huì)生成配置文件
在腳本的最后會(huì)通過exec 來執(zhí)行nginx,讓nginx工作在前臺(tái),同時(shí)nginx進(jìn)程頂替shell成為pid為1的進(jìn)程
5、構(gòu)建鏡像
[root@host1?img3]#?docker?build?-t?miniser:v2-4?./
6、啟動(dòng)容器
[root@host1?img3]#?docker?run?--name?nginx1?--rm?miniser:v2-4
登錄容器看看
[root@host1?~]#?docker?exec?-it?nginx1?/bin/sh /?#? /?#?cat?/etc/nginx/conf.d/www.conf? server?{ ????server_name?c1d255997da4; ????listen?0.0.0.0:80; ????root?/data/web/html/; } /?#
7、再重新啟動(dòng)一個(gè)容器,讓nginx監(jiān)聽127.0.0.1的8080端口
[root@host1?img3]#?docker?run?--name?nginx1?--rm?\ >?-e?"PORT=8080"?-e?"IP=1.2.3.4"?miniser:v2-4
再登錄容器看看
[root@host1?~]#?docker?exec?-it?nginx1?/bin/sh /?#? /?#? /?#?cat?/etc/nginx/conf.d/www.conf? server?{ ????server_name?92c978c97b3c; ????listen?127.0.0.1:8080; ????root?/data/web/html/; } /?#
通過這種方式可以快速的為不同的環(huán)境準(zhǔn)備特定的配置文件
12、指令12:USER指令
用于指定容器中的主進(jìn)程是以哪個(gè)用戶的身份來運(yùn)行
也可以用來指定在執(zhí)行dockerfile的CMD? RUN? ENTRYPOIND的時(shí)候,以那個(gè)用戶的身份來運(yùn)行
需要確保容器的/etc/passwd中有這個(gè)用戶,否則會(huì)報(bào)錯(cuò)
語法格式:
USER <UID> | <USERNAME>
13、指令13:HEALTHCHECK指令
檢查容器和容器中的服務(wù)是否正常工作
HEALTHCHECK的功能選項(xiàng)
--interval=xx? 指定每隔多久檢查一次(默認(rèn)每隔30s檢查一次)
--timeout=xx? 指定等待超時(shí)時(shí)間(默認(rèn)也是30s)
--start-period=xx 啟動(dòng)容器后,等待多久開始做健康檢查(默認(rèn)是0秒,也就是不等)
--retries=xx? 指定請(qǐng)求幾次數(shù)據(jù)都沒獲得返回的情況下才認(rèn)為是出現(xiàn)了異常(默認(rèn)是3次)
HEALTHCHECK的返回值
0:success成功
1:unhealth不健康
2:預(yù)留,沒有意義
案例:每隔5分鐘檢查一次,超時(shí)時(shí)間是3秒
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://1.2.3.4 || exit 1
如果健康檢查失敗,就返回1
14、指令14:SHELL指令
這個(gè)是用來指定運(yùn)行程序的時(shí)候默認(rèn)要用的程序
舉例:
SHELL?["/bin/sh","-c"]
15、指令15:STOPSIGNAL指令
這個(gè)指令可以指定在執(zhí)行docker stop的時(shí)候,本質(zhì)上是向容器發(fā)送什么什么指令,默認(rèn)是發(fā)送15,如果想執(zhí)行stop的時(shí)候發(fā)送9的指令
格式
STOPSIGNAL?9
16、指令16:ARG指令
ARG也是定義一個(gè)變量,只是這個(gè)變量是用在執(zhí)行build dockerfile的過程中
可以將nginx的版本定義成變量,然后在構(gòu)建鏡像的時(shí)候可以通過變量來動(dòng)態(tài)指定作者
編寫鏡像文件
FROM?nginx:1.14-alpine ARG?info="zxhk<237745635@qq.com>" LABEL?author="${info}" ENV?NGX_DOC_ROOT='/data/web/html/' ADD?index.html?${NGX_DOC_ROOT} ADD?entrypoint.sh?/bin/ #nginx的配置文件必須以;為結(jié)尾 CMD?["/usr/sbin/nginx","-g","daemon?off;"] ENTRYPOINT?["/bin/entrypoint.sh"]
制作鏡像
[root@host1?img3]#?docker?build?-t?miniser:v2-5?--build-arg?new="tom@qq.com"?./
Dockerfile中的arg相當(dāng)于是配置了一個(gè)默認(rèn)值,在制作鏡像的時(shí)候,如果沒有傳值,就用默認(rèn)值
注意區(qū)分ENV和ARG
docker run的時(shí)候可以傳值,但是在docker build的時(shí)候是無法傳值的
ENV所定義的變量在夠構(gòu)建鏡像的時(shí)候使用的,而在構(gòu)建鏡像的時(shí)候是只能用ARG的默認(rèn)值的
17、指令17:ONBUILD指令
本指令其實(shí)是定義一個(gè)觸發(fā)器
通過ONBUILD定義的Dcokerfile,在執(zhí)行docker build的時(shí)候不執(zhí)行,只有別人基于這個(gè)鏡像做新鏡像的時(shí)候,才會(huì)被執(zhí)行
案例:如果別人基于這個(gè)鏡像做新鏡像,就讓其下載一個(gè)文件
第一步:制作一個(gè)基礎(chǔ)鏡像
[root@host1?img3]#?vim?Dockerfile
FROM?nginx:1.14-alpine LABEL?author="zxhk<237745635@qq.com>" ENV?NGX_DOC_ROOT='/data/web/html/' ADD?index.html?${NGX_DOC_ROOT} ADD?entrypoint.sh?/bin/ ONBUILD?ADD?http://x.x.x.x/xxx?/data/web/html/ #nginx的配置文件必須以;為結(jié)尾 CMD?["/usr/sbin/nginx","-g","daemon?off;"] ENTRYPOINT?["/bin/entrypoint.sh"]
制作鏡像
[root@host1?img3]#?docker?build?-t?base:v1.1?./
第二步:基于基礎(chǔ)鏡像做新鏡像
[root@host1?~]#?mkdir?/img4 [root@host1?img4]#?cd?/img4 [root@host1?img4]#?vim?Dockerfile
FROM?base:v1-1 RUN?mkdir?/data
制作鏡像
[root@host1?img4]#?docker?build?-t?newimg:v1-1?./
文章名稱:Docker系列10:dockerfile指令詳解(2)
本文鏈接:http://aaarwkj.com/article0/igjeoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、定制網(wǎng)站、域名注冊(cè)、ChatGPT、軟件開發(fā)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)