1. 程式人生 > >Docker實踐(六):建立本地映象(commit、Dockerfile)

Docker實踐(六):建立本地映象(commit、Dockerfile)

通常我們自己製作映象都是以某一映象為基礎,在此之上安裝或者定製自己需要的映象,推薦使用Dockerfile

一、commit命令建立本地映象

這邊我們準備在centos為基礎的映象上,安裝jdk,並建立一個txt檔案,然後使用commit命令打成新映象。

  • docker run -t -i centos:啟動一個centos的互動性容器。

  • 乾淨的centos容器中沒有jdk,我們馬上要安裝:yum install java

  • 記錄[[email protected] /]中@後面的Hash值:ae56f6cad215,後面會用到。

這裡寫圖片描述

  • java version:此時我們已經安裝好了JDK1.8。

  • touch test_commit_image.txt:建立一個txt檔案。

  • exit:退出容器。

這裡寫圖片描述

  • docker commit -m="commit jdk" --author="gutianlangyu" ae56f6cad215 gutianlangyu/commit_jdk:v1:使用commit命令將容器裡的所有修改提交到本地庫中,形成以一個全新的映象,會返回新映象的完整ID。

    • 完整ID可以通過docker ps -l -q(用於獲取最近建立的容器ID)命令得到。

    • -m:描述我們此次建立image的資訊。

    • --author:用來指定作者。

    • ae56f6cad215:被修改的基礎映象ID。

    • gutianlangyu/commit_jdk:v1:倉庫名/映象名:TAG名。

這裡寫圖片描述

檢查新映象:如下圖,映象5e0f7204704a中,已經有了jdk1.8、test_commit_image.txt

這裡寫圖片描述

二、Dockerfile建立映象

將需要對映象進行的操作全部寫到一個檔案中,然後使用docker build命令從這個檔案中建立映象。這種方法可以使映象的建立變得透明和獨立化,並且建立過程可以被重複執行。Dockerfile檔案以行為單位,行首為Dockerfile命令,命令都是大寫形式,其後緊跟著的是命令的引數。

Dockerfile檔案例項,本例子並沒有實際意義,只是為了將知識點都覆蓋到,具體含義請看文末附錄一

這裡寫圖片描述

#Version 1.0.1
FROM centos:latest

MAINTAINER ***u "***[email protected]"

#設定root使用者為後續命令的執行者
USER root

#執行操作
RUN yum update -y
RUN yum install -y java

#使用&&拼接命令
RUN touch test.txt && echo "abc" >>abc.txt

#對外暴露埠
EXPOSE 80 8080 1038

#新增檔案
ADD abc.txt /opt/

#新增資料夾
ADD /webapp /opt/webapp

#新增網路檔案
ADD https://www.baidu.com/img/bd_logo1.png /opt/

#設定環境變數
ENV WEBAPP_PORT=9090

#設定工作目錄
WORKDIR /opt/

#設定啟動命令
ENTRYPOINT ["ls"]

#設定啟動引數
CMD ["-a", "-l"]

#設定卷
VOLUME ["/data", "/var/www"]

#設定子映象的觸發操作
ONBUILD ADD . /app/src
ONBUILD RUN echo "on build excuted" >> onbuild.txt

使用build命令來構建映象:

  • docker build -t gutianlangyu/test:build_dockerfile_test .

這裡寫圖片描述

這裡寫圖片描述

    • -t引數用來指定映象的名稱空間、倉庫名及TAG。這個值可以在映象建立成功之後通過tag命令修改。

    • 事實上是建立一個映象的兩個名稱引用,指向的是同一個映象實體bc27aeae40dd,如下圖:

這裡寫圖片描述

    • 緊跟-t引數的是Dockerfile檔案所在的相對目錄,本例使用的是當前目錄,即“.”

三、Dockerfile-GitHub

可以把dockerfile放在github上,我的地址是https://github.com/gubaijin/docker/blob/master/dockerfile,clone地址是https://github.com/gubaijin/docker.git

執行命令:docker build -t gutianlangyu/test:build_dockerfile_test_github https://github.com/gubaijin/docker.git,你們直接執行也可以成功。

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

PS:這裡Dockerfile檔案被我定義成了dockerfile,在後面一章中會影響自動化構建,已經被我改為Dockerfile,請悉知!!!

附錄一:

  • FROM:指定待擴充套件的父級映象(基礎映象)。除了註釋以外,在檔案開頭必須是一個FROM指令,接下來的指令便在這個父級映象的環境中執行,直到遇到下一個FROM指令。通過新增多個FROM命令,可以在同一個Dockerefile檔案中建立多個映象。

  • MAINTAINER:宣告建立的映象的作者資訊。使用者名稱、郵箱。非必須。

  • RUN:用來修改映象的命令,常用來安裝庫、程式以及配置程式。一條RUN指令執行完畢後,會在當前映象上建立一個新的映象層,接下來對的指令會在新的映象上繼續執行。RUN 語句有兩種形式:

    • RUN yum update:是在/bin/sh環境中執行的指令的命令

    • RUN ["yum", "update"]:直接使用系統呼叫exec來執行行。

    • RUN yum update && yum install nginx:使用&&符號將多條命令連線在同一條RUN語句中。

  • EXPOSE:用來指明容器內程序對外開放的埠,多個埠之間使用空格隔開。執行容器時,通過引數-P(大寫)即可將EXPOSE裡所指定的埠對映到主機上另外的隨機埠,其他容器或主機就可以通過對映後的埠與此容器通訊。同時,我們也可以通過-p(小寫)引數將Dockerfile中EXPOSE中沒有列出的埠設定成公開的。

  • ADD:向新映象中新增檔案,這個檔案可以是一個主機檔案,也可以是一個網路檔案,也可以使一個資料夾。

    • 第一個引數:原始檔(夾)。如果是相對路徑,它必須是相對於Dockerfile所在目錄的相對路徑。如果是URL,會先下載下來,再新增到映象裡去。

    • 第二個引數:目標路徑。如果原始檔是主機上zip或者tar形式的壓縮檔案,Docker會先解壓縮,然後將檔案新增到映象的指定位置。如果原始檔是一個通過URL指定的網路壓縮檔案,則不會解壓。

  • VOLUME:在映象裡建立一個指定路徑(檔案或資料夾)的掛載點,這個容器可以來自主機或者其它容器。多個容器可以通過同一個掛載點共享資料,即便其中一個容器已經停止,掛載點也仍熱可以訪問。

  • WORKDIR:為接下來執行的指令指定一個新的工作目錄,這個目錄可以使絕對目錄,也可以是相對目錄。根據需要,WORKDIR可以被多次指定。當啟動一個容器時,最後一條WORKDIR指令所指的目錄將作為容器執行的當前工作目錄。

  • ENV:設定容器執行的環境變數。在執行容器的時候,通過-e引數可以修改這個環境變數值,也可以新增新的環境變數:

    docker run -e WEBAPP_PORT=8000 -e WEBAPP_HOST=www.example.com ...

  • CMD:用來設定啟動容器時預設執行的命令。

  • ENTRYPOINT:與CMD類似,也是用來指定容器啟動時的預設執行的命令。區別在於:執行容器時新增在映象之後的引數,對ENTRYPOINT是拼接,CMD是覆蓋。

    • ENTRYPOINT [ "ls", "-l"]

    • docker run centos ==> docker run centos ls -l

    • docker run centos -a ==> docker run centos ls -l -a

      • 我們在執行容器的時候可以通過--entrypoint來覆蓋Dockerfile中的指定:docker run gutianlangyu/test --entrypoint echo "hello world"
  • USER:為容器的執行及接下來RUN、CMD、ENTRYPOINT等指令的執行指定使用者或UID。

  • ONBUILD:觸發器指令。構建映象時,Docker的映象構建器會將所有的ONBUILD指令指定的命令儲存到映象的元資料中,這些命令在當前映象的構建過程中並不會執行。只有心的映象使用FROM指令指定父映象為這個映象時,便會觸發執行。

    • 使用FROM以這個Dockerfile構建出的映象為父映象,構建子映象時:

    • ONBUILD ADD . /app/src:自動執行ADD . /app/src