拉取 nginx 最新版镜像:
docker pull registry:latest
为 registry 创建一个文件夹:
mkdir -p /home/docker/registry/
启动 registry 容器:
docker run --name registry01 -d --restart=always -v /home/docker/registry/:/var/lib/registry/ -p 6000:5000 registry
因为宿主机的 5000 端口被占用了,所以我就改用了 6000 端口
在启动 registry 容器后,使用 -v 参数映射时会自动创建 docker/registry/ 目录,所以主机的映射目录就变成了:/home/docker/registry/docker/registry/... ,对于强迫症患者来说,实在太别扭了,所以直接映射到主机的 home/ 文件夹即可,停止并删除容器,然后重新执行:
docker run --name registry01 -d --restart=always -v /home/:/var/lib/registry/ -p 6000:5000 registry
registry 容器已成功运行,需要验证一下:
curl http://localhost:6000/v2/_catalog
若能正常访问 registry 接口 _catalog,证明 registry 服务启动成功。
在安装并成功启动 registry 服务后,还需要配置一下,编辑 /etc/docker/daemon.json 文件,添加配置代码 "insecure-registries":["localhost:6000"],然后执行 systemctl daemon-reload 重新加载配置,因为镜像在推送到仓库的时候,可能会遇到问题:http: server gave HTTP response to HTTPS client,默认是使用 https 协议的,但我们的仓库是使用的http,所以要么创建一个https映射,要么将仓库地址加入到不安全的仓库列表中。
下面我们来试一下,push 一个镜像到刚刚创建的私有仓库中,但在 push 之前需要先创建用户:
docker login localhost:6000
Username: zzy0209
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
为了指定镜像上传的目标地址,需要在镜像名称前加上私有仓库的访问地址和用户名,具体镜像名称格式如下:REGISTRY_HOST/USERNAME/IMAGE_NAME:TAG
可以通过 docker tag 命令来修改镜像的名称:
docker tag am/service_gateway:74a5635 localhost:6000/zzy0209/am/service_gateway:74a5635
最后,将这个镜像 push 到私有仓库中:
docker push localhost:6000/zzy0209/am/service_gateway
再通过 registry 的 _catalog 接口验证一下:
curl http://localhost:6000/v2/_catalog
{"repositories":["zzy0209/am/service_gateway"]}
OK~
补充:设置仓库允许跨域访问
先复制一份 config.yml 配置文件
docker cp registry01:/etc/docker/registry/config.yml /home/docker/registry/config.yml
添加跨域配置后保存
vi /home/docker/registry/config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
Access-Control-Allow-Headers: ['Origin,Accept,Content-Type,Authorization']
Access-Control-Allow-Origin: ['*']
Access-Control-Allow-Methods: ['GET,POST,PUT,DELETE']
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
删除之前的容器,重新创建容器,并挂载 config.yml 配置文件
docker rm -f registry01
docker run --name registry01 -d --restart=always -v /home/:/var/lib/registry/ -v /home/docker/registry/config.yml:/etc/docker/registry/config.yml -p 6000:5000 registry