Docker - 访问仓库


🚀 Docker Hub 概览

Docker Hub 是 Docker 的官方公共仓库,其中包含了大量的镜像,由 Docker 公司、组织和个人用户创建和维护。


📌 注册与登录

  • 注册:你可以在 Docker Hub 官网 免费注册一个 Docker 账号。

  • 登录:在命令行中,使用 docker login 并交互式地输入用户名和密码来登录 Docker Hub。退出登录可以通过 docker logout 命令实现。


📌 拉取与推送镜像

  • 查找镜像:可以使用 docker search 命令来查找 Docker Hub 中的镜像。例如:docker search centos

  • 下载镜像:使用 docker pull 命令来下载选定的镜像到本地。例如:docker pull centos

  • 推送镜像:首先,你需要给你的镜像打上一个标签,然后使用 docker push 命令将其推送到 Docker Hub。例如:

    $ docker tag ubuntu:18.04 username/ubuntu:18.04
    $ docker push username/ubuntu:18.04
    

📌 自动构建

  • 自动构建概述:从 2021 年 7 月 26 日开始,某些功能可能是受限制的。自动构建可以帮助用户自动触发镜像的构建,这在软件或应用有新的版本更新时特别有用。

  • 配置自动构建:为了配置自动构建,你需要在 Docker Hub 上关联你的代码存储库(如 GitHub 或 Bitbucket),然后选择一个特定的项目和分支来进行追踪。一旦在这些代码存储库中有新的提交或标签创建,Docker Hub 将自动触发一个新的镜像构建。


💡 小贴士:Docker Hub 不仅仅是一个镜像存储库;它也为开发者、团队和组织提供了一个平台,用于协作、共享和自动化。此外,Docker Hub 还有其他许多功能,如组织和团队管理、私有仓库和集成。这些功能可以帮助团队更有效地使用 Docker。


📝 私有 Docker 仓库

Docker 官方的 Docker Hub 是一个公开的镜像仓库,但在某些场景中,你可能需要一个私有的 Docker 镜像仓库来存储和管理自己的镜像。以下是设置和使用私有 Docker 仓库的方法。


📌 安装并运行 docker-registry

  • 使用容器运行:你可以使用 Docker Hub 上的官方 registry 镜像来运行你的私有仓库。

    $ docker run -d -p 5000:5000 --restart=always --name registry registry:2
    
  • 指定存储路径:如果你想将上传的镜像存放在主机的特定路径(例如 /opt/data/registry),可以使用 -v 参数。

    $ docker run -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry:2
    

📌 上传、搜索和下载镜像

  1. 标记镜像:使用 docker tag 命令将本地的镜像标记为私有仓库中的镜像。

    $ docker tag ubuntu:latest 127.0.0.1:5000/ubuntu:latest
    
  2. 上传镜像:使用 docker push 命令将标记的镜像上传到私有仓库。

    $ docker push 127.0.0.1:5000/ubuntu:latest
    
  3. 查看仓库中的镜像:使用 curl 或浏览器查看私有仓库中的镜像。

    $ curl 127.0.0.1:5000/v2/_catalog
    
  4. 下载镜像:你可以使用 docker pull 命令从私有仓库下载镜像。

    $ docker pull 127.0.0.1:5000/ubuntu:latest
    

📌 配置非 HTTPS 仓库地址

默认情况下,Docker 要求使用 HTTPS 来与私有仓库进行通信。但在内部网络或测试环境中,你可能不想设置 HTTPS。这种情况下,需要告诉 Docker 信任这个非 HTTPS 的私有仓库。

  • 对于 Ubuntu 16.04+, Debian 8+, CentOS 7:编辑 /etc/docker/daemon.json 文件(如果不存在,则创建),并添加以下内容。

    {
      "registry-mirrors": [
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com"
      ],
      "insecure-registries": [
        "192.168.199.100:5000"
      ]
    }
    

    请确保该 JSON 文件格式正确,否则 Docker 服务将无法启动。

  • 其他系统:对于 Docker Desktop for Windows 或 Docker Desktop for Mac,你可以直接在图形界面中的 Docker Engine 设置中编辑上述内容。


💡 小贴士:虽然私有 Docker 仓库非常有用,但请记住,如果不设置适当的安全性(例如 HTTPS 和身份验证),它可能会暴露你的镜像和数据。在生产环境中使用私有仓库时,应确保采取适当的安全措施。


📊 私有 Docker 仓库的高级配置

Docker 允许用户在本地搭建私有 Docker 仓库,而这个仓库可以通过一些高级配置来增强其安全性和功能。本小节将引导你如何使用 Docker Compose 搭建一个带有权限认证和 TLS 的私有 Docker 仓库。


📌 准备站点证书

在实际生产环境中,我们通常会为 Docker 私有仓库配置 HTTPS 以提高安全性。为此,你需要为你的 Docker 仓库准备 SSL/TLS 证书。你可以购买证书,也可以使用 OpenSSL 工具自签名证书。上述步骤详细描述了如何使用 OpenSSL 生成 CA 根证书和站点证书。

# 第一步创建 CA 私钥。
$ openssl genrsa -out "root-ca.key" 4096

# 第二步利用私钥创建 CA 根证书请求文件。
$ openssl req \
          -new -key "root-ca.key" \
          -out "root-ca.csr" -sha256 \
          -subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=Your Company Name Docker Registry CA'

# 第三步配置 CA 根证书,新建 root-ca.cnf。
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash

# 第四步签发根证书。
$ openssl x509 -req  -days 3650  -in "root-ca.csr" \
               -signkey "root-ca.key" -sha256 -out "root-ca.crt" \
               -extfile "root-ca.cnf" -extensions \
               root_ca

# 第五步生成站点 SSL 私钥。
$ openssl genrsa -out "docker.domain.com.key" 4096

# 第六步使用私钥生成证书请求文件。
$ openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256 \
          -subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=docker.domain.com'

# 第七步配置证书,新建 site.cnf 文件。
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:docker.domain.com, IP:127.0.0.1
subjectKeyIdentifier=hash

# 第八步签署站点 SSL 证书。
$ openssl x509 -req -days 750 -in "site.csr" -sha256 \
    -CA "root-ca.crt" -CAkey "root-ca.key"  -CAcreateserial \
    -out "docker.domain.com.crt" -extfile "site.cnf" -extensions server

# 创建 ssl 文件夹并将生成的文件移入
$ mkdir ssl
$ mv docker.domain.com.key docker.domain.com.crt root-ca.crt ssl/


📌 配置私有仓库

  1. 配置文件config.yml 是 Docker 仓库的主配置文件。它定义了日志、存储、认证、HTTP/TLS 设置等。

  2. 生成 HTTP 认证文件:为了提供 HTTP 基本认证,你需要一个 htpasswd 文件,该文件包含允许推送和拉取仓库的用户名和密码。

## 生成 http 认证文件

$ mkdir auth
$ docker run --rm \
    --entrypoint htpasswd \
    httpd:alpine \
    -Bbn username password > auth/nginx.htpasswd

📌 使用 docker-compose 启动仓库

使用 docker-compose.yml 文件,你可以定义和运行 Docker 仓库容器的多容器 Docker 应用程序。在这里,我们定义了一个服务“registry”,它使用官方的 registry 镜像,并将其暴露在 443 端口上。

## 编辑 docker-compose.yml
version: '3'

services:
  registry:
    image: registry
    ports:
      - "443:443"
    volumes:
      - ./:/etc/docker/registry
      - registry-data:/var/lib/registry

volumes:
  registry-data:

📌 修改 hosts 文件

这一步是为了确保你的机器知道如何解析你为 Docker 仓库定义的域名。

# 添加以下内容
127.0.0.1 docker.domain.com

📌 启动 Docker 仓库

使用 docker-compose up -d 命令启动你的 Docker 仓库。

$ docker-compose up -d

📌 测试私有仓库功能

为了确保你的私有 Docker 仓库正常工作,你应该进行一些基本的测试,例如登录、推送、拉取和注销。

# 将 CA 根证书添加到 Docker 的受信任的证书目录中
$ sudo mkdir -p /etc/docker/certs.d/docker.domain.com
$ sudo cp ssl/root-ca.crt /etc/docker/certs.d/docker.domain.com/ca.crt

# 登录到私有仓库
$ docker login docker.domain.com

# 尝试推送、拉取镜像
$ docker pull ubuntu:18.04
$ docker tag ubuntu:18.04 docker.domain.com/username/ubuntu:18.04
$ docker push docker.domain.com/username/ubuntu:18.04
$ docker image rm docker.domain.com/username/ubuntu:18.04
$ docker pull docker.domain.com/username/ubuntu:18.04

# 退出登录
$ docker logout docker.domain.com

💡 注意事项

  1. 如果你的机器上已经有其他服务使用了 443 端口,你需要更改 Docker 仓库的端口。你可以在 docker-compose.yml 文件中进行这些更改。
  2. 使用自签名证书时,Docker 默认不会信任该证书。因此,你需要将你的 CA 根证书添加到 Docker 的受信任的证书目录中,以避免在与私有仓库通信时出现证书错误。
  3. 虽然使用自签名证书在内部网络和测试环境中可能是可行的,但在生产环境中,建议使用由受信任的证书颁发机构颁发的证书。

总的来说,为 Docker 仓库配置权限认证和 TLS 可以增强其安全性,防止未经授权的访问。确保在将私有仓库用于生产环境之前进行适当的安全配置和测试。


🔥 Nexus 3

使用 Docker 的官方 Registry 可能会带来一些维护问题。例如,某些已删除的镜像默认不会释放空间。Nexus 3.x 是 Sonatype 的仓库管理器,它支持 Docker、Maven、Yum、PyPI 等。使用 Nexus 可以集中管理这些仓库。


1. 🐳 启动 Nexus 容器


$ docker run -d --name nexus3 --restart=always \
    -p 8081:8081 \
    --mount src=nexus-data,target=/nexus-data \
    sonatype/nexus3

提示: 等待3-5分钟,然后检查日志以确保 Nexus 已成功启动:

$ docker logs nexus3 -f

🌐 在浏览器中打开 http://YourIP:8081 以访问 Nexus。首次运行时,需要获取初始密码:

$ docker exec nexus3 cat /nexus-data/admin.password

🔑 使用默认账号 admin 和上述命令获取的密码登录。首次登录时,系统会提示您更改初始密码。


2. 📦 创建仓库


  • 转到 Repository->Repositories 并选择 Create repository,然后选择 docker (hosted)。配置如下:
    • Name: 仓库名称
    • HTTP: 仓库的 HTTP 端口(例如:5001)
    • Hosted -> Deployment policy: 选择 Allow redeploy

额外提示: 你还可以创建一个 docker (proxy) 类型的仓库链接到 DockerHub,以及一个 docker (group) 类型的仓库来组合前两者。


3. 🔐 添加访问权限


  • Security->Realms 中,将 Docker Bearer Token Realm 移动到右侧的列表中。
  • 转到 Security->Roles->Create role,在 Privileges 选项中搜索 docker,并将相应的权限添加到角色中。
  • 转到 Security->Users->Create local user,为用户分配上述角色。

4. 🌐 使用 NGINX 设置加密代理


首先,按照上述步骤生成证书。然后,创建 NGINX 配置文件以代理对 Nexus 的请求。以下是示例配置:

upstream register
{
    server "YourHostName OR IP":5001; #端口为上面添加私有镜像仓库时设置的 HTTP 选项的端口号
    check interval=3000 rise=2 fall=10 timeout=1000 type=http;
    check_http_send "HEAD / HTTP/1.0\r\n\r\n";
    check_http_expect_alive http_4xx;
}

server {
    server_name YourDomainName;#如果没有 DNS 服务器做解析,请删除此选项使用本机 IP 地址访问
    listen       443 ssl;

    ssl_certificate key/example.crt;
    ssl_certificate_key key/example.key;

    ssl_session_timeout  5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;
    large_client_header_buffers 4 32k;
    client_max_body_size 300m;
    client_body_buffer_size 512k;
    proxy_connect_timeout 600;
    proxy_read_timeout   600;
    proxy_send_timeout   600;
    proxy_buffer_size    128k;
    proxy_buffers       4 64k;
    proxy_busy_buffers_size 128k;
    proxy_temp_file_write_size 512k;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass http://register;
        proxy_read_timeout 900s;

    }
    error_page   500 502 503 504  /50x.html;
}

5. 🐳 Docker 主机访问镜像仓库


如果不使用 SSL,可以修改 Docker 的配置以添加非 HTTPS 仓库地址。但如果使用了 SSL,则需要将证书添加到 Docker 的信任列表中:

$ openssl s_client -showcerts -connect YourDomainName OR HostIP:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >ca.crt
$ cat ca.crt | sudo tee -a /etc/ssl/certs/ca-certificates.crt
$ systemctl restart docker

然后,使用 docker login YourDomainName OR HostIP 命令并输入在 Nexus 中设置的用户名和密码进行登录。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yueerba126

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值