为了账号安全,请及时绑定邮箱和手机立即绑定

使用Nexus和SSL配置搭建安全的私有Docker仓库指南

在当今的容器化环境中,Docker 已经改变了应用程序的开发、测试和部署方式。然而,当涉及到管理和分发 Docker 镜像的过程时,像 Docker Hub 这样的公共仓库可能并不总是适合那些需要隐私、安全性和对镜像管理控制的企业或组织。这时,建立一个私有 Docker 仓库通常是更好的选择。

本文将一步步教您使用Sonatype Nexus设置一个安全的私有Docker注册表,并配置SSL以确保Docker镜像推送和拉取的安全。

Nexus Repository Manager是什么?

Sonatype Nexus Repository Manager 是一个开源的仓库管理工具,支持多种工件类型,比如 Docker 镜像、Maven、npm 等。它帮助团队安全地存储、管理和分发他们在基础设施中的 Docker 镜像。使用 Nexus,你可以轻松地创建并管理托管的 Docker 仓库并通过 HTTP 或 HTTPS 协议访问它们。

将Nexus设置为私有Docker仓库,这样可以:

  • Docker镜像的控制:您可以安全地存储那些私有的镜像。
  • 更快的拉取:减少了对外部仓库的依赖,加速部署。
  • 自定义工作流程:实现了Docker镜像的版本控制和访问权限管理。
准备工作

要完成这个教程,你需要:

  • 一台 Linux 服务器 或虚拟机(VM)环境。
  • 您的机器上已经安装了 Docker
  • 已成功安装并运行 Nexus Repository Manager 软件。
  • Nexus 服务器的 域名或 IP 地址。
  • 具备基本的命令行工具使用经验。
第一步:安装 Nexus 仓库管理器

首先,你需要安装Nexus Repository Manager。你可以在物理服务器上运行Nexus,或者,使用Docker容器。

使用 Docker 的选项 1:

在 Docker 容器中运行 Nexus 是最快的方式。

    docker run -d -p 8081:8081 --name nexus sonatype/nexus3

运行一个Docker容器,将8081端口映射到主机的8081端口,并命名为nexus。这里,docker run 表示运行一个Docker容器,-d 表示后台运行容器,-p 将容器的8081端口映射到主机的8081端口,--name 指定容器的名称为nexus。

此命令将下载并启动Nexus,默认使用HTTP端口8081

选项 2:直接安装

如果你更喜欢本机安装Nexus,可以在Nexus官网下载最新版本。下载后,根据你的操作系统,按照相应的安装指南进行安装。

安装好之后,Nexus 应该可以在 http://<your-server-ip>:8081 访问。

步骤 2:进入 Nexus Web 界面

当Nexus启动后,你可以通过浏览器访问其网站。输入网址:

http://<你的服务器IP地址>:8081

请使用默认的凭证

  • 用户名:admin
  • 密码:admin123

首次登录时,你最好将密码改成更安全的密码。

第 3 步:配置 Nexus 作为 Docker 注册表

既然你已经把Nexus跑起来了,我们接下来就来配置它,让它可以托管Docker镜像文件。

  1. 登录到 Nexus:使用凭证登录。
  2. 新建一个 Docker 仓库
  • 在 Nexus 仪表板中,点击左侧的 “存储库” 选项卡。
  • 点击 “创建存储库” ,然后选择 “docker (托管)”
  • 输入存储库名称(例如,my-docker-repo)。
  • 设置 HTTP 端口(默认为 5000,但您可以使用其他端口)。
  • 如果您希望立即启用安全通信,请打开 SSL,不过我们将在下一步中介绍如何进行配置。

3. 保存仓库内容:点击 “保存” 以创建 Docker 仓库。

第 4 步:在 Nexus 上启用 SSL 以便进行安全的 Docker 操作

现在我们已经搭建好了Docker仓库,让我们用SSL来加强其安全性。

配置 Nexus 以使用 SSL:

  • 将生成的 nexus.keystore 文件复制到 /opt/nexus/ssl/ 目录(若 Nexus 安装在其他位置,请复制到相应的安装目录)。
  • /opt/nexus/etc/ 目录下编辑 nexus.properties 文件。然后,

请添加以下配置:

    application-https-port=8443  
    ssl.keystore.path=/opt/nexus/ssl/nexus.keystore  
    ssl.keystore.password=<keystore-password> #此处应填写实际的keystore密码

重启Nexus:

保存配置后,需要重启Nexus服务以应用SSL设置。

运行 `./bin/nexus restart` 重启命令

Nexus 现在可以通过 HTTPS 安全访问 https://<your-server-ip>:8443

配置 Docker 通过 HTTPS 从 Nexus 仓库进行上传和下载

相信SSL证书:

如果你使用自签证书,Docker 必须信任这个证书,你需要将证书 (nexus.crt) 添加到 Docker 客户端的信任证书库。

运行以下命令来复制证书并更新证书存储:

sudo cp nexus.crt /usr/local/share/ca-certificates/  
sudo update-ca-certificates

登录 Nexus Docker 注册表 (点击登录)

通过运行以下命令通过HTTPS登录Nexus:

docker login <your-server-ip>:8443

在你的服务器IP地址上登录Docker服务器

当需要时,请输入您的 Nexus 凭证。

将Docker镜像推送到Nexus:

使用 Nexus 注册表地址为你的 Docker 镜像打上标签并推送该镜像:

    docker tag myapp:v1 <your-server-ip>:8443/myapp:v1  # 将本地镜像标签重命名为远程仓库中的镜像标签
    docker push <your-server-ip>:8443/myapp:v1        # 将镜像推送到指定的远程仓库

从Nexus拉取Docker镜像

要从 Nexus 下载镜像,可以使用:

尝试运行以下命令来拉取镜像:

docker pull <your-server-ip>:8443/myapp:v1


# 可选:通过Nexus REST API修改密码

如果你更喜欢,你也可以通过**Nexus REST API**来更改密码。下面是通过简单的API调用进行更改的方法:

例如:
```plaintext
[API调用示例]

下面的 curl 命令用于修改 admin 用户的密码:

    curl -u admin:<当前密码> -X PATCH "http://<your-nexus-server>:8081/service/rest/v1/security/users/admin" \  
    -H "Content-Type: application/json" \  
    -d '{"password": "<新密码>"}'
  • <current-password> 替换为当前密码,例如 admin123

  • <your-nexus-server> 替换为您的 Nexus 服务器的 IP 或域名。

  • <new-password> 替换为您要为管理员设置的新密码。

执行完上述命令后,密码会被更新,可以用新密码登录了。

(可选)设置带有SSL终止功能的NGINX反向代理

你可以通过使用例如 NGINX 这样的反向代理来提高设置的安全性和灵活性,实现 SSL 终止。

安装nginx

    sudo apt install nginx

为 NGINX 配置 SSL

创建一个 NGINX 配置文件以将请求转发给 Nexus。例如:

    server {  
        listen 443 ssl;  
        server_name <your-server-ip>;  

        ssl_certificate /etc/nginx/ssl/nexus.crt;  
        ssl_certificate_key /etc/nginx/ssl/nexus.key;  

        location / {  
            proxy_pass http://localhost:8081;  
            proxy_set_header Host $host;  
            proxy_set_header X-Real-IP $remote_addr;  
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
            proxy_set_header X-Forwarded-Proto $scheme;  
        }  
    }  

    server {  
        listen 80;  
        server_name <your-server-ip>;  
        return 301 https://$host$request_uri;  
    }

重启一下 Nginx

配置完 NGINX 后,可以重启服务。

    sudo systemctl restart nginx

运行此命令以重启Nginx服务: sudo systemctl restart nginx

以下是为 Nexus Repository 配置 SSL 的 Docker 命令

首先,登录到你的服务器
docker login <your-server-ip-or-domain>:443  
(请将<your-server-ip-or-domain>:443替换为你的实际地址)

给你的本地镜像打上标签,以便上传到远程仓库
docker tag <local-image>:<tag> <your-server-ip-or-domain>:443/<repository-name>/<image-name>:<tag>  

将打过标签的镜像推送到远程仓库
docker push <your-server-ip-or-domain>:443/<repository-name>/<image-name>:<tag>  

从远程仓库拉取镜像
docker pull <your-server-ip-or-domain>:443/<repository-name>/<image-name>:<tag>
最后,我们来总结一下

通过上述步骤,你已经成功地使用 Sonatype Nexus 设置了 安全的私有 Docker 注册表,并配置了 SSL 以确保推送和拉取操作的安全。有了 SSL,你的 Docker 镜像将被安全传输,保护敏感数据的安全,并提高部署的速度和可靠性,确保更安全的环境。

无论你是使用自签名证书用于内部用途,还是使用来自CA的受信任SSL证书,这种设置都可以确保你的Docker注册表免受未加密通信带来的潜在漏洞的影响。

通过确保您的Docker注册表的安全,您不仅能够获得更强大的安全性,还能够获得以满足您组织的独特需求的灵活性和对Docker镜像的控制。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消