天天看點

redhat鏡像_三/docker鏡像

  1. 鏡像的結構

1.1 hello-world鏡像為例

redhat鏡像_三/docker鏡像

這個鏡像隻列印了 hello-world

1.2 base 鏡像 : 能提供基本作業系統的鏡像

特點:

1> 不依賴其他鏡像,從scratch開始建構

2>其他鏡像可以在base基礎上擴充 比如centos

redhat鏡像_三/docker鏡像

為什麼大小隻有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 檢視作業系統發行版本

redhat鏡像_三/docker鏡像

1.3 分層結構

docker支援通過擴充現有鏡像,建立新鏡像 (共享資源)

舉個例子:

redhat鏡像_三/docker鏡像

Copy-On-Write特性:

每個鏡像對基礎鏡像的修改都會被限制在單個鏡像内,不會對基礎鏡像産生影響也不會對使用基礎鏡像的其他鏡像有影響

容器啟動時,會形成一個新的可寫層“容器層”在原鏡像層的頂部,下面的都是“鏡像層”

redhat鏡像_三/docker鏡像

2. 建構鏡像

兩種建構方式:docker commit和用dockerfile建構

2.1 docker commit (無法審計,使用者不清楚建立過程)

運作容器 -》 修改容器 -》---.退出容器---》将容器儲存為新鏡像

docker commit 【src image name 】 【new image name】 儲存鏡像

redhat鏡像_三/docker鏡像

2.2 dockerfile (文本檔案,記錄鏡像建立的所有步驟)

編寫dockerfile -> docker build

redhat鏡像_三/docker鏡像

docker build [new image name] . 最後的. 指名dockerfile的位置 (即build context,不要把多餘檔案放在build context),也可以用-f 指定

redhat鏡像_三/docker鏡像

舉個例子

redhat鏡像_三/docker鏡像
redhat鏡像_三/docker鏡像
redhat鏡像_三/docker鏡像

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]

redhat鏡像_三/docker鏡像

exec : 底層會調用 [command]

redhat鏡像_三/docker鏡像

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