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. sql 遍历list

    <select id="findadminSaleList" parameterClass="java.util.Map" resultClass=&qu ...

  2. 汉化gitlab

    一.,基于 Larry Li 版汉化指南 修改 (以9-0-stable-zh分支为例) 源码安装汉化 推荐按照 gitlab-ce 源代码中 doc/install/installation.md ...

  3. Node:使用express搭建一个简易的服务器

    ①安装node环境 在node.js官网下载LTS长期支持版本,然后傻瓜式安装 ②查看是否安装成功 打开cmd终端,输入node -v 有版本号,则安装成功.再输入npm -v 有版本号,则npm也安 ...

  4. python+selenium笔记(一):元素定位方法

    一.环境准备: 1.浏览器选择:Firefox 2.安装插件:Firebug和FirePath(设置>附加组件>搜索:输入插件名称>下载安装后重启浏览器) 3.安装完成后,页面右上角 ...

  5. Unity 3D里相机的平滑跟随(转)

    1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 public class ...

  6. java.lang.NoClassDefFoundError: org/I0Itec/zkclient/IZkStateListener

    spark streaming 读 kafka 报错 java.lang.NoClassDefFoundError: org/I0Itec/zkclient/IZkStateListener java ...

  7. Jmeter连接redis

    介绍:现在有很多数据不是存储在数据库而是存储在Redis中 Redis数据库存储数据环境 不用每次都去数据库读取数据 可以有效的优化服务器性能. 下面介绍使用jmeter如何读取redis 一.首先创 ...

  8. element Cascader 多选 点击文字选中

    html 部分 1 <el-form-item label="A部署位置" > 2 <el-cascader 3 v-model="itemType.a ...

  9. Hive JDBC执行load时无法从本地加载数据

    通过hive-jdcv连接hive server,在应用服务端执行以下命令,报错:Hiver Server节点上找不到data.txt load data local inpath '/home/dw ...

  10. NET 5 Cron表达式

    cron表达式通过特定的规则指定时间,用于定时任务 1. 整体结构 cron表达式是一个字符串,分为6或7个域,每两个域之间用空格分隔,其语法格式为: "秒域 分域 时域 日域 月域 周域 ...