0%

docker 私有仓库部署

Docker私有仓库部署

0 需求

  • 构建Docker私有仓库可避免开发生产时可能产生的网络问题;

  • 使用Docker Registry私有仓库部署,使用Docker Auth做身份验证

  • 考虑到使用场景:发布镜像一般需要认证,拉取镜像则不需要,不同环境也需要不同的访问策略。简单的http验证扩展能力受限,docker_auth提供了基于token的docker registry验证实现方式,可以更好的支持实际场景:

    • 支持第三方用户认证
    • 支持较为丰富ACL策略配置
    • 配置部署易于上手

本文经过作者亲自验证,如果读者实践时出错,欢迎在评论区指出

1. Docker安装

1.1 清除旧Docker安装痕迹

如果是第一次安装,可以略过此步骤

1
2
3
4
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

1
2
3
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 配置

  • 配置阿里云镜像

    1
    2
    3
    4
    5
    6
    7
    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 安装部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
  1. ${passwd}生成方式
    1. 用户密码生成方式:htpasswd -nB root
      1. htpasswd -nB root执行时要求输入的密码就是docker login时输入的root用户密码
  2. 更多配置方式参考:docker_auth配置示例

部署容器

1
2
3
4
5
6
7
8
9
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镜像

1
2
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 设置配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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默认提供的是HTTPS服务,所以**${docker_auth_url}**应当使用HTTPS协议

  • 证书可以从阿里云免费申请

3.3 启动服务

1
2
3
4
5
6
7
8
9
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服务

1
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服务使用的同一套证书

4 (可选)使用docker-compose一键部署Docker私有仓库服务

1
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.yamlcd /opt/docker_registry && docker-compose -f registry.yaml up -d

5 使用Docker私有仓库服务

5.1 开启HTTP形式访问私有仓库

vim /etc/docker/daemon.json

在json结构中添加如下节点

1
{   "insecure-registries":    [ "${registry_hostname}:${port}"] }

重启Docker服务

1
systemctl daemon-reloadsystemctl restart docker

5.2 尝试使用私有仓库服务

5.2.1 推送镜像

  1. 登录到自己的私有仓库

docker login ${registry_hostname}:${port}

  1. 为镜像打上正确的tag(若不打合适的tag的话,会默认提交到DockerHub中)

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

eg:docker tag myApp:v1 localhost:8080/myname/myApp:v1

  1. 推送镜像

docker push [OPTIONS] NAME[:TAG]

eg:docker push localhost:8080/myname/myApp:v1

  1. 如果使用的是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 参考链接

7 TODO