天天看點

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

Docker之鏡像

  • 1. 鏡像管理
  • 2. 建構鏡像
    • 2.1 docker commit指令建立鏡像
    • 2.2 Dockerfile 檔案建立鏡像
  • 3. 釋出鏡像
    • 3.1 釋出到DockerHub
    • 3.2 DockerHub基于Github自動化建構
      • 3.2.1 将DockerHub賬号與Github賬号關聯
      • 3.2.2 GitHub操作
      • 3.2.3 DockerHub操作
    • 3.3 釋出到私有的Registry
      • 3.3.1 搭建私有Registry
      • 3.3.2 打包并釋出的鏡像
      • 3.3.3 檢視釋出到私服的鏡像

鏡像(Image),鏡像是隻讀的,鏡像中包含需要運作的檔案(提供容器運作時所需的程式、庫、資源、配置等檔案,還包含了一些為運作時準備的一些配置參數)。鏡像用來建立container,一個鏡像可以運作多個container;鏡像可以通過Dockerfile建立,也可以從Docker hub/registry上下載下傳。

1. 鏡像管理

列出鏡像

通過docker images指令列出docker主機上可用的鏡像:

$ docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              fce289e99eb9        3 days ago          1.84kB
centos              latest              1e1148e4cc2c        4 weeks ago         202MB
           

查找鏡像

通過docker search指令來查找所有Docker Hub上公共的可用鏡像:

$ docker search redis
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
redis                             Redis is an open source key-value store that…   6354                [OK]                
bitnami/redis                     Bitnami Redis Docker Image                      99                                      [OK]
sameersbn/redis                                                                   75                                      [OK]
...
           

拉取鏡像:

通過docker pull *** 從Docker Hub 拉取鏡像:

$ docker pull redis
Using default tag: latest
latest: Pulling from library/redis
177e7ef0df69: Pull complete 
66ec699db42d: Pull complete 
9af6d87fd347: Pull complete 
de9172cdb09c: Pull complete 
27733a222e28: Pull complete 
ef1ae1903ba4: Pull complete 
Digest: sha256:86654d77602cbfeb873191488d176b215067549b7491364c3f84046f5753f0a0
Status: Downloaded newer image for redis:latest
           

删除鏡像:

通過docker rmi 指令删除docker主機上的鏡像:

## docker rmi <image id> 
$ docker rmi 5d2989ac9711
           

2. 建構鏡像

建構Docker鏡像有以下兩種方法:

  • 1)使用docker commit指令。
  • 2)使用Dockerfile 檔案。

不推薦使用docker commit來建構鏡像,而應該使用更靈活、更強大的Dockerfile來建構Docker鏡像。

2.1 docker commit指令建立鏡像

docker commit 建構鏡像可以想象為是在往版本控制系統裡送出變更。我們先建立一個容器,并在容器裡做出修改,就像修改代碼一樣,最後再将修改送出為一個鏡像。

[[email protected] ~]# docker run -i -t centos /bin/bash
[[email protected] /]# lsof -i:8080
bash: lsof: command not found
[[email protected] /]# yum install lsof
           

我們啟動了一個容器,并在裡面安裝了lsof。使用docker commit指令建立鏡像,需要先使用exit指令從容器裡退出,之後再運作docker commit指令:

[[email protected] ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
013c7cd152f0        centos              "/bin/bash"         7 minutes ago       Exited (1) 13 seconds ago                       quizzical_swartz

[[email protected] ~]# docker commit 013c7cd152f0 test/centos-lsof
sha256:9b132f56464faad7794451276ef13e0e46a15bc05154ee15ddb170479994de43

[[email protected] ~]# docker images test/centos-lsof
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
test/centos-lsof    latest              9b132f56464f        About a minute ago   272MB
           

在使用docker commit指令中,指定了要送出的修改過的容器的ID(可以通過docker ps指令得到剛建立的容器ID),以及一個目标鏡像倉庫和鏡像名,這裡是test/centos-lsof。需要注意的是,docker commit送出的隻是建立容器的鏡像與容器的目前狀态之間有差異的部分,這使得該更新非常輕量。通過docker images 可以檢視新建立的鏡像資訊。

2.2 Dockerfile 檔案建立鏡像

[[email protected] opt]# mkdir centos-lsof
[[email protected] opt]# cd centos-lsof/
[[email protected] centos-lsof]# vim Dockerfile
           

建立一個名為centos-lsof的目錄用來儲存Dockerfile,這個目錄就是我們的建構環境(build environment),Docker則稱此環境為上下文(context)或者建構上下文(build context)。Docker會在建構鏡像時将建構上下文和該上下文中的檔案和目錄上傳到Docker守護程序。這樣Docker守護程序就能直接通路你想在鏡像中存儲的任何代碼、檔案或者其他資料。這裡我們還建立了一個Dockerfile檔案,我們将用它建構一個能作為Web伺服器的Docker鏡像。

Dockerfile檔案内容如下:

FROM centos
RUN yum install -y lsof
           

執行docker build指令時,Dockerfile中的所有指令都會被執行并且送出,并且在該指令成功結束後傳回一個新鏡像。

[[email protected] centos-lsof]# docker build -t="hj/centos-lsof" .
Sending build context to Docker daemon  2.048kB
Step 1/2 : FROM centos
 ---> 1e1148e4cc2c
Step 2/2 : RUN yum install -y lsof
 ---> Running in 608dfe9f6ee5
 ...
Successfully built e713f53bf3cf
Successfully tagged hj/centos-lsof:latest
           
  • -t選項為新鏡像設定了倉庫和名稱,這裡倉庫為hj,鏡像名為centos-lsof。
  • 指令中最後的“.”告訴Docker到目前目錄中去找Dockerfile檔案。也可以指定一個Git倉庫位址來指定Dockerfile的位置,這裡Docker假設在Git倉庫的根目錄下存在Dockerfile檔案。
[[email protected] centos-lsof]# docker build -t="hj/centos-lsof"  [email protected]:hj/centos-lsof
           

建構成功可以通過docker images檢視

[[email protected] centos-lsof]# docker images hj/centos-lsof 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hj/centos-lsof      latest              e713f53bf3cf        5 minutes ago       272MB
           

3. 釋出鏡像

3.1 釋出到DockerHub

首先你得準備一個hub 的帳号,如果沒有,去 https://hub.docker.com 注冊。

登入

[[email protected] opt]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: huangjun02100210
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
           

把 huangjun02100210/centos-lsof鏡像push到docker hub

[[email protected] opt]# docker push huangjun02100210/centos-lsof
The push refers to repository [docker.io/huangjun02100210/centos-lsof]
21d60938f4df: Pushed 
071d8bd76517: Mounted from library/centos 
latest: digest: sha256:4c8afaf02c63eee7aea7a9990e247bfa4b93b3b7d93e329a9a784fd93fcebbee size: 741
           

可以在https://hub.docker.com/看到pull的項目。

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

3.2 DockerHub基于Github自動化建構

3.2.1 将DockerHub賬号與Github賬号關聯

登入DockerHub,點選個人賬号,下拉選擇【Account Settings】,

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

點選左側菜單的【Linked Accounts】,找到GitHub配置項,點選右邊的【Connect】,頁面跳轉到GitHub授權頁,輸入GitHub賬号密碼授權。

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

成功後,如下圖

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

3.2.2 GitHub操作

通過關聯的GitHub賬号,在GitHub上建立一個repository,上傳寫好的Dockerfile。

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

3.2.3 DockerHub操作

在DockerHub上建立一個repository,并關聯GitHub上剛建立的項目,【Create & Build】

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

DockerHub上可檢視到DockerHub通過GitHub的Dockerfile建構的一個項目

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

在Builds頁簽可以看到自動建構資訊。

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

3.3 釋出到私有的Registry

3.3.1 搭建私有Registry

DockerHub上查找registry,打開第一個項目。

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

在一台機器上建立一個容器,建立指令如下:

$ docker run -d -p 5000:5000 --restart always --name registry registry:2
           
03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

3.3.2 打包并釋出的鏡像

将需要釋出的鏡像打包,打包指令如下:

$ docker build -t ip:端口/hello-world .
           

其中ip為自己搭建私服的機器的ip位址,端口為私服的服務端口,例如5000

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

使用docker push 指令将其push到私服

docker push ip:5000/hello-world
           

可能會出現的問題

The push refers to repository [***.***.***.***:5000/hello-world]
Get https://[***.***.***.***:5000/v2/: http: server gave HTTP response to HTTPS client
           

在 /etc/docker建立daemon.json,指令如下

$ cd /etc/docker
$ vi daemon.json
# daemon.json檔案内容如下,ip為自己搭建私服的機器的ip位址
{"insecure-registries":["ip:5000"]}
           

然後修改 /lib/systemd/system/docker.service,添加一行

EnvironmentFile=-/etc/docker/dameon.json
           
03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

重新開機docker服務

$ service docker restart
$ systemctl daemon-reload
           

再push,可以push成功。

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像

3.3.3 檢視釋出到私服的鏡像

浏覽器通路http://ip:5000/v2/_catalog,可以檢視到如下内容:

03-Docker之鏡像1. 鏡像管理2. 建構鏡像3. 釋出鏡像