Docker私有仓库部署
Posted 已注销
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker私有仓库部署相关的知识,希望对你有一定的参考价值。
Docker私有仓库部署
0 需求
- 构建Docker私有仓库可避免开发生产时可能产生的网络问题;
- 使用Docker Registry私有仓库部署,使用Docker Auth做身份验证
考虑到使用场景:发布镜像一般需要认证,拉取镜像则不需要,不同环境也需要不同的访问策略。简单的http验证扩展能力受限,docker_auth提供了基于token的docker registry验证实现方式,可以更好的支持实际场景:
- 支持第三方用户认证
- 支持较为丰富ACL策略配置
- 配置部署易于上手
本文经过作者亲自验证,如果读者实践时出错,欢迎在评论区指出
1. Docker安装
1.1 清除旧Docker安装痕迹
如果是第一次安装,可以略过此步骤
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get purge docker-ce docker-ce-cli containerd.io
sudo rm -rf /var/lib/docker
1.2 安装Docker
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker
更多安装方法参考Install Docker Engine on Ubuntu
1.3 Docker 配置
配置阿里云镜像
sudo tee /etc/docker/daemon.json << eof { "registry-mirrors": ["https://jioksect.mirror.aliyuncs.com"] } eof sudo systemctl daemon-reload sudo systemctl restart docker
2 Docker Auth 安装部署
mkdir -p /opt/docker_auth/config /opt/docker_auth/log && touch /opt/docker_auth/config/auth_config.yml
echo \'
server:
addr: ":5001"
certificate: "/root/cert.pem"
key: "/root/cert.key"
token:
issuer: "Auth Service"
expiration: 900
users:
"root":
password: "${passwd}"
"": {}
acl:
- match: {account: "root"}
actions: ["*"]
- match: {account: ""} # 匿名用户只能拉取镜像
actions: ["pull"]\' > /opt/docker_auth/config/auth_config.yml
${passwd}
生成方式用户密码生成方式:
htpasswd -nB root
htpasswd -nB root
执行时要求输入的密码就是docker login
时输入的root
用户密码
- 更多配置方式参考:docker_auth配置示例
部署容器
docker run -d \\
--name=docker_auth \\
-p ${port}:5001 \\
--restart=always \\
-v /opt/docker_auth/config:/config:ro \\
-v /root/cert.pem:/root/cert.pem:ro \\
-v /root/cert.key:/root/cert.key:ro \\
-v /opt/docker_auth/log:/logs \\
cesanta/docker_auth:1.6.0 --v=2 --alsologtostderr /config/auth_config.yml
- 注意:如果要将Docker镜像服务做成公网服务的话,需要将Docker Auth的服务端口同样暴露到公网(可以使用frp暴露),因为执行
docker login
命令时,会向Docker Auth发起验证请求
3 Docker Registry镜像安装与容器配置
3.1 拉取Docker Registry镜像
docker pull registry:2.7.0
mkdir -p /opt/docker_registry/config /opt/docker_registry/data && touch /opt/docker_registry/config/config.yml
3.2 设置配置文件
echo \'version: 0.1
log:
fields:
service: registry
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
auth:
token:
autoredirect: true
realm: ${docker_auth_url}/auth
service: Docker registry
issuer: Auth Service
rootcertbundle: /root/cert.pem
http:
addr: :5000
tls:
certificate: /root/cert.pem
key: /root/cert.key
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3\' > /opt/docker_registry/config/config.yml
${docker_auth_url}即为Docker Auth服务的公网地址,
- 注意如果Docker Auth使用与Docker Registry nginx相同的证书的话,注意这里的${docker_auth_url}要使用证书对应的域名而不要使用公网IP,否则在
docker login
时会出现签名错误
- 注意如果Docker Auth使用与Docker Registry nginx相同的证书的话,注意这里的${docker_auth_url}要使用证书对应的域名而不要使用公网IP,否则在
- Docker Auth默认提供的是HTTPS服务,所以${docker_auth_url}应当使用HTTPS协议
- 证书可以从阿里云免费申请
3.3 启动服务
docker run -d \\
-p ${port}:5000 \\
--restart=always \\
--name=registry \\
-v /opt/docker_registry/config/:/etc/docker/registry/ \\
-v /opt/docker_registry/data:/var/lib/registry \\
-v /root/cert.pem:/root/cert.pem:ro \\
-v /root/cert.key:/root/cert.key:ro \\
registry:2.3
- 可使用frp暴露Docker Registry服务
3.4 使用Nginx提供HTTPS服务
echo \'server {
listen 443 ssl;
server_name ${host_name};
#ssl证书文件位置(常见证书文件格式为:crt/pem)
ssl_certificate /etc/nginx/ssl/registry-cert.pem;
#ssl证书key位置
ssl_certificate_key /etc/nginx/ssl/registry-cert.key;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $host;
proxy_set_header X-Real-IP $remote_addr;
# 可使用frp暴露内网服务
proxy_pass https://${host_name};
}
}\' >> /opt/nginx/dockerRegistry.conf
- 使用Docker 容器部署Nginx服务即可
- 在Nginx服务HTTPS 服务使用的证书可以是Docker Auth服务使用的同一套证书
- 补充:需要在
nginx.conf
配置文件的http
模块中添加client_max_body_size 0;否则在镜像比较大时会出现Request Entity too large
错误
4 (可选)使用docker-compose一键部署Docker私有仓库服务
echo \'version: \'3.7\'
services:
auth:
image: cesanta/docker_auth:1.6.0
volumes:
- /opt/docker_auth/config:/config:ro
- /opt/docker_auth/log:/logs
- /opt/docker_auth/ssl/registry-cert.pem:/root/cert.pem:ro
- /opt/docker_auth/ssl/registry-cert.key:/root/cert.key:ro
container_name: docker_auth
restart: always
command: --v=2 --alsologtostderr /config/auth_config.yml
ports:
- ${auth_port}:5001
docker_registry:
image: registry:2.3
container_name: registry
depends_on:
- auth
ports:
- ${registry_port}:5000
volumes:
- /opt/docker_registry/config:/etc/docker/registry
- /opt/docker_registry/data:/var/lib/registry
- /opt/docker_auth/ssl/registry-cert.pem:/root/cert.pem:ro
- /opt/docker_auth/ssl/registry-cert.key:/root/cert.key:ro
restart: always\' >> /opt/docker_registry/registry.yaml
cd /opt/docker_registry && docker-compose -f registry.yaml up -d
5 使用Docker私有仓库服务
5.1 开启HTTP形式访问私有仓库
vim /etc/docker/daemon.json
在json结构中添加如下节点
{
"insecure-registries":
[ "${registry_hostname}:${port}"]
}
重启Docker服务
systemctl daemon-reload
systemctl restart docker
5.2 尝试使用私有仓库服务
5.2.1 推送镜像
1.登录到自己的私有仓库
docker login ${registry_hostname}:${port}
2.为镜像打上正确的tag(若不打合适的tag的话,会默认提交到DockerHub中)
docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]
eg:docker tag myApp:v1 localhost:8080/myname/myApp:v1
3.推送镜像
docker push [OPTIONS] NAME[:TAG]
eg:docker push localhost:8080/myname/myApp:v1
4.如果使用的是DockerHub仓库的服务的话
1. `docker login --username username`
2. `docker tag my-image username/my-repo`
3. `docker push username/my-repo`
5.2.2 拉取镜像
docker pull [OPTIONS] NAME[:TAG]
6 参考链接
- docker local registry exec htpasswd executable file not found in $PATH
- Private registry push fail: server gave HTTP response to HTTPS client
- Docker私有仓库
- Docker push and pull using separate credentials
- docker_authを使ってプライベートレジストリの権限管理をする
- Docker Registry v2 + Token Auth Server (Registry v2 认证)实例
- Docker私有仓库Registry及Auth-server认证搭建
- Configuring a registry
- https://github.com/SUSE/Portus
7 TODO
使用Keycloak进行用户验证
- Manage Docker-Registry auth with Keycloak
- Docker Authentication with Keycloak
以上是关于Docker私有仓库部署的主要内容,如果未能解决你的问题,请参考以下文章
Docker 部署Registry私有仓库+Harbor私有仓库