一、环境准备
#1.nexus3容器版
sonatype/nexus3
#2.nginx容器版
nginx
#从官方下载以上工具并安装docker-compose部署
#3.docker20.10.7版本
二、客户端使用操作
#1.客户端主机操作
echo "192.168.0.210 mydocker.io" |tee -a /etc/hosts
mkdir -p /etc/docker/certs.d/mydocker.io
#在(192.168.0.210)拷贝root.crt至客户端
scp -r /home/nexus3-nginx/conf.d/ssl/mydocker.io.crt 客户端IP:/etc/docker/certs.d/mydocker.io/
#2.客户端使用
#用户是在nexus3中创建
#登录
docker login -u autumner -p 1234qwer mydocker.io
#打标签
docker tag image:label mydocker.io/image:label
#推送
docker push mydocker.io/image:label
#拉取
docker pull mydocker.io/image:label
#注:
#因客户端不具备上网功能所以不能直接进行docker search image搜索,只能通过代理远程拉取,具体操作
docker pull mydocker.io/image:label
三、docker私库配置操作
3.1.nexus3准备工作
#1.docker-compose启动nexus3
vim docker-compose.yml
version: '3.1'
services:
nexus:
restart: always
image: sonatype/nexus3
container_name: nexus3
ports:
- 80:8081
volumes:
- nexus-data:/nexus-data
volumes:
nexus-data:
#2.启动nexus3
docker-compose -f docker-compose.yml up -d
#停止
docker-compose -f docker-compose.yml down
#3.浏览器访问nexus3
http://192.168.0.210
#修改admin用户密码
#进入nexus3容器查看默认密码
docker exec -it nexus3 sh
sh-4.4$ cat /opt/sonatype/sonatype-work/admin.password
#然后在浏览器进行admin用户密码修改
3.2.blob存储创建
#浏览器
http://192.168.0.210 用户名:admin 密码:1234qwer点击配置
Repository-Blob Stores-Create blob store-Name("docker-blob")-Create blob store
#定义一个Name,其它内容会自动补全
3.3.创建hosted类型Docker仓库
Repository-Repositories-Create repository-docker(hosted)
Name: 定义一个名称docker-local
Online: 勾选。这个开关可以设置这个Docker repo是在线还是离线。
Repository Connectors(HTTP 8083):连接器允许docker客户端直接连接到docker仓库,并实现一些请求操作,如docker pull, docker push, API查询等。但这个连接器并不是一定需要配置的,尤其是我们后面会用group类型的docker仓库来聚合它。
把HTTP这里勾选上,然后设置端口为8083
Allow anonymous docker pull:不勾选。这样的话就不允许匿名访问了,执行docker pull或 docker push之前,都要先登录:docker login
Docker Registry API Support:Docker registry默认使用的是API v2, 但是为了兼容性,我们可以勾选启用API v1。
Storage-Blob store:下拉选择前面创建好的专用blob:docker-blob
Hosted-Delpoyment policy:开发环境允许运行重复发布,因此选择Allow redeploy。
最后保存
3.4.创建proxy类型Docker仓库
Repository-Repositories-Create repository-docker(proxy)
#proxy类型仓库,可以帮助我们访问不能直接到达的网络,如官方的dockerhub镜像库。
Name: docker-proxy
Repository Connectors: 不设置。
Docker Registry API Support-Enable Docker V1 API:勾选
Proxy-
Remote Storage: docker hub的proxy,这里填写: https://registry-1.docker.io 这个是官方默认的一个链接
Docker Index: Use Docker Hub
Storage:idocker-hub
Auto blocking enabled:勾选
Storage-Blob store:下拉选择前面创建好的专用blob:docker-blob
Negative Cache-Not found cache enabled:勾选
最后保存
3.5.创建group类型Docker仓库
Repository-Repositories-Create repository-docker(group)
#group类型的docker仓库,是一个聚合类型的仓库。将前面创建的2个仓库聚合成一个URL对外提供服务,可以屏蔽后端的差异性,实现类似透明代理的功能。
name:docker-group
Repository Connectors(8082):启用了一个监听在8082端口的http连接器;
把HTTP这里勾选上,然后设置端口为8082
Docker Registry API Support-Enable Docker V1 API:勾选
Storage-Blob store:下拉选择前面创建好的专用blob:docker-blob
group : 将左边可选的2个仓库,添加到右边的members下。
最后保存
3.6.创建docker私库用户
#1.设置nexus3的web端管理权限
Security-Realms-右侧
把Docker Bearer Token Realm 增加到Active中然后点击Save保存
#2.创建规则
Security-Roles-右侧Create role
Role ID: nx-docker-role #必填,nx-docker-role自定义的
Role name: nx-docker-hub-role #必填,nx-docker-hub-role自定义的
Privileges:
把Filter中的
nx-repository-admin-docker-docker-group-*
nx-repository-admin-docker-docker-local-*
nx-repository-admin-docker-docker-proxy-*
nx-repository-view-docker-*-*
增加到Given中然后点击Save保存
#3.创建docker用户
Security-Users-右侧Create local user
ID: 必填
First name: 必填
last name: 必填
email: 必填
Password: 必填
confirm password: 必填
Status:Active
Roles:
nx-anonymous
nx-docker-hub-role增加到Granted中
然后点击Create local user保存完成
**最后docker的3个私有仓库建立完成,但在推送和拉取时需要各自地址操作,使用起来非常不方便,解决办法我们可以通过nginx代理来实现**
四、nginx代理访问Docker私有仓库
4.1.nginx安装
#本例通过容器模式部署nginx,直接通过dockerhub拉取镜像
4.2.证书生成
#通过工具一键生成证书
#创建配置文件和日志目录
mkdir -p /home/nexus3-nginx/conf.d/ssl
mkdir -p /home/nexus3-nginx/logs
cd /home/nexus3-nginx/conf.d/ssl
#一键生成证书
./gencer.sh
[root@nexus-nfs ssl]# ./gencer.sh
Enter your domain [www.example.com]:mydocker.io
Enter your serverName [nginx]:mydocker.io
Create server key...
Generating RSA private key, 1024 bit long modulus
............++++++
附件:gencer.sh源码
#!/bin/sh
# create self-signed server certificate:
read -p "Enter your domain [www.example.com]:" DOMAIN
read -p "Enter your serverName [nginx]:" SERVERNAME
echo "Create server key..."
openssl genrsa -des3 -out $SERVERNAME.key 2048
echo "Create server certificate signing request..."
SUBJECT="/C=CN/ST=TJ/L=TJ/O=AUTUMNER/OU=ECW/CN=$DOMAIN"
openssl req -new -subj $SUBJECT -key $SERVERNAME.key -out $SERVERNAME.csr
echo "Remove password..."
mv $SERVERNAME.key $SERVERNAME.origin.key
openssl rsa -in $SERVERNAME.origin.key -out $SERVERNAME.key
echo "Sign SSL certificate..."
openssl x509 -req -days 3650 -in $SERVERNAME.csr -signkey $SERVERNAME.key -out $SERVERNAME.crt
openssl x509 -in $SERVERNAME.crt -out $SERVERNAME.cer -outform der
openssl x509 -inform der -in $SERVERNAME.cer -out $SERVERNAME.pem
4.3.nginx配置
#在主机/home/nexus3-nginx/conf.d目录创建dockerhub.conf
cd /home/nexus3-nginx/conf.d
vim dockerhub.conf #粘贴以下内容
#ip地址换成本服务器主机ip
upstream nexus_docker_get {
server 192.168.0.210:8082;
}
upstream nexus_docker_put {
server 192.168.0.210:8083;
}
server {
listen 80;
listen 443 ssl;
server_name mydocker.io;
access_log /var/log/nginx/mydocker.io.log;
# 证书
ssl_certificate /etc/nginx/conf.d/ssl/mydocker.io.crt; # 证书路径根据上面生成的来定
ssl_certificate_key /etc/nginx/conf.d/ssl/mydocker.io.key;
ssl_protocols TLSv1.1 TLSv1.2;
ssl_ciphers '!aNULL:kECDH+AESGCM:ECDH+AESGCM:RSA+AESGCM:kECDH+AES:ECDH+AES:RSA+AES:';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
# disable any limits to avoid HTTP 413 for large image uploads
client_max_body_size 0;
# required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
chunked_transfer_encoding on;
# 设置默认使用推送代理
set $upstream "nexus_docker_put";
# 当请求是GET,也就是拉取镜像的时候,这里改为拉取代理,如此便解决了拉取和推送的端口统一
if ( $request_method ~* 'GET') {
set $upstream "nexus_docker_get";
}
# 只有本地仓库才支持搜索,所以将搜索请求转发到本地仓库,否则出现500报错
if ($request_uri ~ '/search') {
set $upstream "nexus_docker_put";
}
index index.html index.htm index.php;
location / {
proxy_pass http://$upstream;
proxy_set_header Host $host;
proxy_connect_timeout 3600;
proxy_send_timeout 3600;
proxy_read_timeout 3600;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
proxy_request_buffering off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto http;
}
}
4.4.nginx启动
#编辑nexus3和nginx的docker-compose文件
#停止nexus3的容器
docker-compose -f docker-compose.yml down
#编辑docker-compose.yml文件
version: '3.1'
services:
nexus:
restart: always
image: sonatype/nexus3
container_name: nexus3
ports:
- 80:8081
- 8082:8082 #开启docker的group类型端口
- 8083:8083 #开启docker的hosted类型端口
volumes:
- nexus-data:/nexus-data
dockerhub: #增加nginx容器
restart: always
image: nginx
container_name: dockernginx
depends_on:
- nexus
ports:
- 443:443 #开启https端口
volumes:
- /home/nexus3-nginx/logs:/var/log/nginx:rw #挂载日志目录
- /home/nexus3-nginx/conf.d:/etc/nginx/conf.d:ro #挂载nginx配置文件和证书
volumes:
nexus-data:
#启动docker-compose
docker-compose -f docker-compose.yml up -d
五、客户端机验证参考第二章节客户操作
#1.拉取镜像报如下错误
Error response from daemon: Head https://mydocker.io/v2/busybox/manifests/latest: no basic auth credentials
#解决方法
#登录
docker login -u autumner -p 1234abcD mydocker.io
#2.直接搜索镜像报错
docker search redis
Error response from daemon: Get https://index.docker.io/v1/search?q=redis&n=25: dial tcp: lookup index.docker.io on 219.150.32.132:53: read udp 192.168.0.217:56157->219.150.32.132:53: i/o timeout
#解决方法
docker search mydocker.io/redis #带上mydocker.io标签实现代理下载redis