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