侧边栏壁纸
博主头像
AI研究僧

hycj89@163.com

  • 累计撰写 1,899 篇文章
  • 累计创建 179 个标签
  • 累计收到 1 条评论
标签搜索

目 录CONTENT

文章目录

docker私有仓库支持多架构搭建

AI研究僧
2022-04-25 / 0 评论 / 0 点赞 / 562 阅读 / 2,357 字

一、环境说明

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出现如下界面则表示成功启动

image-1650888466860
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.tardocker.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看到如下内容即可

image-1650888304152

通过命令curl 192.168.230.102:5000/v2/_catalog或浏览器直接访问查看私有仓库中的存在的镜像

2、测试私有仓库可用性

任意的docker-cli端(任何需要和私有仓库打交道的服务器都需要配置)修改配置文件 /etc/docker/daemon.json 如果没有则创建,添加如下内容(如果已配置其他内容,不要修改,增加该配置项即可)

{
	 "insecure-registries": ["192.168.230.102:5000", "controller.io:5000"]
}

注:私有仓库未使用https,而docker客户端执行的是https协议,会导致客户端无法与私有仓库通信,因此需要添加以上配置。其中的controller.io:5000是在/etc/hosts中配置的192.168.230.102 controller.io,方便后续通过域名的方式上传镜像。一定带上.io或其他域名后缀,否则docker不认为这是域名而会向dockerhub推送

然后执行

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的镜像信息,也就是方便我们在不同的CPU架构(arm或者x86)或者操作系统中,通过一个镜像名称拉取对应架构或者操作系统的镜像,这个对于异构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:末尾添加该参数为推送列表后自动删除本地刚刚创建的列表清单。

image-1650888421391

docker manifest inspect 192.168.230.101:5000/alpine-v1

--verbose:末尾添加该参数可以显示更详细的信息包括 CPU 架构等。

完成之后边可以通过docker pull 192.168.230.101:5000/alpine-v1来在不同的架构环境里面拉取正确的镜像了。

通过这几条命令可以看出来多架构镜像只是一个引用,根据客户端的架构来选择其中声明好的镜像。

参考链接

docker manifest 使用实战

docker多架构镜像构建

Docker:使用x86平台Docker 拉取 arm版镜像 Docker:使用x86平台Docker 拉取 arm版镜像

https://docs.docker.com/engine/install/centos/

博主关闭了所有页面的评论