制作好的鏡像要被別人使用,有三種方式:
1.先備份鏡像,別人通過u盤或者其它方式拷貝后,再恢復鏡像,這種方式比較麻煩
2.將制作的鏡像上傳到公共鏡像倉庫,被別人拉取后使用,但可能存在網絡不通暢或者安全性問題
3.將制作的鏡像上傳到私有鏡像倉庫,被內部人員拉取后使用
下面我將介紹下這三種的具體操作步驟
文章目錄
- 鏡像備份,再恢復
- 第一步:鏡像備份
- 第二步:鏡像恢復
- 公共倉庫上傳再拉取
- 注冊docker hub倉庫
- 創建倉庫repository
- 上傳鏡像到倉庫
- 驗證上傳的鏡像
- 退出登錄
- 私有倉庫上傳再拉取
- 拉取私有倉庫鏡像
- 修改配置
- 重新加載配置信息以及重啟docker服務
- 創建私有倉庫的容器
- 推送鏡像到私有倉庫
- 配置私有倉庫認證
- 創建證書存儲目錄
- 生成自簽名證書命令
- 生成鑒權文件
- 創建私有倉庫容器
- 驗證是否添加認證成功
- 登錄私有倉庫
- 上傳鏡像
- 登出私有倉庫
- 總結
鏡像備份,再恢復
鏡像遷移涉及到兩個步驟,備份和恢復。
我們可以將任何一個Docker鏡像從一臺機器遷移到另一臺機器。在遷移的過程中,首先我們把容器構建為Docker鏡像。然后,該Docker鏡像被作為tar包文件保存到本地。此時只需要拷貝或移動該鏡像到我們想要的機器上,恢復該鏡像并運行容器即可
第一步:鏡像備份
使用 docker save
將指定的鏡像保存成tar歸檔文件
docker save [OPTIONS] IMAGE [IMAGE…]
docker save -o /root/mycentos7.tar mycentos:7
-o:鏡像打包后的歸檔文件輸出的目錄
第二步:鏡像恢復
使用docker load導入docker save命令導出的鏡像歸檔的文件
docker load [OPTIONS]
docker load -i mycentos7.tar
–input,-i:指定導入的文件
–quiet,-q:精簡輸出信息
公共倉庫上傳再拉取
注冊docker hub倉庫
登錄https://hub.docker.com/signup上注冊
創建倉庫repository
注冊登錄后,點擊repositories選項選擇創建倉庫
到創建倉庫頁面,主要輸入倉庫名稱即可
待創建好以后到轉到自己創建好的倉庫內,里面已經為我們寫好上傳鏡像的指令
docker push cyl01/test-cyl:tagname
上傳鏡像到倉庫
我將本地的mysql5.7鏡像添加到docker hub倉庫內,我首先先登錄docker hub
輸入指令 sudo docker login
執行指令打標簽sudo docker tag mysql:5.7 cyl01/test-cyl:1.0.0
標簽打完后再上傳 sudo docker push cyl01/test-cyl:1.0.0
驗證上傳的鏡像
登錄到docker hub上查看自己的repository,tags標簽頁下出現鏡像1.0.0即上傳成功
退出登錄
通過docker logout
命令退出DockerHub
私有倉庫上傳再拉取
DockerHub為我們提供了官方鏡像和我們上傳的鏡像,我們可以下載機構或者個人提供的鏡像,也可以上傳我們的本地鏡像,但缺點是
1.網絡原因,從dockerHub下載和上傳鏡像速度比較慢
2.安全原因,我們不想被外部人員獲取我們的代碼和配置信息,只允許內部開發人員下載
為了解決以上問題,docker官方提供了registry的鏡像用于搭建本地私有倉庫使用。
拉取私有倉庫鏡像
輸入指令docker pull registry
拉取registry鏡像
修改配置
在etc/docker/daemon.json
添加以下內容,用于讓docker 信任私有倉庫地址,保存退出
{# 192.168.0.120私有倉庫的ip地址,5000是端口號"insecure-registries":["192.168.0.120:5000"]
}
重新加載配置信息以及重啟docker服務
# 重新加載某個服務的配置文件
sudo systemctl daemon-reload
# 重新啟動docker
sudo systemctl restart docker
創建私有倉庫的容器
輸入sudo docker run -di --name registry -p 5000:5000 -v /cyl/docker/docker_registry:/var/lib/registry registry
在瀏覽器輸入http://ip:5000/v2/_catalog,出現如下結果即創建成功
推送鏡像到私有倉庫
先給鏡像設置標簽 docker tag local-image:tagname new-repo:tagname
再將鏡像推送到私有倉庫 docker push new-repo:tagname
例如我要將mysql5.7的鏡像推送私有倉庫
# 打標簽
sudo docker tag mysql:5.7 192.168.0.122:5000/mysql:1.0.0
# 推送
sudo docker push 192.168.0.122:5000/mysql:1.0.0
輸入http://ip:5000/v2/_catalog,私有倉庫下存在了mysql鏡像
配置私有倉庫認證
私有倉庫搭建好了,但是要確保倉庫的安全性,還需要一個安全認證證書,防止發生意想不到的事情。所以需要在搭建私有倉庫的docker主機上生成自簽名證書
創建證書存儲目錄
sudo mkdir -p /usr/local/registry/certs
生成自簽名證書命令
sudo openssl req -newkey rsa:2048 -nodes -sha256 -keyout /usr/local/registry/certs/domain.key -x509 -days 365 -out /usr/local/registry/certs/domain.crt
openssl req
:創建證書簽名請求等功能;
-newkey
:創建 CSR 證書簽名文件和 RSA 私鑰文件;
rsa:2048
:指定創建的 RSA 私鑰長度為 2048;-nodes
:對私鑰不進行加密;-sha256
:使用 SHA256 算法;-keyout
:創建的私鑰文件名稱及位置;-x509
:自簽發證書格式;-days
:證書有效期;-out
:指定 CSR 輸出文件名稱及位置;
通過 openssl 先生成自簽名證書,運行命令以后需要填寫一些證書信息,里面最關鍵的部分是:Common Name (eg, your name or your server's hostname) []:192.168.0.122
,這里填寫的是私有倉庫的地址。
生成鑒權文件
# 創建存儲鑒權密碼文件目錄
sudo mkdir -p /usr/local/registry/auth
# 如果沒有 htpasswd 功能需要安裝 httpd
sudo yum install -y httpd
# 創建用戶和密碼,-c創建文件,-b使用命令行中的密碼,而不是提示輸入密碼,-B強制bcrypt加密密碼(非常安全)
# 第一次生成時使用-c參數創建用戶及密碼文件,下次再生成時無需使用-c參數會追加至文件
sudo htpasswd -cbB /usr/local/registry/auth/htpasswd root root
htpasswd 是 apache http 的基本認證文件,使用 htpasswd 命令可以生成用戶及密碼文件
創建私有倉庫容器
docker run -di --name registry -p 5000:5000 \-v /mydata/docker_registry:/var/lib/registry \-v /usr/local/registry/certs:/certs \-v /usr/local/registry/auth:/auth \-e "REGISTRY_AUTH=htpasswd" \-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \registry
驗證是否添加認證成功
此時在瀏覽器中輸入https:私有倉庫地址:5000/v2/_catalog,需要輸入用戶名和密碼,均為root
此時上傳鏡像時需要先登錄,否則會出現no basic auth credentials異常
登錄私有倉庫
登錄時使用指令sudo docker login -u root -p root ip:5000
注意必須指定私有倉庫地址,否則默認登陸的是docker hub
上傳鏡像
登陸成功后,先打標簽,再上傳
sudo docker tag mysql:5.7 192.168.0.122:5000/mysql:1.0.0
sudo docker push 192.168.0.122:5000/mysql:1.0.0
登陸私有倉庫現在有mysql這個鏡像了
登出私有倉庫
通過docker logout
命令退出私有倉庫
總結
本文主要講解了鏡像遷移的三種方式,鏡像的備份和恢復不好管理且不利于合作開發,公共鏡像倉庫方式由于有網絡和安全方面問題,企業級項目一般不使用,通常企業內一般會自己設置私有倉庫,安全且上傳或下載的速度也比較快。不過使用私有倉庫時也需要進行安全認證,防止意想不到的事情發生