一、主要解决的问题
解决前
- push时,需要带上域名和端口比如:docker push docker.xxx.com:port/....
- pull时,需要带上域名和端口比如:docker pull docker.xxx.com:port/....
- push、pull时,需要使用不同的端口
解决后
- push、pull时,只需要写镜像名称即可,无需带上域名(ip)和端口号,比如:docker pull base_tomcat
二、步骤
-
私库软件采用Nexus
-
创建docker的nexus私库时,一共需要建三个服务
-
hosted:用于上传,也就是私库,设置http端口为:16301
-
proxy:用于代理公库
-
group:用于将hosted与proxy组织在一起,统一对外提供服务,在外界看来,就是一个地址,设置http端口为:16300
-
-
安装nginx,将pull和push的端口代理成80端口
-
准备一个域名
-
申请一份ssl证书
-
nginx可以参考如下配置:
upstream nexus_docker_get {
server 127.0.0.1:16300;
}
upstream nexus_docker_put {
server 127.0.0.1:16301;
}
server
{
listen 80;
listen 443 ssl http2;
ssl_certificate /dataStore/webServers/nginx/cert/1_docker.v246.com_bundle.crt;
ssl_certificate_key /dataStore/webServers/nginx/cert/2_docker.v246.com.key;
#ssl on;
port_in_redirect off;
server_name docker.v246.com;
proxy_set_header "Host" $host;
# 设置默认使用推送代理
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";
}
location / {
client_max_body_size 1024m;
# 以下配置用于申请ssl证书,验证域名用的
# root /dataStore/web/docker/;
# index index.html;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://$upstream;
}
access_log logs/${host}__access.log;
}
-
修改docker配置,注意,这里需要配置两个地方
- 第一、修改docker.service,vi /usr/lib/systemd/system/docker.service 在ExecStart配置项中加入:
--add-registry=docker.v246.com \ --insecure-registry=docker.v246.com \
- 完整的配置文件如下:‘
[Unit] Description=Docker Application Container Engine Documentation=http://docs.docker.com After=network.target Wants=docker-storage-setup.service Requires=docker-cleanup.timer [Service] Type=notify NotifyAccess=main EnvironmentFile=-/run/containers/registries.conf EnvironmentFile=-/etc/sysconfig/docker EnvironmentFile=-/etc/sysconfig/docker-storage EnvironmentFile=-/etc/sysconfig/docker-network Environment=GOTRACEBACK=crash Environment=DOCKER_HTTP_HOST_COMPAT=1 Environment=PATH=/usr/libexec/docker:/usr/bin:/usr/sbin ExecStart=/usr/bin/dockerd-current \ --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current \ --default-runtime=docker-runc \ --add-registry=docker.v246.com \ --insecure-registry=docker.v246.com \ --exec-opt native.cgroupdriver=systemd \ --userland-proxy-path=/usr/libexec/docker/docker-proxy-current \ --init-path=/usr/libexec/docker/docker-init-current \ --seccomp-profile=/etc/docker/seccomp.json \ $OPTIONS \ $DOCKER_STORAGE_OPTIONS \ $DOCKER_NETWORK_OPTIONS \ $ADD_REGISTRY \ $BLOCK_REGISTRY \ $INSECURE_REGISTRY \ $REGISTRIES ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=1048576 LimitNPROC=1048576 LimitCORE=infinity TimeoutStartSec=0 Restart=on-abnormal KillMode=process [Install] WantedBy=multi-user.target
- 第二、vi /etc/docker/daemon.json 加入私服。
{ "registry-mirrors":["https://docker.v246.com"] }
-
敲入登录命令:docker login 注意,如果你没进行上两步,这里就必须是:docker login docker.v246.com 滞则docker默认登录至:docker.io
-
上传至私库:docker push v246/base 注意,如果没能进行上两步,这里就必须为v246/base打一个专用于push的tab 比如:docker tag v246/tag docker.v246.com/v246/base:v1
-
拉取命令:docker pull v246/base 注意哈,如果没有进行上两步,那么这里就需要使用:docker pull docker.v246.com/v246/base:v1 这个命令进行pull了
-
最后,一定要注意,没有登录,无法push 也无法 pull
网友评论