您好,登錄后才能下訂單哦!
1.FROM:構建鏡像基于哪個鏡像
語法:FROM <image>[:<tag>]
例如:FROM centos:7
解釋:設置要制作的鏡像基于哪個鏡像,F(xiàn)ROM指令必須是整個Dockerfile的第一個指令,如果指定的鏡像不存在默認會自動從Docker Hub上下載。
2.MAINTAINER:鏡像維護者姓名或郵箱地址
語法:MAINTAINER <name>
例如:MAINTAINER adam
解釋:MAINTAINER指令允許你給將要制作的鏡像設置作者信息
3.RUN:構建鏡像時運行的shell命令
語法: ①RUN <command> #將會調(diào)用/bin/sh -c <command>
②RUN ["executable", "param1", "param2"] #將會調(diào)用exec執(zhí)行,以避免有些時候shell方式執(zhí)行時的傳遞參數(shù)問題,而且有些基礎鏡像可能不包含/bin/sh
例如:
RUN [“yum”,”install”,”httpd”]
RUN yum -y install httpd
解釋:RUN指令會在一個新的容器中執(zhí)行任何命令,然后把執(zhí)行后的改變提交到當前鏡像,提交后的鏡像會被用于Dockerfile中定義的下一步操作,RUN中定義的命令會按順序執(zhí)行并提交,這正是Docker廉價的提交和可以基于鏡像的任何一個歷史點創(chuàng)建容器的好處,就像版本控制工具一樣。
4.CMD:運行容器時執(zhí)行的shell命令
語法:①CMD ["executable", "param1", "param2"] #將會調(diào)用exec執(zhí)行,首選方式
②CMD ["param1", "param2"] #當使用ENTRYPOINT指令時,為該指令傳遞默認參數(shù)
③CMD <command> [ <param1>|<param2> ] #將會調(diào)用/bin/sh -c執(zhí)行
例如: CMD [“/bin/bash”]
解釋:CMD指令中指定的命令會在鏡像運行時執(zhí)行,在Dockerfile中只能存在一個,如果使用了多個CMD指令,則只有最后一個CMD指令有效。當出現(xiàn)ENTRYPOINT指令時,CMD中定義的內(nèi)容會作為ENTRYPOINT指令的默認參數(shù),也就是說可以使用CMD指令給ENTRYPOINT傳遞參數(shù)。
注意:RUN和CMD都是執(zhí)行命令,他們的差異在于RUN中定義的命令會在執(zhí)行docker build命令創(chuàng)建鏡像時執(zhí)行,而CMD中定義的命令會在執(zhí)行docker run命令運行鏡像時執(zhí)行,另外使用第一種語法也就是調(diào)用exec執(zhí)行時,命令必須為絕對路徑。
5.EXPOSE:聲明容器的服務端口
語法:EXPOSE <port> [ ...]
例如:EXPOSE 80 443
解釋:EXPOSE指令用來告訴Docker這個容器在運行時會監(jiān)聽哪些端口,Docker在連接不同的容器(使用–link參數(shù))時使用這些信息。
6.ENV:設置容器環(huán)境變量
語法:ENV <key> <value>
例如:ENV MYSQL_ROOT_PASSWORD 123.com
解釋:ENV指令用于設置環(huán)境變量,在Dockerfile中這些設置的環(huán)境變量也會影響到RUN指令,當運行生成的鏡像時這些環(huán)境變量依然有效,如果需要在運行時更改這些環(huán)境變量可以在運行docker run時添加–env <key>=<value>參數(shù)來修改。
注意:最好不要定義那些可能和系統(tǒng)預定義的環(huán)境變量沖突的名字,否則可能會產(chǎn)生意想不到的結果。
7.ADD:拷貝文件或目錄到鏡像,如果是URL或壓縮包會自動下載或自動解壓
語法:ADD <src> <dest>
解釋:ADD指令用于從指定路徑拷貝一個文件或目錄到容器的指定路徑中,<src>是一個文件或目錄的路徑,也可以是一個url,路徑是相對于該Dockerfile文件所在位置的相對路徑,<dest>是目標容器的一個絕對路徑,例如/home/yooke/Docker/Dockerfile這個文件中定義的,那么ADD /data.txt /db/指令將會嘗試拷貝文件從/home/yooke/Docker/data.txt到將要生成的容器的/db/data.txt,且文件或目錄的屬組和屬主分別為uid和gid為0的用戶和組,如果是通過url方式獲取的文件,則權限是600。
例如:
ADD <源文件>。。。<目標目錄>
ADD [“源文件”…”目標目錄”]
注意:①如果執(zhí)行docker build – < somefile即通過標準輸入來創(chuàng)建時,ADD指令只支持url方式,另外如果url需要認證,則可以通過RUN wget …或RUN curl …來完成,ADD指令不支持認證。
②<src>路徑必須與Dockerfile在同級目錄或子目錄中,例如不能使用ADD ../somepath,因為在執(zhí)行docker build時首先做的就是把Dockerfile所在目錄包含子目錄發(fā)送給docker的守護進程。
③如果<src>是一個url且<dest>不是以”/“結尾,則會下載文件并重命名為<dest>。
④如果<src>是一個url且<dest>以“/”結尾,則會下載文件到<dest>/<filename>,url必須是一個正常的路徑形式,“http://example.com”像這樣的url是不能正常工作的。
⑤如果<src>是一個本地的壓縮包且<dest>是以“/”結尾的目錄,則會調(diào)用“tar -x”命令解壓縮,如果<dest>有同名文件則覆蓋,但<src>是一個url時不會執(zhí)行解壓縮。
8.COPY:拷貝文件或目錄到鏡像容器內(nèi),跟ADD類似,但不具備自動下載或解壓功能
語法:COPY <src> <dest>
解釋:用法與ADD相同,不過<src>不支持使用url,所以在使用docker build – < somefile時該指令不能使用。
ENTRYPOINT
語法:①ENTRYPOINT ["executable", "param1", "param2"] #將會調(diào)用exec執(zhí)行,首選方式
②ENTRYPOINT command param1 param2 #將會調(diào)用/bin/sh -c執(zhí)行
解釋:ENTRYPOINT指令中指定的命令會在鏡像運行時執(zhí)行,在Dockerfile中只能存在一個,如果使用了多個ENTRYPOINT指令,則只有最后一個指令有效。ENTRYPOINT指令中指定的命令(exec執(zhí)行的方式)可以通過docker run來傳遞參數(shù),例如docker run <images> -l啟動的容器將會把-l參數(shù)傳遞給ENTRYPOINT指令定義的命令并會覆蓋CMD指令中定義的默認參數(shù)(如果有的話),但不會覆蓋該指令定義的參數(shù),例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],當通過docker run <image>啟動容器時該容器會運行l(wèi)s -a /etc命令,當使用docker run <image> -l啟動時該容器會運行l(wèi)s -a -l命令,-l參數(shù)會覆蓋CMD指令中定義的/etc參數(shù)。
注意:①當使用ENTRYPOINT指令時生成的鏡像運行時只會執(zhí)行該指令指定的命令。
②當出現(xiàn)ENTRYPOINT指令時CMD指令只可能(當ENTRYPOINT指令使用exec方式執(zhí)行時)被當做ENTRYPOINT指令的參數(shù)使用,其他情況則會被忽略。
9.VOLUME: 指定容器掛載點到宿主機自動生成的目錄或其他容器
語法:VOLUME ["samepath"]
例如:VOLUME ["/var/lib/mysql"]
解釋:VOLUME指令用來設置一個掛載點,可以用來讓其他容器掛載以實現(xiàn)數(shù)據(jù)共享或對容器數(shù)據(jù)的備份、恢復或遷移,具體用法請參考其他文章。
10.USER:為RUN、CMD、和ENTRYPOINT執(zhí)行命令指定運行用戶
語法:USER [username|uid]
解釋:USER指令用于設置用戶或uid來運行生成的鏡像和執(zhí)行RUN指令。
11.WORKDIR: 為RUN、CMD、ENTRYPOINT、 COPY和ADD設置工作目錄,意思為切換目錄
語法:WORKDIR /path/to/workdir
解釋:WORKDIR指令用于設置Dockerfile中的RUN、CMD和ENTRYPOINT指令執(zhí)行命令的工作目錄(默認為/目錄),該指令在Dockerfile文件中可以出現(xiàn)多次,如果使用相對路徑則為相對于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最終輸出的當前目錄是/data/logs。
12.ONBUILD
語法:ONBUILD [INSTRUCTION]
解釋:ONBUILD指令用來設置一些觸發(fā)的指令,用于在當該鏡像被作為基礎鏡像來創(chuàng)建其他鏡像時(也就是Dockerfile中的FROM為當前鏡像時)執(zhí)行一些操作,ONBUILD中定義的指令會在用于生成其他鏡像的Dockerfile文件的FROM指令之后被執(zhí)行,上述介紹的任何一個指令都可以用于ONBUILD指令,可以用來執(zhí)行一些因為環(huán)境而變化的操作,使鏡像更加通用。
注意:①ONBUILD中定義的指令在當前鏡像的build中不會被執(zhí)行。
②可以通過查看docker inspeat <image>命令執(zhí)行結果的OnBuild鍵來查看某個鏡像ONBUILD指令定義的內(nèi)容。
③ONBUILD中定義的指令會當做引用該鏡像的Dockerfile文件的FROM指令的一部分來執(zhí)行,執(zhí)行順序會按ONBUILD定義的先后順序執(zhí)行,如果ONBUILD中定義的任何一個指令運行失敗,則會使FROM指令中斷并導致整個build失敗,當所有的ONBUILD中定義的指令成功完成后,會按正常順序繼續(xù)執(zhí)行build。
④ONBUILD中定義的指令不會繼承到當前引用的鏡像中,也就是當引用ONBUILD的鏡像創(chuàng)建完成后將會清除所有引用的ONBUILD指令。
⑤ONBUILD指令不允許嵌套,例如ONBUILD ONBUILD ADD . /data是不允許的。
⑥ONBUILD指令不會執(zhí)行其定義的FROM或MAINTAINER指令。
13.HEALTHCHECK:健康檢查
14.ARG: 構建時指定的一些參數(shù)
例如:
FROM centos:7
ARG user
USER $user
設置環(huán)境變量除了ENV 外對容器還可能用以下兩種方式 :
docker exec -i CONTAINER_ID /bin/bash -c "export
DOCKER_HOST=tcp://localhost:port"+
echo 'export DOCKER_HOST=tcp://localhost:port' >> ~/.bashrc
注意:
1、RUN在building時運行, 可以寫多條
2、CMD和ENTRYPOINT在運行container時運行, 只能寫一條,如果寫多條,最后一條生效
3、CMD在run時可以被COMMAND覆蓋,ENTRYPOINT不會被COMMAND覆蓋,但可以指定--entrypoint覆蓋。
4、如果在Dockerfile里需要往鏡像內(nèi)導入文件,則此文件必須在dockerfile所在目錄或子目錄下。
1)使用dockerifle制作一個鏡像,基于centos:7鏡像部署安裝nginx服務。
[root@localhost ~]# mkdir web
[root@localhost ~]# rz
[root@localhost ~]# cp nginx-1.14.0.tar.gz web/
[root@localhost ~]# cd web/
//創(chuàng)建測試目錄
[root@localhost web]# vim Dockerfile
FROM centos:7
RUN yum -y install make gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
COPY nginx-1.14.0.tar.gz /
RUN tar -zxf nginx-1.14.0.tar.gz -C /usr/src
RUN useradd -M -s /sbin/nologin nginx
WORKDIR /usr/src/nginx-1.14.0
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx
RUN make && make install
RUN ln -s /usr/local/nginx/sbin/* /usr/local/sbin/
RUN nginx -t
RUN nginx
EXPOSE 80
//如果想要保證容器運行之后,nginx服務就直接開啟,不必手動開啟,我們可以在命令最后加上:nginx -g "daemon off;"
[root@localhost web]# docker build -t test-web .
//創(chuàng)建鏡像
[root@localhost web]# docker images
//查看一下鏡像
[root@localhost web]# docker run -itd --name testweb test-web:latest
[root@localhost web]# docker exec -it testweb /bin/bash
//進入容器testweb
[root@a3a21e68cb99 nginx-1.14.0]# nginx
//開啟nginx
[root@a3a21e68cb99 nginx-1.14.0]# exit
[root@localhost web]# docker inspect testweb
//查看容器testweb的詳細信息(現(xiàn)在看IP)
[root@localhost web]# curl 172.17.0.2:80
//訪問一下nginx
2)將制作的鏡像運行一個容器,使容器運行時自動開啟nginx服務。驗證服務正常運行。
[root@localhost web]# docker run -itd --name testweb_2 test-web:latest nginx -g "daemon off;"
//開啟容器時一并開啟nginx
[root@localhost web]# docker inspect testweb_2
//查看容器testweb_2的詳細信息(現(xiàn)在看IP)
[root@localhost web]# curl 172.17.0.3:80
//訪問一下nginx
3)運行一個私有倉庫,將自制鏡像上傳到私有倉庫,且開啟另外一臺虛擬機同樣加入私有倉庫,在docker02上下載私有倉庫鏡像并運行一個容器,驗證服務正常運行。
[root@localhost web]# docker pull registry:2
//先下載一個鏡像
用docker容器運行registry私有倉庫
[root@localhost web]# docker run -itd --name registry --restart=always -p 5000:5000 -v /registry:/var/lib/registry registry:2
//運行一下registery私有倉庫服務(會返回一個進程編號)
-p:端口映射。宿主機端口:容器暴露的端口。
-v:掛載目錄。宿主機目錄:容器內(nèi)的目錄。
[root@localhost web]# docker ps
//查看一下容器
[root@localhost web]# docker tag test-web1 192.168.1.11:5000/test
//鏡像重命名
[root@localhost web]# docker images
[root@localhost web]# vim /usr/lib/systemd/system/docker.service
//修改docker配置文件
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 #13行
[root@localhost web]# systemctl daemon-reload
[root@localhost web]# systemctl restart docker
//重啟docker
[root@localhost web]# docker ps
//查看容器
[root@localhost web]# docker push 192.168.1.11:5000/test:latest
//上傳私有倉庫
[root@localhost web]# ls/registry/docker/registry/v2/repositories
//查看一下私有倉庫
打開第二臺docker測試一下
39 vim /usr/lib/systemd/system/docker.service
//修改docker配置文件
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 #13行
40 systemctl daemon-reload
41 systemctl restart docker
44 docker pull 192.168.1.11:5000/test:latest
//從私有倉庫下載鏡像
53 docker run -itd --name xgp1 192.168.1.11:5000/test:latest nginx -g "daemon off;"
//開啟容器時一并開啟nginx
54 docker inspect xgp1
//查看容器testweb_2的詳細信息(現(xiàn)在看IP)
56 curl 172.17.0.2
//訪問一下nginx
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。