前言

Docker提供了开放的中央仓库dockerhub,同时也允许我们使用registry搭建本地私有仓库。搭建私有仓库有如下的优点:

  • 节省网络带宽,提升Docker部署速度,不用每个镜像从DockerHub上去下载,只需从私有仓库下载就可;
  • 私有镜像,包含公司敏感信息,不方便公开对外,只在公司内部使用。

私有仓库基本部署

部署步骤

下载镜像仓库

  要想部署docker私有仓库必须使用官方给定的镜像来进行构造。

docker pull registry

创建容器

docker run -d -p : --restart=always --name=registry-srv -v /mydata/dockerRegistry:/var/lib/registry registry

-d:后台运行
-p:将容器的5000端口映射到宿主机的5000端口--name:容器的名称
-v:将容器内的/var/lib/registry映射到宿主机的/mydata/dockerRegistry目录,默认情况下,会将仓库存放于容器的/tmp/registry目录下;

搭建容器相关的web服务

docker pull hyper/docker-registry-web
docker run -it -p : --restart=always --name registry-web --link registry-srv -e REGISTRY_URL=http://registry-srv:5000/v2 -e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web -it: 以交互模式运行
--link:链接其它容器(registry-srv),在此容器中,使用registry-srv等同于registry-srv容器的局域网地址
-e:设置环境变量

上传测试

docker push 192.168.1.87:/cbbing/hcharts

下载测试

docker pull 192.168.1.87:/hcharts

注意:

如果你不想使用 127.0.0.1:5000 作为仓库地址,比如想让本网段的其他主机也能把镜像推送到私有仓库。你就得把例如 192.168.199.100:5000 这样的内网地址作为私有仓库地址,这时你会发现无法成功推送镜像。

这是因为 Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者查看下一节配置能够通过 HTTPS 访问的私有仓库。

对于使用 systemd 的系统,请在 /etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件);修改完配置之后记得重启docker。

{
"registry-mirror": [
"https://registry.docker-cn.com"
],
"insecure-registries": [
"192.168.199.100:5000"
]
}

web端查看私有仓库镜像

  访问:http://192.168.1.87:8080/,网页上呈现:

私有仓库高级部署

环境准备

  新建一个文件夹,以下步骤均在该文件夹中进行

[root@host- ~]# mkdir /opt/ssl
[root@host- ssl]# cd /opt/ssl/

准备站点证书

  这里假设我们将要搭建的私有仓库地址为 docker.domain.com,下面我们介绍使用 openssl 自行签发 docker.domain.com 的站点 SSL 证书。

创建 CA 私钥

[root@host- ssl]# openssl genrsa -out "root-ca.key"
Generating RSA private key, bit long modulus
...........................++
................++
e is (0x10001)

创建 CA 根证书请求文件

[root@host- ssl]# openssl req -new -key "root-ca.key" -out "root-ca.csr" -sha256 -subj '/C=CN/ST=beijing/L=chaoyang/O=emaxdata/CN=docker.domain.com'
# 以上命令中 -subj 参数里的 /C 表示国家,如 CN;/ST 表示省;/L 表示城市或者地区;/O 表示组织名;/CN 通用名称。

配置 CA 根证书

[root@host- ssl]# touch root-ca.cnf
[root@host- ssl]# vi root-ca.cnf
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash

签发根证书

[root@host- ssl]# openssl x509 -req  -days   -in "root-ca.csr" -signkey "root-ca.key" -sha256 -out "root-ca.crt" -extfile "root-ca.cnf" -extensions root_ca
Signature ok
subject=/C=CN/ST=beijing/L=chaoyang/O=emaxdata/CN=docker.domain.com
Getting Private key

生成站点 SSL 私钥

[root@host- ssl]# openssl genrsa -out "docker.domain.com.key"
Generating RSA private key, bit long modulus
................................................................................................++
.......................................................................................................................................++
e is (0x10001)

生成证书请求文件

[root@host- ssl]# openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256 -subj '/C=CN/ST=beijing/L=chaoyang/O=emaxdata/CN=docker.domain.com'

配置证书

[root@host- ssl]# touch site.cnf
[root@host- ssl]# vi site.cnf [server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:docker.domain.com, IP:127.0.0.1
subjectKeyIdentifier=hash

签署站点 SSL 证书

root@host- ssl]# openssl x509 -req -days  -in "site.csr" -sha256 -CA "root-ca.crt" -CAkey "root-ca.key"  -CAcreateserial -out "docker.domain.com.crt" -extfile "site.cnf" -extensions server
Signature ok
subject=/C=CN/ST=beijing/L=chaoyang/O=emaxdata/CN=docker.domain.com
Getting CA Private Key # 这样已经拥有了 docker.domain.com 的网站 SSL 私钥 docker.domain.com.key 和 SSL 证书 docker.domain.com.crt 及 CA 根证书 root-ca.crt。保留docker.domain.com.key docker.domain.com.crt root-ca.crt这三个文件,删除其他文件

将证书相关内容迁移到docker配置中

[root@host- ssl]# mkdir -p /etc/docker/registry
[root@host- ssl]# cd /etc/docker/registry/
[root@host- registry]# mv /opt/ssl /etc/docker/registry/

配置私有仓库信息

[root@host- registry]# vi /etc/docker/registry/config.yml
version: 0.1
log:
accesslog:
disabled: true
level: debug
formatter: text
fields:
service: registry
environment: staging
storage:
delete:
enabled: true
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
auth:
htpasswd:
realm: basic-realm
path: /etc/docker/registry/auth/nginx.htpasswd
http:
addr: :
host: https://docker.domain.com
headers:
X-Content-Type-Options: [nosniff]
http2:
disabled: false
tls:
certificate: /etc/docker/registry/ssl/docker.domain.com.crt
key: /etc/docker/registry/ssl/docker.domain.com.key
health:
storagedriver:
enabled: true
interval: 10s
threshold:

生成http认证文件

[root@host- registry]# mkdir -p /etc/docker/registry/auth/
[root@host- registry]# docker run --rm --entrypoint htpasswd registry -Bbn admin admin > /etc/docker/registry/auth/nginx.htpasswd

生成compose文件

[root@host- registry]# vi  /etc/docker/registry/docker-compose.yml
version: '' services:
registry:
image: registry
ports:
- "443:443"
volumes:
- ./:/etc/docker/registry
- registry-data:/var/lib/registry # 这里的存储路劲就是容器存储中映射到宿主机的挂载点,挂载点在/var/lib/docker下;详情请参考volume的使用 volumes:
registry-data:

修改hosts

vi /etc/hosts
127.0.0.1 docker.domain.com

启动容器

[root@host- registry]# cd /etc/docker/registry/
[root@host- registry]# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
[root@host- registry]# chmod a+x /usr/local/bin/docker-compose
[root@host- registry]# docker-compose up -d

这样我们就搭建好了一个具有权限认证、TLS 的私有仓库,接下来我们测试其功能是否正常。

测试功能

  由于自行签发的 CA 根证书不被系统信任,所以我们需要将 CA 根证书 ssl/root-ca.crt 移入 /etc/docker/certs.d/docker.domain.com 文件夹中。

[root@host- registry]# mkdir -p /etc/docker/certs.d/docker.domain.com
[root@host- registry]# cp /etc/docker/registry/ssl/root-ca.crt /etc/docker/certs.d/docker.domain.com/ca.crt

登录私有仓库

docker login docker.domain.com          # 输入上面创建的用户与密码

尝试推送、拉取镜像

[root@host- centos]# docker tag centos:latest docker.domain.com/admin/centos:latest
[root@host- docker]# docker push docker.domain.com/admin/centos
[root@host- centos]# docker rmi -f 9f38484d220f
[root@host- centos]# docker pull docker.domain.com/admin/centos

文章来自转载:https://yeasy.gitbooks.io/docker_practice/content/repository/registry_auth.html

Docker基础内容之仓库的更多相关文章

  1. docker基础内容讲解

    一.初识docker 1.1 LXC介绍 LXC为LinuX Container的简写.Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提 ...

  2. docker 基础之私有仓库

    docker-registry 是官方提供的工具,可以用于构建私有的镜像仓库.安装运行 docker-registry容器 在安装了 Docker 后,可以通过获取官方 registry 镜像来运行. ...

  3. Docker基础内容之命令大全

    run(未补全) 说明:创建一个新的容器并运行一个命令 语法如下: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 选项说明: -a stdin: 指定标准 ...

  4. Docker基础内容之镜像

    概念 镜像是一个包含程序运行必要依赖环境和代码的只读文件,它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上.镜像是容器运行的基石. 下图展示的是Docker镜像的系统结构.其中, ...

  5. Docker基础内容之网络基础

    网络命名空间基本原理 单机版多容器实例网络交互原理 在宿主机上面打开两张网卡eth0与eth1,打通两张网卡的链路 在test1上面启动一个veth网卡,创建一个namespace:并桥接到eth0上 ...

  6. Docker基础内容之数据持久化

    数据卷的特性 数据卷是一个可供一个或多个容器使用的特殊目录,它绕过 UFS 数据卷可以在容器之间共享和重用,相当于将一个分区挂载到多个目录下面 数据卷内容的修改会立马生效 数据卷的更新,不会影响镜像: ...

  7. Docker基础内容之镜像构建

    前言 Docker可以通过读取Dockerfile中的指令来自动构建图像.Dockerfile是一个文本文档,包含用户可以在命令行上调用的所有命令来组装一个图像.使用docker构建用户可以创建一个自 ...

  8. Docker基础内容之容器

    前言 容器是独立运行的一个或一组应用以及它们的运行态环境. 相关命令 启动容器相关命令 docker run 运行一个ubuntu14.04版本的容器,如果这个镜像本地不存在则会去默认仓库中下载 do ...

  9. Docker基础内容之端口映射

    随机映射 docker run -d -P training/webapp python app.py # -P会随机映射一个 49000~49900 的端口到内部容器开放的网络端口 映射所有接口地址 ...

随机推荐

  1. 第二阶段:4.商业需求文档MRD:3.PRD-页面结构图

    这也是功能结构以及优先级 这是页面层级 页面结构图 再细分某一个频道或者子页面 层层细分 用mind做的页面结构图 里面也包含了功能

  2. Deep Learning ——Yann LeCun,Yoshua Bengio&Geoffrey Hinton

    引言: 深度学习的本质是用多层的神经网络找到一个可以被学习的复杂的函数实现语音识别,图像识别等功能. 多层神经网络的结构: 多层神经元的组成,每一层的输入都等于上一层的输出. 应用领域:cv,nlp ...

  3. X-Admin&ABP框架开发-代码生成器

    在日常开发中,有时会遇到一些相似的代码,甚至是只要CV一次,改几个名称,就可以实现功能了,而且总归起来,都可以由一些公用的页面更改而来,因此,结合我日常开发中使用到的页面,封装一个适合自己的代码生成器 ...

  4. ArrayList中删除null元素效率比较

    package test; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; i ...

  5. idea2020注册码永久激活(激活到2100年)

    首先有图有真相: 资源链接: 链接:https://pan.baidu.com/s/1DPIllnyhc7H4qL2yQb0OvQ 提取码:lbjx 第一步:将bin目录下的三个文件拷贝到IDEA安装 ...

  6. 使用ASP.NET Core 3.x 构建 RESTful API - 4.3 HTTP 方法的安全性和幂等性

    什么样的HTTP方法是安全的? 如果一个方法不会该表资源的表述,那么这个方法就被认为是安全的. 例如 HTTP GET 和 HTTP HEAD 就被认为是安全的,但需要注意的是,这并不意味着执行GET ...

  7. 2020年我国到底有多少程序员?现在学习java还来得及吗?

    中国有多少程序员?现在还值得学java吗? 跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早上贵子,从不掉发! JAVA起于1995年,经过20多年的发展,JAVA如今已经发展成为 ...

  8. 分布式唯一ID:雪花ID Snowflake .Net版

    先抄个雪花ID介绍,雪花算法: 雪花算法的原始版本是scala版,用于生成分布式ID(纯数字,时间顺序),订单编号等. 自增ID:对于数据敏感场景不宜使用,且不适合于分布式场景.GUID:采用无意义字 ...

  9. 怎样使我们的用户不再抵触填写Form表单?

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://blog.bitsrc.io/8-tips-for-an-awesome-sign ...

  10. Java小项目之:五子棋,你下棋下得过电脑吗?

    Java小项目之:五子棋,你下棋下得过电脑吗? Java五子棋功能要求: 1.创建窗口和设计一个棋盘界面 2.实现鼠标点击,棋子出现,黑白棋轮流下 3.能够判断五子相连输赢 4.添加重新开始,悔棋,退 ...