1. 程式人生 > 實用技巧 >CentOS 8搭建Docker映象私有倉庫-registry

CentOS 8搭建Docker映象私有倉庫-registry

目錄

簡介

本文主要講述在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/testdaocloud.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映象倉庫伺服器已經搭建完成。