- 鏡像的結構
1.1 hello-world鏡像為例
這個鏡像隻列印了 hello-world
1.2 base 鏡像 : 能提供基本作業系統的鏡像
特點:
1> 不依賴其他鏡像,從scratch開始建構
2>其他鏡像可以在base基礎上擴充 比如centos
為什麼大小隻有200M?
linux系統包括:
1> 核心空間 kernel :linux啟動時加載bootfs,之後解除安裝
2>使用者空間:檔案系統是rootfs
base鏡像kernel用host的kernel,隻需要自己提供rootfs.不同linux發行版的差別在于rootfs
ps: base鏡像隻是在使用者空間和發行版移植,kernel版本和發行版不同,和host版本一緻(是以容器的kernel依賴于host的kernel,且在容器中沒法更新)
uname -r 檢視系統核心版本
cat /etc/redhat-release 檢視作業系統發行版本
1.3 分層結構
docker支援通過擴充現有鏡像,建立新鏡像 (共享資源)
舉個例子:
Copy-On-Write特性:
每個鏡像對基礎鏡像的修改都會被限制在單個鏡像内,不會對基礎鏡像産生影響也不會對使用基礎鏡像的其他鏡像有影響
容器啟動時,會形成一個新的可寫層“容器層”在原鏡像層的頂部,下面的都是“鏡像層”
2. 建構鏡像
兩種建構方式:docker commit和用dockerfile建構
2.1 docker commit (無法審計,使用者不清楚建立過程)
運作容器 -》 修改容器 -》---.退出容器---》将容器儲存為新鏡像
docker commit 【src image name 】 【new image name】 儲存鏡像
2.2 dockerfile (文本檔案,記錄鏡像建立的所有步驟)
編寫dockerfile -> docker build
docker build [new image name] . 最後的. 指名dockerfile的位置 (即build context,不要把多餘檔案放在build context),也可以用-f 指定
舉個例子
2.3 緩存特性 (建構新鏡像時,如果某鏡像層已經存在直接使用,無須重新建立)
如果希望不用緩存,在docker build 加上 --no-cache參數
鏡像上層依賴于下層,下層發生變化,上層的緩存就失效了
2.4 dockerfile 指令
FROM 指定base
MAINTAINER 作者
COPY COPY src dest 或者 COPY ["src", "dest"] src的檔案或者目錄必須位于build context
ADD 類似COPY,差別:壓縮包會自動解壓到dest
ENV 環境變量, 可以被後面的指令使用
EXPOSE 放開端口 ???
VOLUME 将檔案或目錄聲明為volume????
WORKDIR 為RUN/CMD/ENTRYPOINT/ADD/COPY指令設定鏡像中的目前工作目錄, 不存在時會自動建立
RUN 在容器中運作指令
CMD 在容器啟動時運作指令,可以有多個,但是隻有最後一個生效
ENTRYPOINT 容器啟動時運作指令,可以有多個,但是隻有最後一個生效
3.RUN vs CMD vs ENTRYPOINT
CMD / ENTRYPOINT 最好用exec ,shell兩種都可
3.1 Shell 和Exec 格式 (指定三者運作指令的格式)
shell : 底層會調用 /bin/bash -c [command]
exec : 底層會調用 [command]
3.2 RUN 通常用于裝包和應用
3.3 CMD
1>多個CMD,隻有最後一個生效
2> 如果docker run 指定了其他指令, CMD指定的預設指令會被忽略(可以為ENTRYPOINT提供預設參數)
3.4 ENTRYPOINT:
讓容器以應用程式或者服務形式運作,不會被忽略一定執行
4.分發鏡像
4.1 命名
【image name】= [repository]:[tag]
tag 預設為latest, 沒有特殊含義,多用版本号作為tag
docker tag repository repository:tag
4.2 使用公共registry
将本地鏡像push 到docker hub (公共repository免費, 私有repository)
1>注冊 docker hub
2> 本地登入docker hub
3>修改鏡像repository
[username]/[image ]: tag
4> docker push [username]/[image ]: tag
4.3搭建本地registry