Docker-Compose
version: "3.8"
services:
nexus:
image: sonatype/nexus3
container_name: nexus
restart: always
ports:
- 8081:8081
volumes:
- /srv/nexus/data:/nexus-data
修改/srv/nexus目录的所有者为当前用户:
sudo chown -R username:username /srv/nexus
修改data目录有最高权限,否则无法启动成功:
sudo chmod -R 777 /srv/nexus/data
代理Docker Hub
登录WEB页面
登录WEB页面,地址为:http://192.168.1.9:8081。 用户名为:admin,密码通过命令获取:
docker exec nexus3 cat /nexus-data/admin.password
创建Blob
在 Nexus Repository Manager 中,Blob Store(二进制大对象存储)是一个用于存储仓库数据的核心组件。Blob Store 主要用于存储各种二进制文件,例如软件包、依赖库、构建产物等,这些文件通常被称为“blob”。
Blob Store 的作用包括:
存储二进制文件: Blob Store 被设计用来安全、可靠地存储二进制文件。这些文件可以是各种形式的构建产物、软件包、依赖库等。Blob Store 是 Nexus 仓库管理系统的核心,它为这些文件提供了一个中央存储位置。
支持不同类型的存储后端: Nexus 支持不同类型的 Blob Store,例如本地文件系统、云存储(如Amazon S3、Google Cloud Storage)等。这使得用户可以根据需求选择不同的存储后端,并根据实际情况进行扩展或迁移。
提供存储策略: Blob Store 允许你定义存储策略,以确定何时以及如何清理或删除不再需要的文件。这对于管理仓库的存储空间非常重要,可以根据策略自动清理不再需要的快照或旧版本。
支持代理和缓存: 在 Maven Repository 的场景下,Blob Store 还可以用于代理远程 Maven 仓库,并缓存远程仓库中的文件。这有助于提高构建性能,减少对远程仓库的依赖。
我们缓存的镜像需要存储为blob,所以需要创建一个Blob store。点击左侧菜单栏的Blob Stores,然后点击Create blob store,选择Type为File,Name填写为dockerhub。
创建Repository
在 Nexus Repository Manager 中,有三种主要的仓库类型:Hosted Repository、Proxy Repository、和 Group Repository。每种类型都有不同的作用和用途:
Hosted Repository(托管仓库):
- 作用: 用于存储和管理本地创建的部署(deploy)的二进制文件。这包括你自己或你的团队创建的库,例如 Maven 构件、npm 包、Docker 镜像等。
- 使用场景: 当你需要在内部存储和分享自己创建的构建产物时,你可以使用 Hosted Repository。
Proxy Repository(代理仓库):
- 作用: 用于代理和缓存远程仓库的二进制文件。当你从远程仓库获取构建依赖时,Proxy Repository 会将这些文件缓存在本地,从而提高构建性能并减少对远程仓库的依赖。
- 使用场景: 在构建过程中,你通常会依赖于一些公共的远程仓库,例如 Maven Central、npm registry、Docker Hub等。使用 Proxy Repository 可以有效地管理这些依赖并减少对远程仓库的直接访问。
Group Repository(组合仓库):
- 作用: 允许你将多个仓库组合成一个逻辑单元。当你需要在构建中同时使用多个仓库的内容时,Group Repository 可以将这些仓库组合在一起,使它们在应用程序中看起来像一个单一的仓库。
- 使用场景: 当你有多个 Proxy Repository 或 Hosted Repository 时,你可以使用 Group Repository 将它们组合在一起。这对于简化构建配置、统一依赖管理等非常有用。
我们一般创建三个仓库,proxy代理公共镜像,hosted保存自己的镜像,group将proxy和hosted组合在一起。我们分别创建三个仓库。
proxy
点击左侧菜单栏的Repositories,然后点击Create repository,选择Docker (proxy),按照下图填写:
Remote storage 图中填写为https://registry-1.docker.io
,这是dockerhub的地址。但是实测会很慢,所以我们使用加速地址https://dockerproxy.com
。需要注意修改一下。
还有一些国内镜像源可选,可以参考这个项目。Test Registry · docker-practice/docker-registry-cn-mirror-test@83a4dd4
Blob store选择为刚刚创建的dockerhub
。
hosted
hosted比较简单,只需要填个名称就行了,这里填写为docker-hosted
。
group
group 需要注意以下:
- HTTP需要单独设置端口号。我们设置与WEB页面不同的端口号,8082即可。
- 需要将proxy和hosted都添加到group中,这样才能将两个仓库组合在一起。
启用Realms
这里要在 Security-Realms 里面启用 Docker Bearer Token Realm。
拉取镜像
如果直接使用docker pull拉取镜像,会报错:
$ docker pull 192.168.1.9:8082/redis
Using default tag: latest
Error response from daemon: Get "https://192.168.1.9:8082/v2/": http: server gave HTTP response to HTTPS client
编辑/etc/docker/daemon.json
文件,添加以下内容:
{
"insecure-registries": [
"192.168.1.9:8082"
],
"registry-mirrors": [
"http://192.168.1.9:8082"
]
}
注意:registry-mirrors中只保留一个Nexus的地址,这样默认就会从Nexus拉取镜像。如果有多个地址,就可能会从其他地址拉取镜像。因为我们在Nexus中配置的URL就是docker-proxy的地址,他就是一个国内代理地址,所以这里我们只保留一个Nexus的地址就行。 注意: insecure-registries 拼写,不要写成 insecure-registry。最好直接复制,json格式很严格。
重启Docker服务:
sudo systemctl restart docker
登录Docker Registry:
需要注意的shi,这里的用户名和密码是Nexus的用户名和密码,不是Docker Hub的用户名和密码。
docker login 192.168.1.9:8082 -u admin -p admin123
拉取镜像:
$ docker pull redis
Using default tag: latest
latest: Pulling from redis
1f7ce2fa46ab: Already exists
4827e9d1e197: Pull complete
5845062cfda9: Pull complete
44d659adcf8b: Pull complete
b6962d83313d: Pull complete
5d29cf86ecab: Pull complete
4f4fb700ef54: Pull complete
3a2d9f90268c: Pull complete
Digest: sha256:249e1bfb9448ae9e76807748f8cb3c5cc73e55441b7b36364c61a7428c9e814c
Status: Downloaded newer image for 192.168.1.9:8082/redis:latest
192.168.1.9:8082/redis:latest
可以在首页的Browse Docker中看到镜像已经被缓存了。
推送镜像
如果你需要上传自己修改的镜像,那么就需要修改之前的docker-hosted,其中HTTP中该为8083,和docker-proxy的端口号区分。这样我们就可以从8082下载镜像,从8083推送镜像。
首先我们需要重命名镜像,格式如下
docker tag <imageId or imageName> <nexus-hostname>:<repository-port>/<image>:<tag>
docker tag af340544ed62 192.168.1.9:8083/hello-world:mytag
docker push 192.168.1.9:8083/hello-world:mytag
拉取这个镜像:
docker pull 192.168.1.9:8083/hello-world:mytag
代理 YUM 源
代理 APT 源
和 YUM 源代理稍有不同的是,APT 源代理时没有 Group 仓库,但是使用APT源的系统如Ubuntu也是有多个版本的,我们只需要在 Distribution 参数里填写需要代理的版本即可,每隔版本用逗号分隔。
常用的版本以及代号如下:
- Ubuntu 16.04 Xenial Xerus
- Ubuntu 18.04 Bionic Beaver
- Ubuntu 20.04 Focal Fossa
- Ubuntu 21.04 Hirsute Hippo
- Ubuntu 21.10 Impish Indri
- Ubuntu 22.04 Jammy Jellyfish
- Ubuntu 22.10 Kinetic Kudu
- Ubuntu 23.04 Lunar Lobster
- Ubuntu 23.10 Mantic Minotau
代理地址为:http://192.168.1.9:8081/repository/apt-proxy/,我们可以在Ubuntu中使用这个地址来代理APT源。修改/etc/apt/sources.list
文件,将原来的源地址替换为Nexus的地址即可。
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://192.168.1.9:8081/repository/apt-proxy/ jammy main restricted universe multiverse
# deb-src http://192.168.1.9:8081/repository/apt-proxy/ jammy main restricted universe multiverse
deb http://192.168.1.9:8081/repository/apt-proxy/ jammy-updates main restricted universe multiverse
# deb-src http://192.168.1.9:8081/repository/apt-proxy/ jammy-updates main restricted universe multiverse
deb http://192.168.1.9:8081/repository/apt-proxy/ jammy-backports main restricted universe multiverse
# deb-src http://192.168.1.9:8081/repository/apt-proxy/ jammy-backports main restricted universe multiverse
deb http://192.168.1.9:8081/repository/apt-proxy/ jammy-security main restricted universe multiverse
# deb-src http://192.168.1.9:8081/repository/apt-proxy/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb http://192.168.1.9:8081/repository/apt-proxy/ jammy-proposed main restricted universe multiverse
# # deb-src http://192.168.1.9:8081/repository/apt-proxy/ jammy-proposed main restricted universe multiverse
代理 pip 源
使用阿里云作为代理,我们需要在Nexus中创建一个PyPI代理仓库。点击左侧菜单栏的Repositories,然后点击Create repository,选择PyPI (proxy),按照下图填写:
再创建一个PyPI Group仓库,将刚刚创建的PyPI代理仓库和PyPI Hosted仓库添加到Group仓库中。
编辑/etc/pip.conf
文件,添加以下内容:
或者在用户目录下的
~/.pip/pip.conf
文件中添加
[global]
index = http://192.168.1.9:8081/repository/pypi/
index-url = http://192.168.1.9:8081/repository/pypi/simple
trusted-host = 192.168.1.9
在 WSL2 中使用 Nexus 代理
因为 WSL2 使用的是宿主机Windows的Docker desktop作为Docker引擎,所以我们需要在Windows中配置Docker的代理。打开Docker Desktop,点击Settings,然后选择Docker Engine,添加以下内容:
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"experimental": false,
"insecure-registries": [
"http://192.168.1.9:8082"
],
"registry-mirrors": [
"http://192.168.1.9:8082"
]
}
重启Docker Desktop。然后在WSL2中使用 docker info
查看是否配置成功。
常见错误
docker login nexus unauthorized authentication required
- 确认登录密码是否正确,密码为Nexus登录密码
- 却是否启用Realms
docker login nexus connection refused
docker login 192.168.1.9:8082 -u admin -p admin123
确认Docker compose配置文件中已经将端口8082暴露,如果新增需要重启Nexus
确认防火墙关闭或者已经打开端口
sudo ufw allow 8082 sudo ufw allow 8082/tcp
确认已经将私有仓库添加到了
/etc/docker/daemon.json
,并且及时重启了docker服务sudo systemctl restart docker.service
确认已经开启了Http connector
- 如图:
Responsive Image
- 如图: