Nexus搭建内部镜像

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 的作用包括:

  1. 存储二进制文件: Blob Store 被设计用来安全、可靠地存储二进制文件。这些文件可以是各种形式的构建产物、软件包、依赖库等。Blob Store 是 Nexus 仓库管理系统的核心,它为这些文件提供了一个中央存储位置。

  2. 支持不同类型的存储后端: Nexus 支持不同类型的 Blob Store,例如本地文件系统、云存储(如Amazon S3、Google Cloud Storage)等。这使得用户可以根据需求选择不同的存储后端,并根据实际情况进行扩展或迁移。

  3. 提供存储策略: Blob Store 允许你定义存储策略,以确定何时以及如何清理或删除不再需要的文件。这对于管理仓库的存储空间非常重要,可以根据策略自动清理不再需要的快照或旧版本。

  4. 支持代理和缓存: 在 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 需要注意以下:

  1. HTTP需要单独设置端口号。我们设置与WEB页面不同的端口号,8082即可。
  2. 需要将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

  1. 确认登录密码是否正确,密码为Nexus登录密码
  2. 却是否启用Realms

docker login nexus connection refused

docker login 192.168.1.9:8082 -u admin -p admin123
  1. 确认Docker compose配置文件中已经将端口8082暴露,如果新增需要重启Nexus

  2. 确认防火墙关闭或者已经打开端口

    1. ```bash
      sudo ufw allow 8082
      sudo ufw allow 8082/tcp
      
      3. 确认已经将私有仓库添加到了`/etc/docker/daemon.json`,并且及时重启了docker服务
      
          1. ```bash
              sudo systemctl restart docker.service
  3. 确认已经开启了Http connector

    1. 如图: