Docker仓库服务器名为Docker注册(registry)服务器。可以使用docker push命令将镜像上传到注册服务器,也可以使用docker pull命令下载服务器的镜像。
Docker注册服务器中有多种存储镜像数据的方法,可以存储到执行Docker注册的服务器,也可以存储到阿里云提供的容器镜像服务上面(推荐,简单易用)。
1. 创建注册服务器容器
Docker注册服务器其实也是Docker Hub提供的Docker镜像。首先需要下载Docker注册服务器:
sudo docker pull registry:latest
然后以容器运行registry:latest镜像
sudo docker run -d -p 5000:5000 --name docker-registry -v /tmp/registry:/tmp/registry registry
运行后,镜像文件存储到主机的/tmp/registry目录。参数说明:-d --detach 允许容器在后台运行;-p 设置主机与容器的通信端口;--name 设置容器的名称为docker-registry;-v --volume 设置主机与容器共享的目录(Bind mount a volume)。
2. 使用push命令上传镜像到私有服务器
前面第一步我已经运行注册服务器的容器了,所以在此可以使用push命令把镜像上传到私有仓库。首先需要为需要上传的镜像创建标签(格式:docker tag <镜像名称>:<标签> <Docker registry URL>/<镜像名称>:<标签>),然后push到私有注册服务器(格式:docker push <Docker registry URL>/<镜像名称>:<标签>)。
sudo docker tag nginx:0.1 localhost:5000/nginx:0.1
sudo docker push localhost:5000/nginx:0.1
镜像上传到私有注册服务器后,可以从其它服务器连接私有注册服务器下载镜像,我这里测试只有本地一台主机,主机ip地址为192.168.123.232,所以执行以下命令下载刚刚上传的镜像
sudo docker pull 192.168.123.232:5000/nginx:0.1
关于docker pull报错:Error response from daemon: Get https://192.168.123.232:5000/v2/: http: server gave HTTP response to HTTPS client ,原因是服务器采用http通信协议,而客户端采用了https通信协议,解决方法可以参考这篇文章解决:https://blog.csdn.net/u013042928/article/details/81227536
执行docker rmi命令可以删除刚刚下载的镜像
sudo docker rmi 192.168.123.232:5000/nginx:0.1
3. 使用默认认证
- 首先编辑hosts文件,添加私有的注册服务器的映射关系。
我这里的注册服务器的ip地址为192.168.123.232,域名设置为registry.example.com,所以hosts文件添加一行192.168.123.232 registry.example.com,如下图所示:
- 接下来创建SSL自签名证书。
创建私有密钥文件:
openssl genrsa -out server.key 2048
创建证书签名申请文件:
openssl req -new -key server.key -out server.csr
注意:下面的Common Name (e.g. server FQDN or YOUR name) [] 要填上注册服务器的域名,即registry.example.com,其它选项信息根据自身情况填写
创建服务器认证文件
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
- 把证书文件server.crt安装到系统(我这里是Ubuntu1804系统)
sudo cp server.crt /usr/share/ca-certificates/
echo "server.crt" | sudo tee -a /etc/ca-certificates.conf
sudo update-ca-certificates
- 重启docker服务(只有重启服务,所添加的域名与安装的证书才能生效)
systemctl restart docker
- 创建.htpasswd文件(用于存储用户账号与密码)
Ubuntu系统需要先安装apache2-utils,CentOS需要安装httpd-tools,我这里是Ubuntu系统,所以执行命令:
sudo apt install -y apache2-utils
然后使用htpasswd命令创建.htpasswd文件,添加名为lollipop的用户,并设置密码。命令选项 -c 是创建(create)一个新的文件。
htpasswd -c .htpasswd lollipop
- 编辑nginx.conf配置文件,配置nginx的参数
文件名nginx.conf,存放在用户目录下,文件内容如下:
worker_processes 1;
events{
worker_connections 1024;
}
http{
server{
listen 443;
server_name registry.example.com ssl on;
ssl_certificate /etc/server.crt;
ssl_certificate_key /etc/server.key; proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Authorization ""; client_max_body_size 0; chunked_transfer_encoding on; location / {
proxy_pass http://docker-registry:5000;
proxy_set_header Host $host;
proxy_read_timeout 900; auth_basic "Restricted";
auth_basic_user_file .htpasswd;
}
}
}
server_name:设置Docker注册服务器的域名,我这里为registry.example.com;
ssl_certificate、ssl_certificate_key:设置证书签名和密钥的位置;
proxy_pass:设置逆向代理,设置为Docker注册容器与端口docker-registry:5000;
auth_basic:设置认证,这里设置为Restricted,默认认证方式;
auth_basic_user_file:设置用于存储用户登录认证信息的.htpasswd文件。
- 启动registry容器和nginx容器(registry镜像和nginx镜像的版本可以通过docker pull命令下载到本地)
sudo docker run -d --name docker-registry -v /tmp/registry:/tmp/registry registry:0.8.1 sudo docker run -d --name nginx-registry -v ~/nginx.conf:/etc/nginx/nginx.conf -v ~/.htpasswd:/etc/nginx/.htpasswd -v ~/server.key:/etc/server.key -v ~/server.crt:/etc/server.crt --link docker-registry:docker-registry -p 443:443 nginx:1.7.5
--link docker-registry:docker-registry选项通过docker-registry别名连接前面创建的docker-registry容器,这样就可以使用nginx.conf的proxy_pass设置,向Docker注册发送traffic
最后,就可以通过docker login https://registry.example.com尝试登录认证了。
sudo docker login https://registry.example.com
输入之前填写的用户名和密码。出现问题(未解决):
修改/etc/docker/darmon.json文件,根据上面未添加认证之前的时候pull命令推送镜像也提示这个错误,然后就在"insecure-registries"下再添加"registry.example.com:443",未成功,然后又查了资料,试了其他博客的方法半天仍然未解决,先记录下来吧。