在当今的容器化环境中,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 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
。
如果你更喜欢本机安装Nexus,可以在Nexus官网下载最新版本。下载后,根据你的操作系统,按照相应的安装指南进行安装。
安装好之后,Nexus 应该可以在 http://<your-server-ip>:8081
访问。
当Nexus启动后,你可以通过浏览器访问其网站。输入网址:
http://<你的服务器IP地址>:8081
请使用默认的凭证
- 用户名:
admin
- 密码:
admin123
首次登录时,你最好将密码改成更安全的密码。
第 3 步:配置 Nexus 作为 Docker 注册表既然你已经把Nexus跑起来了,我们接下来就来配置它,让它可以托管Docker镜像文件。
- 登录到 Nexus:使用凭证登录。
- 新建一个 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
。
相信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镜像的控制。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章