应用场景: 在局域网中

  1. 电脑A可以上外网,局域网ip为192.168.31.3,充当局域网中的代理服务器192.168.31.3:19966
  2. 电脑B不可以上网,局域网ip为192.168.31.5
  3. 电脑C不可以上网,局域网ip为192.168.31.4
  4. B、C可以通过A代理上网,apt通过代理也可以正常下载
  5. 在B配置docker私有仓库,C拉取B仓库的镜像

章节适用说明:

  1. 在B中需要进行一、网络配置使docker可以上网,从而可以拉取registry
  2. 当B使用docker push 192.168.31.5:5000/tag_name需要断开docker代理

这样其实很不方便,改进的局域网私有仓库搭建思路

  1. 作为私有仓库的主机B,有两块网卡,一块连接外网,一块连接局域网,这样不需要代理服务器A
  2. 这样B可以省去push到私有仓库时需要断开代理的麻烦
  3. C可以不用连接外网,直接拉取局域网B仓库的镜像
  4. C如果不能直接上外网,可以在B上搭建代理服务器,C通过B可以代理上网,正常使用apt

一、网络配置

1 配置docker代理

sudo vi /lib/systemd/system/docker.service

在[Service]部分下增加Environment字段,配置http代理地址

[Service]
Environment="HTTP_PROXY=192.168.31.3:19966/" "HTTPS_PROXY=192.168.31.3:19966/"

重启docker服务

systemctl daemon-reload
systemctl restart docker

2 配置国内docker源

vim /etc/docker/daemon.json

阿里镜像(可以自己申请加速地址)1

{
"registry-mirrors": ["https://alzgoonw.mirror.aliyuncs.com"]
}

中科大源:

{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}

二、服务端配置2

1 拉取registry镜像

docker pull registry

2 运行仓库容器

拉取成功之后,使用docker images -a检查是否存在registry

docker run -d -p 5000:5000 --name="docker-registry" --restart=always -v /root/docker/registry/:/var/lib/registry/ registry

注:

  1. 后台启动 registry 镜像构建出来的容器,并命名为 docker-registry,端口号映射为 5000 到 5000
  2. –restart=always 代表当容器因为某些原因停止时,不管退出码是什么都自动重启。除了 always 还有 on-failure 代表只有退出码不为 0 时才重启,并且接受重启次数参数:–restart=on-failture:5
  3. -v 指定将宿主机的 /root/docker/registry/ 目录挂载到容器的 /var/lib/registry/ 目录。
  4. 端口占用:
    查询占用:lsof -i:5000 若要关闭使用这个端口的程序,使用kill + 对应的pid,kill -9 PID号

3 push镜像到私有仓库

将B(ip:192.168.31.5)的registry镜像push到局域网私有仓库(其实还是在B的主机上,但是局域网中的其他机器可以访问到)

  1. 需要将registry镜像做一个标签
docker tag registry 192.168.31.5:5000/liu/registry
  1. push 到局域网私有仓库,docker不使用代理
docker push 192.168.31.5:5000/liu/registry
  1. 检查私有仓库中的镜像,输出{"repositories":["liu/registry"]},成功
curl 192.168.31.5:5000/v2/_catalog

第二步出错:
The push refers to repository [192.168.31.5:5000/liu/registry] Get https://192.168.31.5:5000/v2/: http: server gave HTTP response to HTTPS client 解决:

vim /etc/docker/daemon.json

加入:

"insecure-registries": [
        "192.168.31.5:5000"
    ]

注意需要逗号隔开。文件配置错误会导致:Failed to start Docker Application Container Engine. 例如模板:

{
    "data-root": "/var/lib/docker",
    "log-opts": {
        "max-size": "2g",
        "max-file": "2"
    },
    "registry-mirrors": [
        "https://docker.mirrors.ustc.edu.cn/",
        "https://hub-mirror.c.163.com",
        "https://registry.docker-cn.com",
        "https://dockerhub.azk8s.cn",
        "https://reg-mirror.qiniu.com",
        "https://registry.docker-cn.com"
    ],
    "runtimes": {
        "nvidia": {
            "runtimeArgs": [],
            "path": "/usr/bin/nvidia-container-runtime"
        }
    },
    "log-driver": "json-file"
}
service docker restart

三、客户拉取局域网中私有仓库镜像

docker pull 192.168.31.5:5000/liu/registry

Error response from daemon: Get https://192.168.31.5:5000/v2/: http: server gave HTTP response to HTTPS client 解决:

vim /etc/docker/daemon.json

加入:

"insecure-registries": [
        "192.168.31.5:5000"
    ]
service docker restart