docker私有仓库支持多架构搭建
docker本地仓库,私有仓库,多架构,arm64,amd64,x86,支持根据cpu架构拉取对应的镜像
一、环境说明
1、服务器两台,均为amd64架构,一台可以联网(192.168.230.101),用来下载软件。一台不能联网(192.168.230.102),用来搭建私有仓库
2、操作系统:centos7.7(7.x应该均可)
3、docker:docker-ce-20.10.12-3(2022.3.8最新版,版本最好保持20,否则manifest配置不一样)
二、安装步骤
docker联网安装(101)
1、101上安装docker
清理存在的 docker 软件
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
安装docker 依赖
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
下载 docker 安装所需的 repo 文件
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
安装 docker
yum install docker-ce docker-ce-cli containerd.io
启动 docker
systemctl start docker
设置 开机自启动
systemctl enable docker
查看 docker 是否启动成功
docker version出现如下界面则表示成功启动
2、在101上执行命令
yum install --downloadonly --downloaddir=/tmp/docker docker-ce
下载docker离线安装包至/tmp/docker目录下
3、执行tar -cvf docker.tar /tmp/docker/
得到 docker.tar用于在102上安装docker
4、在101上配置国内镜像源
vim /etc/docker/daemon.json
添加如下内容
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
保存后执行
systemctl daemon-reload
systemctl restart docker
5、在101上下载registry镜像
docker pull registry
6、在101将registry打包镜像
docker save registry:latest > docker-registry.tar
7、将docker-registry.tar
和docker.tar
发送到102服务器上
docker离线安装及私有仓库创建
离线yum源配置(102配置,如已有其他yum源忽略该步骤)
使用iso镜像作为离线yun源,执行命令
mount /dev/cdrom /mnt/
将/etc/yum.repo.d/
下的其他repo全部改为备份
创建 CentOS-local.repo
,添加如下内容
[local]
name=CentOS-$releasever-Base
baseurl=file:///mnt
enabled=1
gpgcheck=0
保存后执行命令 yum makecache
移除当前存在的docker环境
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
安装docker依赖项
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
离线安装docker(102)
1、在102解压docker.tar,进入docker目录内执行命令进行安装(确保102没有安装过docker)
rpm -Uvh --force --nodeps \*rpm
2、启动docker及开机自启(102)
systemctl start docker
systemctl enable docker
执行命令 docker version查看是否启动成功
3、102进入 docker-registry.tar
所在目录内,执行命令
docker load < docker-registry.tar
私有仓库启动
1、102启动registry容器(即私有仓库)
默认情况下,仓库会被创建在容器的/var/lib/registry
目录下(Dockerfile中定义的)。可以通过-v参数来将镜像文件存放在本地的指定路径。
docker run --name registry -d -p 5000:5000 --restart=always -v /opt/data/registry:/var/lib/registry registry
注意/opt/data/registry
要创建一下,也可以指定其他位置
启动后通过docker ps -a看到如下内容即可
通过命令curl 192.168.230.102:5000/v2/_catalog
或浏览器直接访问查看私有仓库中的存在的镜像
2、测试私有仓库可用性
任意的docker-cli端(任何需要和私有仓库打交道的服务器都需要配置)修改配置文件 /etc/docker/daemon.json
如果没有则创建,添加如下内容(如果已配置其他内容,不要修改,增加该配置项即可)
{
"insecure-registries":["192.168.230.102:5000"]
}
注:私有仓库未使用https,而docker客户端执行的是https协议,会导致客户端无法与私有仓库通信,因此需要添加以上配置。
然后执行
systemctl daemon-reload
systemctl restart docker
在101测试推送镜像至私有仓库
docker pull alpine
拉取一个远程镜像(此时自动拉取的是amd64架构的)
docker tag alpine 192.168.230.102:5000/alpine-amd64
给镜像打个标签,ip和端口是私有仓库的地址
docker push 192.168.230.102:5000/alpine-amd64
推送到私有仓库
curl 192.168.230.102:5000/v2/_catalog
查看是否推送成功
也可以到registry容器内查看是否有文件 docker exec -it 容器id /bin/sh
为后续测试多cpu架构镜像创建,此时再拉取一个arm64架构的镜像,推送到私有仓库中,具体操作如下
docker pull --platform arm64 alpine
# 通过platform参数指定镜像架构平台(低版本docker需要开启实验功能才能使用该命令,具体见参考链接中)
docker tag arm镜像id 192.168.230.102:5000/alpine-arm64
docker push 192.168.230.102:5000/alpine-arm64
多cpu架构镜像创建
一些说明:
docker每一个镜像包含了一个这个文件包含了有关于镜像信息,如层、大小和摘要。
docker manifest命令还向用户提供附加信息,比如构建镜像的操作系统和体系结构。
而manifest list是一个镜像清单列表,用于存放多个不同os/arch的镜像信息。我们主要用到manifest的目的,其实还是多用于存放不容的os/arch信息,也就是方便我们在不同的CPU架构(arm或者x86)或者操作系统中,通过一个镜像名称拉取对应架构或者操作系统的镜像,这个尤其是在K8S中,对于异构CPU的服务器中的镜像显得尤为有效。
需要注意的是,manifest文件仅仅是针对于已经在仓库中的镜像!!! 换句话说,就是这个镜像是刚从仓库中pull下来的!如果这个镜像是自己build的,需要先push到仓库中,否则,这个镜像是没有manifest文件的!!同样的,如果你pull了一个镜像,tag了一下,再去看这个manifest文件,也是没有的,因为tag后的镜像不在镜像仓库中。
1、创建一个自定义命名的镜像名的 Manifest list,然后用该列表关联仓库里面的两个不同架构的镜像(注意这里就是说私有仓库中已有这两个镜像,需要在不同架构平台构建镜像后push到仓库中,前边已经push到仓库中了)
docker manifest create --insecure 192.168.230.102:5000/alpine-v1 192.168.230.102:5000/alpine-arm64 192.168.230.102:5000/alpine-amd64
注意带上--insecure
A:192.168.230.102:5000/alpine-v1 这是manifest list地址,名称自定义,地址要写对
B:192.168.230.102:5000/alpine-arm64已经在仓库中存在的镜像地址
C:192.168.230.102:5000/alpine-amd64已经在仓库中存在的镜像地址
A地址是manifest list地址,也就是最后统一了架构后的镜像地址,该地址在仓库中可有可无;B、C则是已经在仓库中有的镜像地址!!此外,这里面还多了一个 --insecure指令,这个指令主要是用来方式你的远端仓库没有https证书的问题,最好加上,否则可能会报错no such manifest: 192.168.230.102:5000/alpine:arm64-latest
如果A地址已经存在,或者说A=B或者A=C,进一步的,也就是你并不想创建一个新的manifest list镜像地址,而是想用已有的镜像地址,那么可以参考这个命令
docker manifest create --insecure --amend xxx/nginx:nginx-arm64 xxx/nginx:nginx-x86
这个命令通过增加–amend选项,将x86的架构信息增加到了arm64架构中
2、声明不同架构镜像对应的操作系统和cpu架构类型,其中x86_64需要用amd64来指定(可以执行也可忽略)
docker manifest annotate 192.168.230.102:5000/alpine-v1 192.168.230.102:5000/alpine-arm64 --os linux --arch arm64
docker manifest annotate 192.168.230.102:5000/alpine-v1 192.168.230.102:5000/alpine-amd64 --os linux --arch amd64
3、将manifest推送到私用仓库中
docker manifest push --insecure 192.168.230.102:5000/alpine-v1
--purge
:末尾添加该参数为推送列表后自动删除本地刚刚创建的列表清单。
docker manifest inspect 192.168.230.101:5000/alpine-v1
--verbose
:末尾添加该参数可以显示更详细的信息包括 CPU 架构等。
完成之后边可以通过docker pull 192.168.230.101:5000/alpine-v1
来在不同的架构环境里面拉取正确的镜像了。
通过这几条命令可以看出来多架构镜像只是一个引用,根据客户端的架构来选择其中声明好的镜像。
参考链接
https://blog.csdn.net/sullivan_jia/article/details/117520304 docker manifest 使用实战
https://www.cnblogs.com/rucnevermore/p/12031527.html docker多架构镜像构建
https://www.cnblogs.com/nhdlb/p/15233410.html Docker:使用x86平台Docker 拉取 arm版镜像
https://docs.docker.com/engine/install/centos/
about
更多推荐
所有评论(0)