默认情况下,在执行docker pull命名时,docker是从官方的镜像源地址拉取下载镜像的,即registry.hub.docker.com这个地址。该地址是docker公司提供的公共仓库。
对于具有商业秘密的项目上传到官方的公共仓库是不安全的,如果在单位内部需要统一管理并共享单位内部使用的镜像,需要搭建私有仓库。
所谓的私有仓库,就是在本地(局域网)搭建类似公共仓库的镜像仓库,可以将镜像提交到私有仓库,实现镜像共享,也避免了商业安全相关的危险。
如何搭建私有仓库
docker官方通过容器的方式提供了私有仓库的部署服务,官方的私有仓库镜像是registry。
[root@jamza_vm_master_litepaas registry_test]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
registry 2.6.2 d1fd7d86a825 16 months ago 33.28 MB
registry latest d1fd7d86a825 16 months ago 33.28 MB
一般使用registry镜像创建容器就完成了私有仓库的部署,但是一般为了完成定制配置,需要使用定制化的配置文件。
配置文件config.yml仿真私有仓库容器的/etc/docker/registry/目录下。配置文件的典型内容如下:
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
delete:
enabled: true
http:
addr: :5000
secret: docker-registry
headers:
X-Content-Type-Options: [nosniff]
Access-Control-Allow-Headers: ['*']
Access-Control-Allow-Origin: ['*']
Access-Control-Allow-Methods: ['GET,POST,PUT,DELETE']
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
注意,如果不设置http.secret,则会遇到如下的错误:No HTTP secret provided - generated random secret.
随后,创建私有仓库容器:
docker run -d -p 5000:5000 --restart=always \
-v /var/lib/registry/:/var/lib/registry/ \
-v /etc/docker/registry/config.yml:/etc/docker/registry/config.yml \
--name test-registry \
registry:2.6.1
假设容器所在主机的地址为192.168.1.200,则通过访问地址 http://192.168.1.200:5000/v2/ 来检查仓库是否正常运行,返回 { } 表示部署成功。
推送镜像到私有仓库
推送镜像到私有仓库,需要先根据私有仓库的地址标签来设置镜像的新标签,操作的范例如下:
# pull image from docker hub(从官方仓库拉取一个镜像)
docker pull alpine:3.6
# 根据私有仓库,设定标签(必须)
# 为镜像 `alpine:3.6` 创建一个新标签 `192.168.1.200:5000/alpine:3.6`
docker tag alpine:3.6 192.168.1.200:5000/alpine:3.6
# 推送到私有仓库中
docker push 192.168.1.200:7000/alpine:3.6
其他问题
在向私有仓库推送镜像时,可能会遇到问题:http: server gave HTTP response to HTTPS client。
因为默认提交到https,但是私有仓库是使用http,此时或者创建一个https映射,或者将私有仓库地址加入到不安全的仓库列表中。
将私有仓库地址加入到不安全的仓库列表中的方法包括:
# 编辑 /etc/docker/daemon.json
vi /etc/docker/daemon.json
# 增加配置项
{
... # 其他配置项
"insecure-registries":[ "192.168.1.200:5000"]
}
# 重启Docker服务
systemctl daemon-reload
service docker restart
或者另一种方法是:
# 编辑 /lib/systemd/system/docker.service
vi /lib/systemd/system/docker.service
# 增加配置项
...
ExecStart=/usr/bin/dockerd --insecure-registry=192.168.1.200:5000
...
# 重启Docker服务
systemctl daemon-reload
service docker restart