|NO.Z.00009|——————————|CloudVirtualiZation|——|Cloud&Docker映象.V01|-------------------------------------|DockerFile語法|
阿新 • • 發佈:2022-03-27
[CloudVirtualiZation:Cloud&Docker映象.V01] [Applications.CloudVirtualiZation] [|docker|docker映象|倉庫管理|映象特性|dockerfile|docker倉庫構建|Harbor企業級私有倉庫]
一、docker映象管理
### --- 映象特性: ~~~ 容器在建立時需要指定映象,每個映象都由唯一的表示Image ID, ~~~ 和容器的container ID 一樣,預設是128位,可以使用前16位縮略形式, ~~~ 也可以使用映象名與版本號兩部分組合唯一標識, ~~~ 如果是省略版本號,預設使最新版本標籤(latest)
### --- 映象的分層: ~~~ docker的映象通過聯合檔案系統(union filesystem)將各層檔案系統疊加在一起 ~~~ bootfs:用於系統引導的檔案系統,包括BootLoader 和 kernel, ~~~ 容器啟動完成會被解除安裝以節省記憶體資源 ~~~ roofs:位於bootfs之上,表現為docker容器的根檔案系統 ~~~ 傳統模式中,系統啟動時,核心掛載rootfs時會首先將其掛載為“只讀”模式, ~~~ 完整性自檢完成後將其掛載為讀寫模式 ~~~ docker中rootfs由核心掛載為“只讀”模式,而後通過UFS技術掛載一個“可寫”層
### --- 注:
~~~ 1> Image ID=映象名稱+版本號(唯一標識):若無版本號:預設latest
~~~ 2> 映象通過聯合檔案系統疊加在一起
~~~ 3> bootfs:類似於我們傳統作業系統,正常引導正常解除安裝
~~~ 4> rootfs:在傳統作業系統中由只讀改為讀寫,在docker中掛載為只讀模式,通過UFS(聯合檔案系統) 中掛載為可寫層,有隻讀改為讀寫。
~~~ 5> 已有的分層只讀不能修改,上層映象優先順序大於底層映象。
二、dockerfile:映象的誕生:### --- 容器>映象:docker commit CID XX.XX.XX ~~~ #重點:工作在前臺的守護程序至少一個
### --- DockerFIle:Dockfile是一種被docker程式解釋的指令碼,
~~~ #注:最多不超過128層;若寫入的命令超過128層,可以把相同的命令通過OS/OS結合在一起
~~~ dockerfile由一條一條的指令組成,每條指令對應linux下面的一條命令,
~~~ docker程式將這些dockerfile指令翻譯為真正的linux命令,
~~~ dockerfile有自己的書寫格式和支援的命令。
~~~ docker程式解決這些命令間的依賴關係,類似於Makefile,
~~~ docker程式將讀取dockerfile,
~~~ 根據指令生成定製的image(是建立docker映象的語法;根據語法建立docker映象)
~~~ 生成命令:docker build -t yangqi/jdk-tomcat
~~~ 匯出:docker save -o xx.xx.xx xx.xx.xx.tar
~~~ 匯入:docker load -i xx.xx.xx.tar
三、Dockerfile語法:(yuanjian)
### --- FROM(指定基礎image):
~~~ 構建指令,必須指定且需要在Dockerfile其他指令的前面,
~~~ 後續的指令都依賴與該指令指定的image。
~~~ FROM指令指定的基礎image可以是官方遠端倉庫中的,也可以於本地倉庫。
~~~ # 注:
~~~ 基礎映象,基礎的東西結合,dockerfile中必須有from,且from有且只有一個;
~~~ 有多個會報錯
example:
FROM centos:7.2
FROM centos
### --- MAINTAINER(用來指定映象建立者資訊):
~~~ 構建指令,用於將image的製作者相關的資訊寫入到image中。
~~~ 當我們對該image執行docker inspect命令時,輸出中有相應的欄位記錄該資訊。
example:MAINTAINER
MAINTAINER yanqi“[email protected]”
### --- RUN(安裝軟體用):
~~~ 構建指令,RUN可以執行任何被基礎image支援的命令。
~~~ 如基礎image選擇了Centos,那麼軟體管理部分職能使用Centos的包管理命令
~~~ # 注:
~~~ dockerfile中執行命令時必須要加run,單條命令時不可執行的。
example:
RUN cd/tmp && curl -L 'https://archive.apache.org/dist/tomcat/tomcat-7/v7.0/bin/apache-tomcat-7.0.8.tar.gz'|tar -xz
RUN["/bin/bash"."-c","echo hello"]
### --- CMD(設定container啟動時執行的操作):
~~~ 設定指令,用於container啟動時指定的操作,該操作可以是執行自定義指令碼,
~~~ 也可以是執行系統命令,該指令職能在檔案中存在一次,如果有多個,則只執行最後一條。
~~~ # 注:
~~~ 映象轉換成映象或者容器,該命令只能在指令碼中只能存在一次,若有多個只能執行最後一個,
example:
CMD echo “Hello,World!”
### --- ENTRYPOINT(設定container啟動時執行的操作):
~~~ 設定指令,指定容器啟動時執行的命令,可以多次設定,但是隻有最後一個有效。
example:
ENTRYPOINT ls -l
~~~ 該指令的使用分為兩種情況,一種是獨自使用,另一種和CMD指令配合使用。
~~~ 當獨自使用時,如果你還使用了CMD命令且CMD是 一個完整的可執行命令,
~~~ 那麼CMD指令和ENTRYPOINT會互相覆蓋只有最後一個CMD或者ENTRYPOINT有效。
~~~ CMD指令將不會被執行,只有ENTRYPOINT指令被執行。
CMD echo “Hello,World!”
ENTRYPOINT ls -l
~~~ 另一種用法和CMD指令配置使用來指定ENTRYPOINT的預設引數,
~~~ 這時CMD指令不是一個完整的可執行命令,僅僅是引數部分,
~~~ ENTRYPOINT指令職能使用JSON方式指定執行命令,而不能指定引數
FROM ubuntu
CMD["-1"]
ENTRYPOINT["/usr/bin/ls"]
### --- USER(設定container容器的使用者):
~~~ 設定指令,設定窮容器的使用者,預設是root使用者
example:
USER daemon = ENTRYPOINT["memcached","-u","daemon"]
### --- EXPOSE(指定容器需要對映到宿主機器的埠);
~~~ 設定指令,該指令會將容器中的埠對映成宿主機器中的某個埠,當你需要訪問容器的時候,
~~~ 可以不是用容器的IP地址而是使用宿主機器的IP地址加對映後的埠,
~~~ 要完成整個操作需要兩個步驟,首先是dokerfile使用EXPOSE設定的埠,
~~~ 這樣EXPOSE設定的埠號會被隨機對映成宿主機器中的一個埠號。
~~~ 也可以指定需要對映到宿主機器的那個埠,
~~~ 這時要確保宿主機器上的埠號沒有被使用,EXPOSE指令可以一次設定多個埠號,
~~~ 相應的娙容器的時候,可以配套的多次使用-p選項。
~~~ # 注:
~~~ 只起到了一個顯示作用,顯示埠號,若是不加不會顯示,後期通過-p可以指定。
example:
# 對映一個埠
EXPOSE 22
# 相應的執行容器使用的命令
docker run -p port1 image
# 對映多個埠
EXPOSE port1 port2 port3
# 相應的執行容器使用的命令
docker run -p port2 -p port3 image
# 還可以指定需要對映到宿主機器上的某個埠號。
docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3 image
### --- ENV(用於設定環境變數):構建指令,在image中設定一個環境變數
~~~ 設定了後,後續的RUN命令都可以使用。container啟動後,
~~~ 可以通過docker inspect檢視這個環境變數,也可以通過docker run --env key=value
~~~ 時設定或修改環境變數。假如你安裝了JAVA程式,需要設定JAVA_HOME,
~~~ 那麼可以在Dockerfile中這樣寫:
example:
ENV JAVA_HOME/path/to/java/dirent
### --- ADD(從src複製檔案到container的destination路徑)
example:
ADD<src><dest>
<src>是相對被構建的源目錄的相對路徑,可以是檔案或者是目錄的路徑。也可以是一個遠端的檔案url:
<dest>是container中的絕對路徑
### --- COPY(從src複製檔案到container的destination路徑)
~~~ # 注:
~~~ copy不支援URL,
example:
COPY<src><dest>
### --- VOLUME(指定掛載點):
~~~ 設定指令,使容器中的一個目錄具有持久化儲存資料的功能,該目錄可以被容器本身使用,
~~~ 也可以共享給其他容器使用。我們知道容器使用的是AUFS,這種檔案系統不能持久化資料,
~~~ 當容器關閉後,所有的更改都會丟失,當容器中的應用有持久化資料的需要時可以在Dockerfile中使用該指令。
example:
FROM base
VOLUME["/tmp?data"]
### --- WORKDIR(切換目錄):
~~~ 設定指令,可以多次切換(相當於cd)命令,對RUN,CMD,ENTRYPOINT生效。
example:
WORKEDR/pl WORKEIR p2 RUN vim a.txt
### --- ONBUILD(在子映象中執行):ONBUILD指定的命令在構建映象時並不執行,
~~~ 而是在它的子映象中執行。
example:
ONBUILD ADD ./APP/src
ONBUILD RUN /usr/local/bin/python-build --dir/app/src
===============================END===============================
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart ——W.S.Landor
來自為知筆記(Wiz)