Dockerfile常用指令

Dockerfile常用指令

1.FROM:構建鏡像基於哪個鏡像

語法:FROM <image>[:<tag>]
例如:FROM centos:7
解釋:設置要製作的鏡像基於哪個鏡像,FROM指令必須是整個Dockerfile的第一個指令,如果指定的鏡像不存在默認會自動從Docker Hub上下載。

2.MAINTAINER:鏡像維護者姓名或郵箱地址

語法:MAINTAINER <name>
例如:MAINTAINER adam
解釋:MAINTAINER指令允許你給將要製作的鏡像設置作者信息

3.RUN:構建鏡像時運行的shell命令

  語法: ①RUN <command>        #將會調用/bin/sh -c <command>
       ②RUN ["executable", "param1", "param2"]   #將會調用exec執行,以避免有些時候shell方式執行時的傳遞參數問題,而且有些基礎鏡像可能不包含/bin/sh
             例如:
            RUN [“yum”,”install”,”httpd”]
            RUN yum -y install httpd
  解釋:RUN指令會在一個新的容器中執行任何命令,然後把執行後的改變提交到當前鏡像,提交後的鏡像會被用於Dockerfile中定義的下一步操作,RUN中定義的命令會按順序執行並提交,這正是Docker廉價的提交和可以基於鏡像的任何一個歷史點創建容器的好處,就像版本控制工具一樣。

4.CMD:運行容器時執行的shell命令

  語法:①CMD ["executable", "param1", "param2"]    #將會調用exec執行,首選方式
      ②CMD ["param1", "param2"]        #當使用ENTRYPOINT指令時,爲該指令傳遞默認參數
      ③CMD <command> [ <param1>|<param2> ]        #將會調用/bin/sh -c執行
            例如: CMD [“/bin/bash”]

  解釋:CMD指令中指定的命令會在鏡像運行時執行,在Dockerfile中只能存在一個,如果使用了多個CMD指令,則只有最後一個CMD指令有效。當出現ENTRYPOINT指令時,CMD中定義的內容會作爲ENTRYPOINT指令的默認參數,也就是說可以使用CMD指令給ENTRYPOINT傳遞參數。
  注意:RUN和CMD都是執行命令,他們的差異在於RUN中定義的命令會在執行docker build命令創建鏡像時執行,而CMD中定義的命令會在執行docker run命令運行鏡像時執行,另外使用第一種語法也就是調用exec執行時,命令必須爲絕對路徑。

5.EXPOSE:聲明容器的服務端口

  語法:EXPOSE <port> [ ...]
    例如:EXPOSE 80 443
  解釋:EXPOSE指令用來告訴Docker這個容器在運行時會監聽哪些端口,Docker在連接不同的容器(使用–link參數)時使用這些信息。

6.ENV:設置容器環境變量

  語法:ENV <key> <value>
    例如:ENV MYSQL_ROOT_PASSWORD 123.com
  解釋:ENV指令用於設置環境變量,在Dockerfile中這些設置的環境變量也會影響到RUN指令,當運行生成的鏡像時這些環境變量依然有效,如果需要在運行時更改這些環境變量可以在運行docker run時添加–env <key>=<value>參數來修改。
  注意:最好不要定義那些可能和系統預定義的環境變量衝突的名字,否則可能會產生意想不到的結果。

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 [“源文件”…”目標目錄”]

  注意:①如果執行docker build – < somefile即通過標準輸入來創建時,ADD指令只支持url方式,另外如果url需要認證,則可以通過RUN wget …或RUN curl …來完成,ADD指令不支持認證。
      ②<src>路徑必須與Dockerfile在同級目錄或子目錄中,例如不能使用ADD ../somepath,因爲在執行docker build時首先做的就是把Dockerfile所在目錄包含子目錄發送給docker的守護進程。
      ③如果<src>是一個url且<dest>不是以”/“結尾,則會下載文件並重命名爲<dest>。
      ④如果<src>是一個url且<dest>以“/”結尾,則會下載文件到<dest>/<filename>,url必須是一個正常的路徑形式,“http://example.com”像這樣的url是不能正常工作的。
      ⑤如果<src>是一個本地的壓縮包且<dest>是以“/”結尾的目錄,則會調用“tar -x”命令解壓縮,如果<dest>有同名文件則覆蓋,但<src>是一個url時不會執行解壓縮。

8.COPY:拷貝文件或目錄到鏡像容器內,跟ADD類似,但不具備自動下載或解壓功能

語法:COPY <src> <dest>
解釋:用法與ADD相同,不過<src>不支持使用url,所以在使用docker build – < somefile時該指令不能使用。
ENTRYPOINT
語法:①ENTRYPOINT ["executable", "param1", "param2"]        #將會調用exec執行,首選方式
②ENTRYPOINT command param1 param2             #將會調用/bin/sh -c執行
解釋:ENTRYPOINT指令中指定的命令會在鏡像運行時執行,在Dockerfile中只能存在一個,如果使用了多個ENTRYPOINT指令,則只有最後一個指令有效。ENTRYPOINT指令中指定的命令(exec執行的方式)可以通過docker run來傳遞參數,例如docker run <images> -l啓動的容器將會把-l參數傳遞給ENTRYPOINT指令定義的命令並會覆蓋CMD指令中定義的默認參數(如果有的話),但不會覆蓋該指令定義的參數,例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],當通過docker run <image>啓動容器時該容器會運行ls -a /etc命令,當使用docker run <image> -l啓動時該容器會運行ls -a -l命令,-l參數會覆蓋CMD指令中定義的/etc參數。
注意:①當使用ENTRYPOINT指令時生成的鏡像運行時只會執行該指令指定的命令。
②當出現ENTRYPOINT指令時CMD指令只可能(當ENTRYPOINT指令使用exec方式執行時)被當做ENTRYPOINT指令的參數使用,其他情況則會被忽略。

9.VOLUME: 指定容器掛載點到宿主機自動生成的目錄或其他容器

語法:VOLUME ["samepath"]
例如:VOLUME ["/var/lib/mysql"]
解釋:VOLUME指令用來設置一個掛載點,可以用來讓其他容器掛載以實現數據共享或對容器數據的備份、恢復或遷移,具體用法請參考其他文章。

10.USER:爲RUN、CMD、和ENTRYPOINT執行命令指定運行用戶

語法:USER [username|uid]
解釋:USER指令用於設置用戶或uid來運行生成的鏡像和執行RUN指令。

11.WORKDIR: 爲RUN、CMD、ENTRYPOINT、 COPY和ADD設置工作目錄,意思爲切換目錄

語法:WORKDIR /path/to/workdir
解釋:WORKDIR指令用於設置Dockerfile中的RUN、CMD和ENTRYPOINT指令執行命令的工作目錄(默認爲/目錄),該指令在Dockerfile文件中可以出現多次,如果使用相對路徑則爲相對於WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最終輸出的當前目錄是/data/logs。

12.ONBUILD

 語法:ONBUILD [INSTRUCTION]
  解釋:ONBUILD指令用來設置一些觸發的指令,用於在當該鏡像被作爲基礎鏡像來創建其他鏡像時(也就是Dockerfile中的FROM爲當前鏡像時)執行一些操作,ONBUILD中定義的指令會在用於生成其他鏡像的Dockerfile文件的FROM指令之後被執行,上述介紹的任何一個指令都可以用於ONBUILD指令,可以用來執行一些因爲環境而變化的操作,使鏡像更加通用。
  注意:①ONBUILD中定義的指令在當前鏡像的build中不會被執行。
      ②可以通過查看docker inspeat <image>命令執行結果的OnBuild鍵來查看某個鏡像ONBUILD指令定義的內容。
      ③ONBUILD中定義的指令會當做引用該鏡像的Dockerfile文件的FROM指令的一部分來執行,執行順序會按ONBUILD定義的先後順序執行,如果ONBUILD中定義的任何一個指令運行失敗,則會使FROM指令中斷並導致整個build失敗,當所有的ONBUILD中定義的指令成功完成後,會按正常順序繼續執行build。
      ④ONBUILD中定義的指令不會繼承到當前引用的鏡像中,也就是當引用ONBUILD的鏡像創建完成後將會清除所有引用的ONBUILD指令。
      ⑤ONBUILD指令不允許嵌套,例如ONBUILD ONBUILD ADD . /data是不允許的。
      ⑥ONBUILD指令不會執行其定義的FROM或MAINTAINER指令。

13.HEALTHCHECK:健康檢查
14.ARG: 構建時指定的一些參數

例如:
FROM centos:7
ARG user
USER $user

設置環境變量除了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裏需要往鏡像內導入文件,則此文件必須在dockerfile所在目錄或子目錄下。

小實驗

1)使用dockerifle製作一個鏡像,基於centos:7鏡像部署安裝nginx服務。

[root@localhost ~]# mkdir web
[root@localhost ~]# rz

Dockerfile常用指令

[root@localhost ~]# cp nginx-1.14.0.tar.gz  web/
[root@localhost ~]# cd web/
//創建測試目錄
[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 .
//創建鏡像
[root@localhost web]# docker images
//查看一下鏡像

Dockerfile常用指令

[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的詳細信息(現在看IP)

Dockerfile常用指令

[root@localhost web]# curl 172.17.0.2:80
//訪問一下nginx

Dockerfile常用指令
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的詳細信息(現在看IP)

Dockerfile常用指令

[root@localhost web]# curl 172.17.0.3:80
//訪問一下nginx

Dockerfile常用指令

3)運行一個私有倉庫,將自制鏡像上傳到私有倉庫,且開啓另外一臺虛擬機同樣加入私有倉庫,在docker02上下載私有倉庫鏡像並運行一個容器,驗證服務正常運行。

[root@localhost web]# docker pull registry:2
//先下載一個鏡像

Dockerfile常用指令
用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:掛載目錄。宿主機目錄:容器內的目錄。
[root@localhost web]# docker ps
//查看一下容器

Dockerfile常用指令

[root@localhost web]# docker tag test-web1 192.168.1.11:5000/test
//鏡像重命名
[root@localhost web]# docker images

Dockerfile常用指令

[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
//查看容器

Dockerfile常用指令

[root@localhost web]# docker push 192.168.1.11:5000/test:latest
//上傳私有倉庫

Dockerfile常用指令

[root@localhost web]# ls/registry/docker/registry/v2/repositories
//查看一下私有倉庫

Dockerfile常用指令

打開第二臺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的詳細信息(現在看IP)

Dockerfile常用指令

   56  curl 172.17.0.2
      //訪問一下nginx

Dockerfile常用指令

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章