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

Docker学习笔记之搭建Docker私有仓库的更多相关文章

  1. Docker学习笔记之搭建Docker运行环境

    0x00 概述 既然 Docker 是一款实用软件,我们就不得不先从它的安装说起,只有让 Docker 运行在我们的计算机上,才能更方便我们对 Docker 相关知识和使用方式的学习.得益于与商业性的 ...

  2. Docker学习笔记六:Docker搭建企业级私有仓库

    前言 Docker不仅是一个强大的服务器部署工具,而且它还有一个官方的Docker Hub registry用于储存Docker镜像.上传镜像到Docker Hub是免费的,上传的镜像文件同时也对公共 ...

  3. Docker学习笔记之搭建 Java Web 项目运行环境

    0x00 概述 Java Web 泛指以 Java 程序为基础向外提供 Web 服务的技术及相关工具,狭义上来说,我们也可以说 Java Web 是由 Servlet 程序提供的 Web 服务. 对我 ...

  4. docker学习笔记-01:docker基本原理

    一.docker原理 1.什么是docker:解决了运行环境和配置问题的容器,方便做持续集成并有助于整体发布的容器虚拟化技术. 2.虚拟机的缺点:(1)资源占用多:(2)冗余步骤多:(3)启动慢,分钟 ...

  5. Docker学习笔记之编写 Docker Compose 项目

    0x00 概述 通过阅读之前的小节,相信大家对 Docker 在开发中的应用已经有了一定的了解.作为一款实用的软件,我们必须回归到实践中来,这样才能更好地理解 Docker 的实用逻辑和背后的原理.在 ...

  6. Docker学习笔记之使用 Docker Compose 管理容器

    0x00 概述 通过之前的介绍,我们已经基本掌握了构建.运行容器的方法,但这还远远不够,由于 Docker 采用轻量级容器的设计,每个容器一般只运行一个软件,而目前绝大多数应用系统都绝不是一个软件所能 ...

  7. Docker学习笔记二:Docker常用命令及提升拉取镜像的速度

    一.Docker命令: 1.docker images   //命令用来查看docker中所包含的镜像信息 2.docker ps -a    //命令用来查看docker中所包含所有容器信息(运行状 ...

  8. Docker学习笔记——1.2 Docker组件

    Docker的核心组件包括: Docker客户端和服务器,也称为Docker引擎: Docker镜像: Registry: Docker容器. 1.Docker客户端和服务器 Docker是一个客户端 ...

  9. docker 学习笔记21:docker连接网络的设置

    1.如果docker主机不需要通过代理连接外网 则docker的相关命令(如docker search)或docker容器与网络相关的操作都可以正常进行,不需要特殊设置. 2.当docker主机 是通 ...

随机推荐

  1. 海量数据架构下如何保证Mycat的高可用?

    写在前面 在<冰河,能讲讲Mycat如何实现MySQL的读写分离吗?>一文中,我们实现了使用Mycat实现MySQL的读写分离.然而,此时的Mycat只有一个节点,如果Mycat节点宕机了 ...

  2. MySQL技术内幕InnoDB存储引擎(一)——MySQL体系结构和存储引擎

    1.数据库和实例 数据库(database)和实例(instance)不能混淆. 什么是数据库 数据库是物理操作系统文件或其他文件类型的集合.说白了,就是存储着的文件,不会运行起来,只能被实例增删改查 ...

  3. Java安全之原生readObject方法解读

    Java安全之原生readObject方法解读 0x00 前言 在上篇文章分析shiro中,遇到了Shiro重写了ObjectInputStream的resolveClass导致的一些基于Invoke ...

  4. MySQL最经典50道练习题

    表名和字段 学生表 Student(s_id,s_name,s_birth,s_sex):学生编号.学生姓名.出生年月.学生性别. 课程表 Course(c_id,c_name,t_id):课程编号. ...

  5. 【Harbor学习笔记】-教你快速搭建Docker私有仓库

    目录 架构图 Harbor依赖的外部组件 Harbor自有组件 核心组件 安装 1. 下载离线安装包 2. 配置 harbor.cfg (harbor.yml) 3. 启动 Harbor 安装配置问题 ...

  6. XML外部实体注入

    文章参考链接: 参考视频: https://www.bilibili.com/video/BV1tW411o7Fd?from=search&seid=13868972487110648015 ...

  7. ActiveMq反序列化漏洞(CVE-2015-5254)漏洞复现

    漏洞原理 Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类.远程攻击者可借助特制的序列化的Java Message Service( ...

  8. DRF使用超链接API实现真正RESTful

    很多API并不是真正的实现了RESTful,而应该叫做RPC (Remote Procedure Call 远程过程调用),Roy Fielding曾经提到了它们的区别,原文如下: I am gett ...

  9. 神经网络高维互信息计算Python实现(MINE)

    论文 Belghazi, Mohamed Ishmael, et al. " Mutual information neural estimation ."  Internatio ...

  10. 获取Web项目中的控制器类以及类中Action方法

    前言 在使用时需要修改命名空间.需要过滤控制器.需要过滤Action方法.结果生成表的插入语句. 代码 public ActionResult ReloadData() { #region 获取所有的 ...