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的項目。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyYzN1UjN0YTM0ATMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
3.2 DockerHub基于Github自動化建構
3.2.1 将DockerHub賬号與Github賬号關聯
登入DockerHub,點選個人賬号,下拉選擇【Account Settings】,
點選左側菜單的【Linked Accounts】,找到GitHub配置項,點選右邊的【Connect】,頁面跳轉到GitHub授權頁,輸入GitHub賬号密碼授權。
成功後,如下圖
3.2.2 GitHub操作
通過關聯的GitHub賬号,在GitHub上建立一個repository,上傳寫好的Dockerfile。
3.2.3 DockerHub操作
在DockerHub上建立一個repository,并關聯GitHub上剛建立的項目,【Create & Build】
DockerHub上可檢視到DockerHub通過GitHub的Dockerfile建構的一個項目
在Builds頁簽可以看到自動建構資訊。
3.3 釋出到私有的Registry
3.3.1 搭建私有Registry
DockerHub上查找registry,打開第一個項目。
在一台機器上建立一個容器,建立指令如下:
$ docker run -d -p 5000:5000 --restart always --name registry registry:2
3.3.2 打包并釋出的鏡像
将需要釋出的鏡像打包,打包指令如下:
$ docker build -t ip:端口/hello-world .
其中ip為自己搭建私服的機器的ip位址,端口為私服的服務端口,例如5000
使用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
重新開機docker服務
$ service docker restart
$ systemctl daemon-reload
再push,可以push成功。
3.3.3 檢視釋出到私服的鏡像
浏覽器通路http://ip:5000/v2/_catalog,可以檢視到如下内容: