1. 搭建流程
1.1 安装docker
参考官方教程:https://docs.docker.com/engine/install/centos/
# 移除原有docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 添加docker repo文件
yum install -y yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装docker
yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io docker-buildx-plugin docker-compose-plugin
# 启动docker
systemctl start docker
systemctl enable docker
注意:docker版本暂时安装的比较低的版本–18.09.1,主要是因为高版本自颁发证书生成过程官方没有提供文档,对这方面不太了解,尝试过生成但最终失败了
其他系统安装docker同样参考官方教程:https://docs.docker.com/engine/install/
1.2 修改容器存储位置
# 停止docker服务
systemctl stop docker
# 创建新的存储位置
mkdir /home/docker/docker_root
# 文件迁移
cp -R /var/lib/docker/* /home/docker/docker_root
# 修改service文件--/usr/lib/systemd/system/docker.service,在ExecStart命令后面添加--graph参数
vim /usr/lib/systemd/system/docker.service
# 修改为
ExecStart=/usr/bin/dockerd -H fd:// --graph=/home/docker/docker_root
# 重启
systemctl daemon-reload
systemctl start docker
1.3 简单安装registry
- 下载registry镜像
docker pull registry:2
或者docker pull registry:latest
- 如果存在防火墙
iptables -I INPUT 1 -p tcp --dport 5000 -j ACCEPT
- 正常启动
docker run -d -p 5000:5000 --privileged=true -v /opt/registry:/tmp/registry registry:2
- -v:
/opt/registry
表示主机上的仓库位置;/tmp/registry
表示docker内挂载的位置
- -v:
1.4 配置https
-
首先修改openssl.cnf,支持IP地址方式,HTTPS访问
在Redhat7
或者Centos
系统中,文件所在位置是/etc/pki/tls/openssl.cnf
。在其中的[ v3_ca]部分,添加subjectAltName选项:subjectAltName=IP:10.10.140.22
如果是
Debian
或者Ubuntu
系统,文件所在位置是/etc/ssl/openssl.cnf
。 -
使用openssl生成证书
openssl req -newkey rsa:2048 -nodes -sha256 -keyout /home/docker/certs/domain.key -x509 -days 365 -out /home/docker/certs/domain.crt
如上图所示,直接使用ip作为域名。
-
自签名证书,使用
Docker Registry
的Docker
机需要将domain.crt
拷贝到/etc/docker/certs.d/[docker_registry_domain]/ca.crt
# docker_registry_domain=10.10.140.22:5000,记得带端口 mkdir /etc/docker/certs.d/10.10.140.22:5000 cp domain.crt /etc/docker/certs.d/10.10.140.22\:5000/ca.crt
-
将
domain.crt
内容放入系统的CA bundle
文件当中,使操作系统信任我们的自签名证书
cat domain.crt >> /etc/pki/tls/certs/ca-bundle.crt
如果是Debian
或者Ubuntu
系统,CA bundle
文件位置在/etc/ssl/certs/ca-certificates.crt
-
启动registry
docker run --name registry --restart=always -d -p 5000:5000 --privileged=true -v /home/docker/registry:/var/lib/registry -v /home/docker/certs:/root/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/root/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/root/certs/domain.key registry:2
- –restart=always: 容器自启
- –restart=always: 容器自启
-
验证
curl -i -k -v https://10.10.140.22:5000/v2
1.4 其他机器访问
将domain.crt
拷贝到对应机器的/etc/docker/certs.d/[docker_registry_domain]/domain.crt
# docker_registry_domain=10.10.140.22:5000,记得带端口
mkdir /etc/docker/certs.d/10.10.140.22:5000
scp domain.crt user@ip:/etc/docker/certs.d/10.10.140.22\:5000/domain.crt
1.5 允许镜像删除
-
查看配置文件
docker exec -it registry cat /etc/docker/registry/config.yml
-
在配置文件的
storage
下添加:delete: enabled: true
-
重启容器:
docker restart registry
-
删除某个镜像
-
首先查看这个镜像某个具体版本的sha值
curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X GET https://10.10.140.22:5000/v2/ubuntu/manifests/20.04
-
删除
curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X DELETE https://10.10.140.22:5000/v2/ubuntu/manifests/sha256:125067956c32ff8376c3ac9fe47e6159f885d067c118b912878a0d93e8dd32d3
-
-
容器内执行垃圾回收
docker exec -it registry sh -c ' registry garbage-collect /etc/docker/registry/config.yml'
这种方法只删除了tag,没有删除repository。
2. 上传镜像到私有仓库
以ubuntu20.04为例:
- 先下载ubuntu镜像
docker pull ubuntu:20.04
- 修改镜像标签
docker tag ubuntu:20.04 10.10.140.22:5000/ubuntu:20.04
- push镜像到仓库
docker push 10.10.140.22:5000/ubuntu:20.04
- 查看镜像
curl -XGET https://10.10.140.22:5000/v2/_catalog
- 获取某个镜像标签列表
curl -XGET https://10.10.140.22:5000/v2/ubuntu/tags/list