1. 程式人生 > 實用技巧 >Docker——dockerfile

Docker——dockerfile

  1. dockerFile介紹

    dockerFile是用來構建docker映象的檔案!命令引數指令碼!

    步驟:

    • 編寫dockerFile檔案
    • docker build構建成為一個映象
    • docker run執行映象
    • docker push釋出映象(DockerHub,阿里雲映象倉庫)

    檢視官方製作的dockerFile

    • 在hub.docker上搜索centos

    • 選擇某個版本的centos,隨後跳轉到github上

    •   
      FROM scratch  #最底層
      ADD centos-8-x86_64.tar.xz /
      LABEL 	org.label-schema.schema-version="1.0"     
              org.label-schema.name="CentOS Base Image"     
              org.label-schema.vendor="CentOS"     
              org.label-schema.license="GPLv2"     
              org.label-schema.build-date="20200809"
      CMD ["/bin/bash"]
      

    dockerFile與dockerImages,docker容器的關係:

    • dockerFile用於構建生成映象,也就是最終釋出和執行的產品
    • docker容器是docker映象實際執行的一個個獨立的服務

    基礎知識:

    • 每個保留關鍵字(指令)都必須是大寫字母
    • 執行從上到下順序執行
    • 表示註釋

    • 每一個指令都會建立提交一個新的映象層
  2. dockerFIle指令

    FROM         # 基礎映象
    MAINTAINER   # 維護者資訊(姓名+郵箱)
    RUN          # 映象構建時的命令
    ADD          # 需要新增的其它環境,如:tomcat壓縮包,會自動解壓
    WORKDIR		 # 映象的工作目錄(如一開始就進入的目錄)
    VOLUME       # 需要掛載的目錄
    EXPOSE       # 暴露埠(可以替代-p)
    CMD          # 指定容器啟動的時候要執行的命令,只有最後一個會生效,可被替代(即從外部呼叫docker run指令且攜帶引數時,引數會替代dockerFile中的指令)
    ENTRYPOINT   # 指定容器啟動的時候要執行的命令,可以追加命令(與上面的不同,不會被替代,而是追加)
    ONBUILD      # 當構建一個被繼承DockerFile的時候,會執行ONBUILD的指令
    COPY         # 類似ADD,當我們檔案拷貝到映象中
    ENV          # 構建的時候設定環境變數
    

    測試:

    #1,編寫dockerFile檔案
    FROM centos              #基於centos構建
    MAINTAINER arno<[email protected]>
    ENV MYPATH /user/local   #設定環境變數
    WORKDIR $PATH            #設定工作目錄
    RUN yum -y install vim   #RUN命令應該是在映象構建的時候執行的,添加了一些新功能
    RUN yum -y install net-tools
    EXPOSE 80                #暴露的埠
    CMD echo $MYPATH
    CMD echo "---end---"
    CMD /bin/bash
    
    #2.構建映象
    [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f mydockerfile -t newcentos .
    
    #3.檢視映象
    [root@iZwz908j8pbqd86doyrez5Z test]# docker images
    REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
    newcentos             latest              ded9efb6e766        3 minutes ago       295MB
    
    #4.執行映象
    [root@iZwz908j8pbqd86doyrez5Z test]# docker run -P -d -it newcentos
    [root@iZwz908j8pbqd86doyrez5Z test]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
    4ce4eebf72f9        newcentos           "/bin/sh -c /bin/bash"   7 seconds ago       Up 7 seconds        0.0.0.0:32773->80/tcp   sad_ride  #可以看到執行的是80埠
    [root@iZwz908j8pbqd86doyrez5Z test]# docker attach 4ce4eebf72f9
    [root@4ce4eebf72f9 local]#            #可以看到進入的是/usr/local這一工作目錄
    [root@4ce4eebf72f9 local]# ifconfig   #成功在基礎的centos上添加了一些新功能(RUN)
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.10  netmask 255.255.0.0  broadcast 172.17.255.255
            ether 02:42:ac:11:00:0a  txqueuelen 0  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    
    #5.檢視映象固構建的歷史
    [root@iZwz908j8pbqd86doyrez5Z test]# docker history newcentos
    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
    ded9efb6e766        12 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
    345196631c6a        12 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
    86451430c08f        12 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
    11948d022259        12 minutes ago      /bin/sh -c #(nop)  EXPOSE 80                    0B                  
    99c8922d054b        12 minutes ago      /bin/sh -c yum -y install net-tools             22.8MB              
    b43f395d0d9e        12 minutes ago      /bin/sh -c yum -y install vim                   57.2MB              
    c973079ba70d        13 minutes ago      /bin/sh -c #(nop) WORKDIR /usr/local            0B                  
    ff143e3cb146        13 minutes ago      /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B                  
    eee54c129432        13 minutes ago      /bin/sh -c #(nop)  MAINTAINER arno<114303778…   0B                  
    0d120b6ccaa8        4 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
    <missing>           4 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
    <missing>           4 weeks ago         /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d…   215MB
    

    docker history:檢視映象的變更歷史(構建過程,配置引數)

  3. CMD命令與ENTRYPOINT區別

    比較思路,cmd中的“ls -a”可以列出所有的目錄,"ls -al"可以列出所有目錄的詳細資訊.我們分別用CMD和ENTRYPOINT命令構建映象,然後在執行容器時嘗試新增"-l引數",檢視執行結果

    (1).CMD

    #1.編寫dockerfile檔案
    FROM centos
    CMD ["ls","-a"]  #複雜命令用[]包裹
    
    #2.構建映象
    [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f dockerfiletest1 -t dockerfiletest1 .
    
    #3.執行容器
    [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest1
    .
    ..
    ...
    
    #4.嘗試新增引數執行——失敗,因為沒有"ls -l"指令
    [root@iZwz908j8pbqd86doyrez5Z test]# docker run -l dockerfiletest1
    "docker run" requires at least 1 argument.
    

    (2).ENTRYPOINT

    #1.編寫dockerfile檔案
    FROM centos
    ENTRYPOINT ["ls","-a"]  #複雜命令用[]包裹
    
    #2.構建映象
    [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f dockerfiletest2 -t dockerfiletest1 .
    
    #3.執行容器
    [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest2
    .
    ..
    ...
    
    #4.嘗試新增引數執行
    [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest2 -l
    total 56
    drwxr-xr-x   1 root root 4096 Sep 13 01:17 .
    ...
    

    區別:

    • docker run的命令的引數是覆蓋CMD指令的引數
    • docker run的命令的引數是追加ENTRYPOINT指令的引數後
  4. 使用duockerfile製作Tomcat映象(最難的一部分)

    準備工作:tomcat壓縮包,jdk壓縮包

    #1.編寫Dockerfile檔案
    FROM centos
    MAINTAINER arno<[email protected]>
    
    COPY readme.txt /usr/local/readme.txt  #新增readme目錄
    
    ADD jdk-8u261-linux-x64.tar.gz /usr/local/  #新增安裝包,會自動解壓
    ADD apache-tomcat-9.0.37.tar.gz /usr/local/  #這裡路徑最後應該有"/"
    
    RUN yum -y install vim
    
    ENV MYPATH /usr/local  #工作目錄(使用者一開始進入的目錄)
    WORKDIR $MYPATH
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_261
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37  #centos環境變數
    ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37  #絕對路徑
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
    
    EXPOSE 8080
    
    CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/logs/catalina.out  #啟動apache,同時輸出日誌檔案
    
    #2.構建映象
    docker build -t arno-tomcat .  #因為dockerfile檔名為Dockerfile,所以省略了-f
    
    #3.執行容器
    docker run -d -it -p 9090:8080 -v /usr/arno/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/ROOT -v /usr/arno/tomcat/log:/usr/local/apache-tomcat-9.0.37/logs arno-tomcat #掛載tomcat的對外展示頁面以及日誌的目錄
    
    #4.測試埠
    curl localhost:38775
    
    • 需要準備tar.gz壓縮包,這邊犯了一個比較睿智的問題,x86是32位的,x64是64位的
    • 起名為Dockerfile(預設名),在build的時候-f後面可以不用指定名字
    • 使用COPY命令拷貝檔案到容器內部(比如readme.md)
    • ADD命令新增的壓縮包會自動解壓(一般會將它解壓到/usr/local目錄下)
    • Tomcat沒有執行起來,可以到tomcat/bin目錄下執行catalina.sh run &指令執行
  5. 映象釋出

    釋出到DockerHub

    (1).註冊賬號

    (2).從伺服器登陸docker.hub

    docker login -u usrname -p password
    

    (3).從伺服器提交映象

    [root@iZwz908j8pbqd86doyrez5Z test]# docker tag arno-tomcat8 arnovc/arno-tomcat8  #打上標記
    [root@iZwz908j8pbqd86doyrez5Z test]# docker push arnovc/arno-tomcat8  #將打上標記的映象上傳
    

    注意:

    • 要在映象之前打上id的標記
    • docker tag指令打標記

    阿里雲映象

    準備工作:登陸阿里雲,點開阿里雲映象服務,建立名稱空間,建立映象倉庫,建立容器映象

    #登陸阿里雲(如果有登陸docker.hub,建議先退出)
    docker login --username=亞諾_vc registry.cn-hangzhou.aliyuncs.com
    
    #打上tag
    docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/arno-test/新的映象名:[映象版本號]
    
    #上傳映象
    $ sudo docker push registry.cn-hangzhou.aliyuncs.com/arno-test/映象名:[映象版本號]
    

    注意:

    • 點選倉庫的基本資訊,可以檢視映象推送的步驟
    • [:tag]中的"[]"表示可選項,本身是不用帶上的