簡介
本文主要講述在CentOS 8上面搭建Docker鏡像倉庫的步驟。
在實際項目過程中,項目產生的鏡像需要部署至目標服務器,鏡像和目標服務器之間需要使用一個鏡像倉庫作為鏡像的存儲中介,提供鏡像的上傳、下載、保存。
下面介紹搭建本地Docker鏡像倉庫的步驟。
安裝Docker
本文使用的Docker版本為19.03.12,使用國內的相關安裝鏡像包安裝,這里使用的時阿里雲的鏡像站點。
添加docker yum源
# 安裝必要依賴
yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加aliyum docker-ce yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 重建yum緩存
yum makecache
安裝docker
# 安裝指定版本docker,這里以19.03.12為例說明
yum install -y docker-ce-19.03.12-3.el7
# 執行此命令后可能會出現錯誤如下:
Last metadata expiration check: 0:01:15 ago on Wed 26 Aug 2020 06:00:10 PM PDT.
Error:
Problem: package docker-ce-3:19.03.12-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed
- conflicting requests
- package containerd.io-1.2.10-3.2.el7.x86_64 is filtered out by modular filtering
- package containerd.io-1.2.13-3.1.el7.x86_64 is filtered out by modular filtering
- package containerd.io-1.2.13-3.2.el7.x86_64 is filtered out by modular filtering
- package containerd.io-1.2.2-3.3.el7.x86_64 is filtered out by modular filtering
- package containerd.io-1.2.2-3.el7.x86_64 is filtered out by modular filtering
- package containerd.io-1.2.4-3.1.el7.x86_64 is filtered out by modular filtering
- package containerd.io-1.2.5-3.1.el7.x86_64 is filtered out by modular filtering
- package containerd.io-1.2.6-3.3.el7.x86_64 is filtered out by modular filtering
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
# 錯誤原因:需要安裝高版本的containerd.io
# 解決措施:可以安裝最新的containerd.io,但是使用官方的下載安裝時比較慢,可以使用迅雷等下載工具將此安裝包下載后上傳至服務器安裝
# 這里使用xshell連接服務器為例執行,具體命令如下:
yum install lrzsz
mkdir software
cd software/
rz
yum localinstall -y containerd.io-1.2.6-3.3.el7.x86_64.rpm
# 重新執行安裝docker命令,安裝成功
yum install -y docker-ce-19.03.12-3.el7
確保網絡模塊開機自動加載
由於需要使用遠程訪問,因此需要使用網絡模塊,並且要保證此模塊開機自動啟動。
lsmod | grep overlay
lsmod | grep br_netfilter
若上面的命令無返回值輸出或提示文件不存在,需要執行以下命令:
cat > /etc/modules-load.d/docker.conf <<EOF
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
使橋接流量對iptables可見
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
# 驗證是否生效,下面兩個命令結果需均返回 1
sysctl -n net.bridge.bridge-nf-call-iptables
sysctl -n net.bridge.bridge-nf-call-ip6tables
配置docker
mkdir /etc/docker
# 修改cgroup驅動為systemd[k8s官方推薦]、限制容器日志量、修改存儲類型,最后的docker根目錄可修改
# 下面文件中第一行insecure-registries的值需要修改為對應機器的IP地址
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"registry-mirrors": ["https://7uuu3esz.mirror.aliyuncs.com"],
"data-root": "/data/docker"
}
EOF
# 添加開機自啟動,立即啟動
systemctl enable --now docker
驗證docker是否正常
# 查看docker信息,判斷是否與配置一致
docker info
# hello-docker測試
docker run --rm hello-world
# 刪除測試的image
docker rmi hello-world
添加用戶到docker組
非root用戶,無需sudo即可使用docker命令。
# 添加用戶到docker組,此處zgs為其他賬號信息
usermod -aG docker zgs
# 當前會話立即更新docker組
newgrp docker
至此,Docker已經安裝完成,下面配置Docker鏡像倉庫。
搭建Docker私有倉庫
使用registry鏡像類配置我們的私有倉庫,即搭建私有倉庫使用的組件也是一個docker鏡像。
下載registry鏡像
這里使用registry的版本為2,拉取對應鏡像,也可以從hub.daocloud.io
站點上查看對應的版本並獲取對應鏡像。
# 拉去registry倉庫
docker pull registry:2
# 查看鏡像拉取結果
docker images
# 拉取的鏡像
REPOSITORY TAG IMAGE ID CREATED SIZE
registry 2 2d4f4b5309b1 2 months ago 26.2MB
啟動registry鏡像
啟動registry鏡像時需要注意下面幾點:
- 開機啟動,設置restart屬性為always
- 目錄掛載,默認上傳的鏡像文件是存放在registry鏡像運行是container的內部,如果容器消亡,對應的文件也消失,因此要將其目錄映射到宿主機的目錄上面
- 端口映射,映射宿主機的5000端口到容器的5000端口
# 在宿主機創建掛在目錄
cd ~
mkdir data
cd data/
mkdir docker
cd docker/
mkdir registry
cd registry
pwd
# 啟動registry鏡像
docker run -d -v /root/data/docker/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2
# 查看啟動的容器
docker ps
# registry已啟動
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8e6516273466 registry:2 "/entrypoint.sh /etc…" 4 seconds ago Up 2 seconds 0.0.0.0:5000->5000/tcp registry
驗證是否部署成功
訪問http://192.168.43.131:5000/v2/
地址,如果出現下面的結果證明私有倉庫部署成功。
{}
可以訪問http://192.168.43.131:5000/v2/_catalog
地址查看倉庫中的鏡像信息,目前我們的倉庫中沒有鏡像,顯示結果如下:
{"repositories":[]}
鏡像的上傳與下載
鏡像上傳
使用另外一台宿主機,將其nginx的鏡像,上傳至鏡像倉庫測試,並確認上傳后的結果。
# 下載nginx鏡像,實際需要使用自己打包好的鏡像文件
docker pull daocloud.io/library/nginx:1.7.8
# 重新給鏡像打標簽,注意:更新后的鏡像標簽一定要以鏡像倉庫的IP地址和端口號作為前綴,是否可以使用域名代替IP地址需要驗證
docker tag daocloud.io/library/nginx:1.7.8 192.168.43.131:5000/test:v01
# 鏡像列表如下
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.43.131:5000/test latest a343d51dff65 5 years ago 91.7MB
daocloud.io/library/nginx 1.7.8 a343d51dff65 5 years ago 91.7MB
# 將鏡像上傳至鏡像倉庫
docker push 192.168.43.131:5000/test
# 返回結果如下,出現了錯誤,錯誤信息如下
The push refers to repository [192.168.43.131:5000/test]
Get https://192.168.43.131:5000/v2/: http: server gave HTTP response to HTTPS client
# 解決方法請參考下面的章節
解決之后,重新執行推送鏡像命令,結果如下:
# 推送鏡像,可以在鏡像名稱后面添加版本號:v1,默認為latest
docker push 192.168.43.131:5000/test
# 推送鏡像執行結果
The push refers to repository [192.168.43.131:5000/test]
5f70bf18a086: Pushed
242390e67cbf: Pushed
fc521005216a: Pushed
6f0124c2157c: Pushed
5a29dcc5d0b4: Pushed
6607e4d8ecb7: Pushed
8b116ab6d885: Pushed
latest: digest: sha256:5e3e9ea21051fcb23c6ede0b2c59b950bea07701db6360cff5e556636d3d48f2 size: 3012
可以通過域名地址驗證鏡像是否推送成功。
# 查看鏡像列表
http://192.168.43.131:5000/v2/_catalog
# 執行結果
{"repositories":["test"]}
# 查看指定鏡像的各個版本
http://192.168.43.131:5000/v2/{鏡像名稱}/tags/list
http://192.168.43.131:5000/v2/test/tags/list
# 執行結果
{"name":"test","tags":["latest"]}
解決http: server gave HTTP response to HTTPS client
由於docker鏡像拉取與推送服務使用的是https協議,但是倉庫服務器上面沒有配置https證書,可以修改客戶端
的配置,使用http協議進行通信。
# 修改/etc/docker下的daemon.json配置文件,添加服務端的IP和端口配置,在文件中添加下面的命令:
"insecure-registries": ["192.168.43.131:5000"]
# 修改后de daemon.json文件如下所示:
{
"insecure-registries": ["192.168.43.131:5000"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"registry-mirrors": ["https://7uuu3esz.mirror.aliyuncs.com"],
"data-root": "/data/docker"
}
重新啟動客戶端docker服務即可。
systemctl restart docker
鏡像下載
先將我們本地的192.168.43.131:5000/test
和daocloud.io/library/nginx
先刪除掉。
docker rmi 192.168.43.131:5000/test:latest
docker rmi daocloud.io/library/nginx:1.7.8
查看本地的鏡像列表中已經沒有對應鏡像,使用下面命令從鏡像服務器上下載鏡像。
# 從鏡像服務器上下載鏡像
docker pull 192.168.43.131:5000/test:latest
# 執行結果
latest: Pulling from test
4f4fb700ef54: Pull complete
9a1209a4c986: Pull complete
95a23bb7571d: Pull complete
3f6b880dd9d0: Pull complete
08f502ddc2a2: Pull complete
5db29f58d80d: Pull complete
acf00ce452a6: Pull complete
Digest: sha256:5e3e9ea21051fcb23c6ede0b2c59b950bea07701db6360cff5e556636d3d48f2
Status: Downloaded newer image for 192.168.43.131:5000/test:latest
192.168.43.131:5000/test:latest
查看本地鏡像列表中已經存在對應鏡像。
# 查看鏡像列表
docker images
# 執行結果
REPOSITORY TAG IMAGE ID CREATED SIZE
192.168.43.131:5000/test latest a343d51dff65 5 years ago 91.7MB
結束
至此,Docker鏡像倉庫服務器已經搭建完成。