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",未成功,然后又查了资料,试了其他博客的方法半天仍然未解决,先记录下来吧。

最新文章

  1. 多线程之异步编程: 经典和最新的异步编程模型, IAsyncInfo 与 Task 相互转换
  2. 基于.net mvc 的供应链管理系统(YB-SCM)开发随笔1-开篇
  3. HTML form 表单
  4. Reconstruct Itinerary
  5. pentaho cde 选择性的显示多列数据
  6. com学习前提必看
  7. 设置appicon和启动图
  8. Jenkins的错误“error fetching remote repo origin”的问题解决
  9. Java webservice
  10. CSS下背景属性background的使用方法
  11. 关于自定义jar包(tomcat)的添加
  12. 合并BIN文件的两种方法(转)
  13. mybatis与spring的整合(使用sqlSession进行crud)
  14. 仿百度壁纸客户端(五)——实现搜索动画GestureDetector手势识别,动态更新搜索关键字
  15. Linux系统下apt-get命令无法安装常见软件包?
  16. java面向对象编程(八)--抽象类、接口
  17. 一位90后的自述:如何从年薪3w到30w
  18. python正则表达式(四)
  19. MongoDB的常用操作总结
  20. javascript模块导入导出

热门文章

  1. shell 编程 -- 条件判断
  2. Vue--子组件相互传参
  3. Typora+图床详解(小白都能学得会)
  4. IDEA创建maven项目很慢的问题解决方式
  5. SpringBoot-2.3镜像方案为什么要做多个layer
  6. OS第六章
  7. C++模板元编程----快速排序
  8. Open SSH CVE-2020-15778
  9. vue封装API接口
  10. 中小学生的噩梦:怎样用Python检测抄袭行为?广大中小学生们的美梦就此结束