Docker Compose 实战:构建企业级 Nexus 3 制品仓库私服
在当今的软件开发流程中,高效的依赖管理和制品分发是保障团队协作顺畅、构建速度稳定的基石。无论是 Java 项目的 Maven 依赖,还是前端项目的 npm 包,亦或是 Docker 镜像,一个统一、可靠、高速的内部仓库都至关重要。Sonatype Nexus Repository Manager 3(简称 Nexus 3)正是为此而生的强大工具,它支持多种仓库格式,提供了代理、托管和仓库组等核心功能。
对于追求敏捷和标准化的团队而言,将基础设施容器化部署已成为首选。Docker Compose 以其声明式的服务编排能力,让 Nexus 3 的部署、升级和维护变得前所未有的简单和可重复。本文将带你从零开始,不仅完成 Nexus 3 的容器化部署,更会深入探讨如何将其融入企业开发环境,特别是通过配置阿里云 Maven 仓库代理来显著加速国内团队的构建过程,并解决从服务端到客户端联调中可能遇到的实际问题。
1. 环境准备与 Docker Compose 编排
在开始部署之前,确保你的服务器或本地开发机满足基本要求。一个稳定的 Linux 环境(如 Ubuntu 22.04 LTS 或 CentOS 7/8)是理想的选择,当然,在 macOS 或 Windows 上通过 Docker Desktop 进行本地测试也完全可行。关键是需要安装好 Docker Engine 和 Docker Compose Plugin(v2 版本已成为主流)。
提示:建议使用 Docker Compose v2,它作为 Docker CLI 的一个插件存在,命令从
docker-compose变更为docker compose,功能更强大且与 Docker 生态集成更紧密。
接下来,我们规划部署目录。良好的目录结构有助于后期维护。我习惯在 /opt/docker-services 下为每个服务创建独立目录。
# 创建专属目录并进入
sudo mkdir -p /opt/docker-services/nexus3
cd /opt/docker-services/nexus3
现在,创建核心的 docker-compose.yml 文件。这个文件定义了 Nexus 3 服务的所有细节。与许多简单示例不同,我们将考虑生产环境所需的几个关键点:资源限制、数据持久化、时区设置和网络配置。
version: '3.8'
services:
nexus:
image: sonatype/nexus3:3.85.0-alpine
container_name: nexus3
restart: unless-stopped
hostname: nexus.local
environment:
- TZ=Asia/Shanghai
- INSTALL4J_ADD_VM_PARAMS=-Xms2g -Xmx2g -XX:MaxDirectMemorySize=4g -Djava.util.prefs.userRoot=/nexus-data/javaprefs
ports:
- "8081:8081"
# 预留端口用于未来可能的 Docker 私有仓库(HTTP/HTTPS)
- "8082:8082"
- "8083:8083"
volumes:
- nexus-data:/nexus-data
# 可选:挂载自定义日志配置(需提前准备文件)
# - ./logback.xml:/opt/sonatype/nexus/etc/logback/logback.xml:ro
networks:
- backend
deploy:
resources:
limits:
memory: 4G
reservations:
memory: 2G
volumes:
nexus-data:
name: nexus3-data
driver: local
driver_opts:
type: none
o: bind
device: /opt/docker-services/nexus3/nexus-data
networks:
backend:
driver: bridge
这个配置有几个值得注意的改进点:
- 使用命名卷(Named Volume)配合绑定挂载(Bind Mount):直接使用
./nexus-data:/nexus-data简单,但通过volumes声明并指定driver_opts可以实现更清晰的卷管理,同时保留了数据存储在宿主机特定路径的透明性。 - 明确的资源限制:通过
deploy.resources.limits限制容器最大内存使用,防止 Nexus 进程异常时拖垮宿主机。JVM 参数(-Xms2g -Xmx2g)应与此限制匹配或略小。 - 网络

2070

被折叠的 条评论
为什么被折叠?



