Seele Vol's Blog

在严格限制的网络环境中自建docker仓库及代理dockerhub

在没有未来的世界中创建 Docker 镜像代理

实现 Docker 镜像代理的工具有很多,但相对通用的却不多。本文将介绍如何使用 Docker Compose 快速搭建一个镜像代理,此方法也适用于其他软件源的代理。

如果你仅需要对单台机器设置docker网络代理,请查看这篇文章 原始链接 永久链接

所需软件

为了快速搭建环境,我们将使用 Docker Compose。对于 Docker Compose 的安装,这个先有鸡还是先有蛋的问题,还是交给魔法解决吧。以下是配置文件 docker-compose.yml

services:
  nexus:
    image: sonatype/nexus3:latest
    user: 0:0  # 仅因为该 yml 文件放在 /root 目录下,Docker 容器用户无权限,如放在其他目录且注重安全可删除此行
    container_name: nexus3
    restart: always
    ports:
      - 1024:8081
      - 8001:8001
    volumes:
      - ./nexus-data:/nexus-data

建议使用 Nginx 进行反向代理,并设置好单个请求文件的最大限制。 本文不涉及反向代理配置。

Nginx配置文件示例

启动并配置

启动

使用以下命令启动服务:

docker compose up

启动后,使用以下命令获取管理员密码:

docker exec -it nexus3 /bin/bash
cat /nexus-data/admin.password

获取到的字符串即为 admin 用户的密码。首次登录时会要求修改密码。

在设置过程中,会询问是否允许匿名访问。如果只需要 Docker 仓库,建议设置为不允许,否则可以允许。但最终使用 Docker 仓库仍需执行 docker login

配置

配置 HTTP 代理

首先配置 HTTP 代理,访问 [server-ip]:1024/#admin/system/http,在 Proxy Settings 中填写正确的 HTTP 代理。

配置仓库

  1. 删除无用的镜像仓库。
  2. 点击 “Create repository”,选择 “docker (proxy)”。
  3. 配置如下:

    • Name: docker-proxy
    • HTTP: 8001
    • Allow anonymous docker pull: false
    • Enable Docker V1 API: 可自行决定是否开启
    • Remote storage: https://registry-1.docker.io
    • Docker Index: Use proxy registry (specified above) 或 Use Docker Hub
    • Allow Nexus Repository Manager to download and cache foreign layers: true

    其余保留默认配置。

创建 Docker 用户

创建角色

  1. 进入 http://[server-ip]:1024/#admin/security/roles
  2. 点击 “Modify Applied Privileges”。
  3. 搜索 docker,勾选所有包含 docker 字符的选项,或挑选更细致的规则。

创建用户

  1. 进入 http://[server-ip]:1024/#admin/security/users
  2. 添加本地用户并赋予 docker 角色。

客户端配置

  1. 创建 Docker 配置文件目录:

     sudo mkdir -p /etc/docker && touch /etc/docker/daemon.json
    
  2. 编辑 /etc/docker/daemon.json,由于未配置 SSL 证书,需添加不安全标识:

     {
         "insecure-registries": [
             "[server-ip]:8001"
         ],
         "registry-mirrors": [
             "http://[server-ip]:8001"
         ]
     }
    
  3. 重启 Docker:

     systemctl restart docker
    
  4. 使用前面设置的 Docker 用户登录 Docker:

     docker login [server-ip]
    
  5. 尝试拉取镜像,并观察代理服务器流量变化:

     docker pull [server-ip]:8001/library/mysql