首先尝试搭建一个简单的私有容器镜像仓库 ——Registry。
一、搭建 Registry
在本机拉取 Registry 镜像:
执行命令 docker pull registry,成功拉取镜像。
创建容器:
运行命令 docker run -d -p 5000:5000 -v /root/docker_registry:/var/lib/registry --restart=always registry。
然后访问 ip:5000/v2/_catalog,查看是否有输出。
配置 Docker 守护进程:
编辑 /etc/docker/daemon.json文件,加入以下内容:
json
Copy
"insecure-registries": [
"http://xxx.xxx.xxx.xxx:5000"
]
注意这里似乎不能填localhost,也有说法是不能带http://。但经过尝试,加上后可能会导致 Docker 启动不了。
给镜像打标签并推送:
给已经存在于docker images下的镜像打标签,例如docker tag redis xxx.xxx.xxx.xxx:5000/redis:v1。
然后执行docker push xxx.xxx.xxx.xxx:5000/redis:v1,但可能会报http: server gave HTTP response to HTTPS client错误。
由于在阿里云服务器上搭建时遇到问题,决定采用 Nginx 代理实现 HTTPS。
在阿里云服务器上操作:
先在本机将拉取到的 Registry 保存为 tar 包,执行docker save -o registry_latest.tar registry:latest。
在阿里云服务器上执行docker load --input registry_latest.tar。
由于阿里云服务器上 5000 端口被占用,选择一个新端口如 8055。在/root下创建一个目录docker_registry,然后运行 Registry 容器,命令为docker run -d -p 8055:5000 -v /root/docker_registry:/var/lib/registry --restart=always registry。
配置 Nginx:
配置/etc/nginx/nginx.conf文件,加入以下内容:
server {
listen 443 ssl;
server_name xxxxx.com;
client_max_body_size 500m;
ssl_certificate /root/xxxxx/full_chain.pem;
ssl_certificate_key /root/xxxxx/private.key;
ssl_session_timeout 5m;
location / {
proxy_pass http://localhost:8055;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header request_uri $request_uri;
index index.html index.htm;
}
}
然后执行nginx -s reload重新加载配置。
镜像操作:
回到本机给镜像打标签,例如docker tag redis xxx.kecq.com/redis(也可以在最后加上版本号,如:v1或:1.0.0)。
然后执行docker push xxxx.kecq.com/redis,之后就可以通过docker pull xxxx.kecq.com/redis拉取镜像了。
但这种方式是公开访问的,如果不在内网或 VPN 下不太安全。于是,接下来学习搭建 Harbor。
二、搭建 Harbor
安装 Docker Compose:
如果没有安装docker-compose,先进行安装,例如执行apt install docker-compose。
下载 Harbor 离线包:
从 GitHub 下载离线包,文件名一般为harbor-offline-installer-v2.10.3.tgz。下载到本地后解压,将其上传到服务器上。
将harbor.yml.tmpl文件复制并重命名为harbor.yml,打开这个文件修改hostname为自己的 IP。如果不使用 HTTPS,可以将 HTTPS 相关的配置部分注释掉。
加载镜像并安装:
在解压后的目录中,使用 Docker 命令加载解压后的镜像,执行docker load -i harbor.v2.10.3.tar.gz。
将文件夹下的prepare和install.sh文件新增执行权限。
使用./prepare预处理一些文件,进行初始化。然后执行./install.sh安装。如果已经有redis容器,可能会报错。
可以先把以前的redis容器改下名字,例如docker rename redis myredis,然后再重新执行./install.sh,就可以成功安装。成功后访问http://IP(因为yml文件默认是 80 端口,如果使用非 80 端口,需要在安装前修改yml文件)。默认用户名密码为admin和Harbor12345。
解决登录问题:
在 Docker 登录时可能会报错,例如执行docker login -u admin -p xxxxxxxxx https://192.168.8.205时,可能会出现Error response from daemon: Get "https://192.168.8.205/v2/": dial tcp 192.168.8.205:443: connect: connection refused错误。
如果不使用 HTTPS,可以尝试以下方法:
vim /usr/lib/systemd/system/docker.service
修改内容地方
......
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.8.205 --containerd=/run/containerd/containerd.sock
......
重启服务
systemctl daemon-reload
systemctl restart docker
再次登录
docker login -u admin -p Harbor12345 http://192.168.8.205
如果还是想使用 HTTPS,可以在软路由 OpenWRT 中将这台 Ubuntu 服务器设一个主机头。
重新配置 Harbor:
停止所有 Harbor 的容器并删除,执行docker-compose down -v。
修改yml文件中的hostname为har.kecq.com,再将 SSL 证书(如*.kecq.com)上传,并修改yml文件中的证书路径。
重新执行./install.sh安装,但似乎还有其他不用重装的方法,这里没有尝试。
登录和使用:
停止现有的 Harbor 实例后,修改配置文件(虽然文中提到vim harbor.cfg,但实际上应该是yml文件)。
运行./prepare脚本来填充配置,然后执行docker-compose up -d重启服务。此时发现用默认密码Harbor12345无法登录了,用上一次修改后的密码可以登录。
执行docker login,例如docker login -u admin -p xxxxxx https://har.kecq.com:8043就成功了。
然后可以测试推送私有仓库镜像,例如docker tag redis har.kecq.com:8043/my/redis,然后执行docker push har.kecq.com:8043/my/redis。如果要退出,可以执行docker logout har.kecq.com:8043。测试docker push时会出现unauthorized to access repository错误。
重启 Ubuntu 后容器没有自动启动,需要转到 Harbor 目录,执行docker-compose start启动。
后面尝试过不开启 HTTPS,而用 Ubuntu 上安装的 Nginx 代理 HTTPS 也是可行的,但 Harbor 不能同时开启 HTTPS,否则会因为 Nginx 代理导致跳转错误,因为 Harbor 开启 HTTPS 后,HTTP 会自动跳转。