Docker動手教程3.4:容器鏡像構建3

內容摘要

  1. CMD命令的3種格式
  2. ENTRYPOINT的兩種格式
  3. exec和shell兩種格式的區別
  4. 鏡像版本管理
  5. 鏡像分發

CMD命令的3種格式

1、Exec格式

格式:CMD ["命令", "參數1", "參數2",......],例如:CMD ["echo", "hello", "world"]

2、Shell格式

格式: CMD 命令 參數1 參數2 ......,上面已經用到

3、為Entrypoint提供參數

格式:CMD ["參數1", "參數2", ......],上面也已經用到

鑑於第二種和第三種格式都已經使用,只測試下第一種格式

修改 dockerfile,內容如下:

# dockerfile haha
FROM centos
MAINTAINER [email protected]
WORKDIR /mydir
RUN touch mytext
COPY test .
ADD busybox-1_29_0.tar.gz .
ENV VERSION "1.0.2"
CMD ["echo", "I am", "cmd"]

構建鏡像並運行,如下圖:

Docker動手教程3.4:容器鏡像構建3

ENTRYPOINT的兩種格式

ENTRYPOINT只有exec和shell兩種格式,格式和CMD一樣,上面已經使用了兩種格式,不再舉例。

exec和shell兩種格式的區別

主要區別在於: shell格式底層會調用 /bin/sh -c,而exec不會。

測試如下:

修改Dockerfile,內容如下:

FROM centos
MAINTAINER [email protected]
WORKDIR /mydir
RUN touch mytext
COPY test .
ADD busybox-1_29_0.tar.gz .
ENV VERSION "1.0.2"
ENTRYPOINT echo "Hello, $VERSION"

構建鏡像並運行:

Docker動手教程3.4:容器鏡像構建3

從結果可以知道,環境變量被替換。

如果使用exec呢?

修改Docker:

FROM centos
MAINTAINER [email protected]
WORKDIR /mydir
RUN touch mytext
COPY test .
ADD busybox-1_29_0.tar.gz .
ENV VERSION "1.0.2"
ENTRYPOINT ["/bin/echo", "Hello, $VERSION"]

構建鏡像並運行:

Docker動手教程3.4:容器鏡像構建3

環境變量 VERSION 沒有被替換。

如果希望被替換,做如下修改:

FROM centos
MAINTAINER [email protected]
WORKDIR /mydir
RUN touch mytext
COPY test .
ADD busybox-1_29_0.tar.gz .
ENV VERSION "1.0.2"
ENTRYPOINT ["/bin/sh", "-c", "echo Hello, $VERSION"]

構建並運行:

Docker動手教程3.4:容器鏡像構建3

環境變量又被替換了,由此可見,ENTRYPOINT,底層不會調用/bin/sh -c,需要自己補齊。

對於兩種格式,推薦使用exec格式,因為可讀性好,容易理解

注意:RUN 也可以使用兩種格式。

鏡像版本管理

查看我們先前構建的鏡像,命令為:

docker images
Docker動手教程3.4:容器鏡像構建3

注意REPOSITORY和TAG兩個列,一般而言,鏡像的名稱由兩部分構成:REPOSITORY和TAG,格式如下:

imageName = REPOSITORY:TAG

中間使用冒號分隔開。

如果我們沒有在構建鏡像時,沒有指定TAG的話,會使用默認值:latest,比如上圖的兩個鏡像。

下面我們重新構建下鏡像,並指定TAG:

Docker動手教程3.4:容器鏡像構建3

將構建的鏡像TAG設置為1.0.

一個鏡像可以打多個TAG:

執行如下命令:

docker tag centos-with-busybox:1.0 centos-with-busybox:latest
Docker動手教程3.4:容器鏡像構建3

為該鏡像打latest標籤。

如果有用戶基於 centos-with-busybox:latest 鏡像構建新的鏡像2.0,那麼該如何管理鏡像版本呢?

使用命令設置tag:

docker tag centos-with-busybox:1.0 centos-with-busybox:2.0 
docker tag centos-with-busybox:2.0 centos-with-busybox:latest
Docker動手教程3.4:容器鏡像構建3

此時應當將2.0版本加上TAG latest,更新latest版本,使latest保持為最新的版本。

另外,大家觀察上圖的IMAGE ID列,可以看到前3行數據一樣,多個TAG可以對應一個鏡像

鏡像分發

在本地構建好自己的鏡像後,需要將鏡像保存到倉庫中,這就是鏡像分發。

下面我們將自己構建好的鏡像放到 docker 公共倉庫取,網址為:hub.docker.com。

首先需要在Docker Hub上註冊一個賬號;

在我們的主機上登錄,命令為:

docker login -u 用戶名
Docker動手教程3.4:容器鏡像構建3

登錄成功後,修改TAG,使之於賬號相匹配:

修改TAG方式為,將自己的賬號ID加上,並使用 / 與鏡像名隔開。

接著使用docker push命令將鏡像推上去,命令為:

docker push huqianakls/centos-with-busybox
Docker動手教程3.4:容器鏡像構建3

push成功後,可以去自己的docker倉庫看看該鏡像:

Docker動手教程3.4:容器鏡像構建3

點擊該鏡像,查看詳細信息:

Docker動手教程3.4:容器鏡像構建3

至此,容器鏡像的全部內容就講完了,希望大家能根據課程順序在自己的容器環境上做實驗。

實驗

分別使用CMD、ENTRYPOINT兩種格式構建鏡像;

給鏡像創建不同版本;

將鏡像推送到docker公共倉庫;


分享到:


相關文章: