docker 搭建私有仓库

docker-registry是官方提供的工具,可以用于构建私有的镜像仓库。本文内容基于 docker-registry v2.x 版本。

安装运行 docker-registry

  $ docker run -d -p 5000:5000 --restart=always --name registry registry

  1. # docker run -d -p 5000:5000 --restart=always --name registry registry
  2. Unable to find image 'registry:latest' locally
  3. latest: Pulling from library/registry
  4. 81033e7c1d6a: Pull complete
  5. b235084c2315: Pull complete
  6. c692f3a6894b: Pull complete
  7. ba2177f3a70e: Pull complete
  8. a8d793620947: Pull complete
  9. Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54
  10. Status: Downloaded newer image for registry:latest
  11. f7f231cb61d1ab0716e60a85e69b64d19bfe099636dcc7d668f3c83f47244bf3

这将使用官方的 registry 镜像来启动私有仓库。默认情况下,仓库会被创建在容器的
/var/lib/registry 目录下。你可以通过 -v 参数来将镜像文件存放在本地的指定路径。例
如下面的例子将上传的镜像放到本地的 /opt/data/registry 目录。

  1. # docker run -d \
  2. > -p 5000:5000 \
  3. > -v /opt/data/registry:/var/lib/registry \
  4. > registry

在私有仓库上传、搜索、下载镜像

docker image ls查看已有镜像

  1. # docker image ls
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. fandf-image-base 1.0 33761c640b6f 2 days ago 762MB
  4. centos latest 2d194b392dd1 11 days ago 195MB
  5. nginx latest e548f1a579cf 3 weeks ago 109MB
  6. registry latest d1fd7d86a825 2 months ago 33.3MB
  7. mysql 5.6.38 15a5ee56ec55 2 months ago 299MB
  8. hello-world latest f2a91732366c 3 months ago 1.85kB
  9. centos 7.4.1708 3afd47092a0e 4 months ago 197MB
  10. java latest d23bdf5b1b1b 14 months ago 643MB

使用 docker tag 将 centos:7.4.1708 这个镜像标记为 127.0.0.1:5000/centos:7.4.1708

格式为 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG]

  1. # docker tag centos:7.4.1708 127.0.0.1:5000/centos:7.4.1708
  2. # docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. fandf-image-base 1.0 33761c640b6f 2 days ago 762MB
  5. centos latest 2d194b392dd1 11 days ago 195MB
  6. nginx latest e548f1a579cf 3 weeks ago 109MB
  7. registry latest d1fd7d86a825 2 months ago 33.3MB
  8. mysql 5.6.38 15a5ee56ec55 2 months ago 299MB
  9. hello-world latest f2a91732366c 3 months ago 1.85kB
  10. 127.0.0.1:5000/centos 7.4.1708 3afd47092a0e 4 months ago 197MB
  11. centos 7.4.1708 3afd47092a0e 4 months ago 197MB
  12. java latest d23bdf5b1b1b 14 months ago 643MB

上传镜像

  1. # docker push 127.0.0.1:5000/centos:7.4.1708
  2. The push refers to repository [127.0.0.1:5000/centos]
  3. 129b697f70e9: Pushed
  4. 7.4.1708: digest: sha256:834aba7fdd53f4e622a8d636dcd549a83e86a22efad0246bf9438e4655b888ef size: 529

用 curl 查看仓库中的镜像

  1. # curl 127.0.0.1:5000/v2/_catalog
  2. {"repositories":["centos"]}

先删除已有镜像,再尝试从私有仓库中下载这个镜像

  1. # docker image rm 127.0.0.1:5000/centos:7.4.1708
  2. Untagged: 127.0.0.1:5000/centos:7.4.1708
  3. Untagged: 127.0.0.1:5000/centos@sha256:834aba7fdd53f4e622a8d636dcd549a83e86a22efad0246bf9438e4655b888ef
  4. [root@localhost ~]# docker pull 127.0.0.1:5000/centos:7.4.1708
  5. 7.4.1708: Pulling from centos
  6. Digest: sha256:834aba7fdd53f4e622a8d636dcd549a83e86a22efad0246bf9438e4655b888ef
  7. Status: Downloaded newer image for 127.0.0.1:5000/centos:7.4.1708
  8. [root@localhost ~]# docker image ls
  9. REPOSITORY TAG IMAGE ID CREATED SIZE
  10. fandf-image-base 1.0 33761c640b6f 2 days ago 762MB
  11. centos latest 2d194b392dd1 11 days ago 195MB
  12. nginx latest e548f1a579cf 3 weeks ago 109MB
  13. registry latest d1fd7d86a825 2 months ago 33.3MB
  14. mysql 5.6.38 15a5ee56ec55 2 months ago 299MB
  15. hello-world latest f2a91732366c 3 months ago 1.85kB
  16. 127.0.0.1:5000/centos 7.4.1708 3afd47092a0e 4 months ago 197MB
  17. centos 7.4.1708 3afd47092a0e 4 months ago 197MB
  18. java latest d23bdf5b1b1b 14 months ago 643MB

私有仓库高级设置

新建文件夹,以下操作均在该文件夹下进行

第一步:创建ca私钥

  1. # openssl genrsa -out "root-ca.key" 4096
  2. Generating RSA private key, 4096 bit long modulus
  3. .................................++
  4. ...............................................................................++
  5. e is 65537 (0x10001)
  6. [root@localhost fandf]#

第二步:利用私钥创建 CA 根证书请求文件

  1. # openssl req \
  2. > -new -key "root-ca.key" \
  3. > -out "root-ca.csr" -sha256 \
  4. > -subj '/C=CN/ST=Shanxi/L=xianyang/O=dongfeng/CN=dongfeng Docker Registry CA'

以上命令中 -subj 参数里的 /C 表示国家,如 CN ; /ST 表示省; /L 表示城市或者地区; /O 表示组织名; /CN 通用名称

第三步:配置 CA 根证书,新建 root-ca.cnf

  1. [root_ca]
  2. basicConstraints = critical,CA:TRUE,pathlen:1
  3. keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
  4. subjectKeyIdentifier=hash

第四步:签发根证书

  1. # openssl x509 -req -days 3650 -in "root-ca.csr" \
  2. > -signkey "root-ca.key" -sha256 -out "root-ca.crt" \
  3. > -extfile "root-ca.cnf" -extensions \
  4. > root_ca
  5. Signature ok
  6. subject=/C=CN/ST=Shanxi/L=xianyang/O=dongfeng/CN=dongfeng Docker Registry CA
  7. Getting Private key
  8. [root@localhost fandf]#

第五步:生成站点 SSL 私钥

  1. # openssl genrsa -out "docker.domain.com.key" 4096
  2. Generating RSA private key, 4096 bit long modulus
  3. ...........................................................................................++
  4. ........................................++
  5. e is 65537 (0x10001)
  6. [root@localhost fandf]#

第六步:使用私钥生成证书请求文件

  1. # openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256 \
  2. > -subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=docker.domain.com'
  3. [root@localhost fandf]#

第七步:配置证书,新建 site.cnf 文件

  1. [server]
  2. authorityKeyIdentifier=keyid,issuer
  3. basicConstraints = critical,CA:FALSE
  4. extendedKeyUsage=serverAuth
  5. keyUsage = critical, digitalSignature, keyEncipherment
  6. subjectAltName = DNS:docker.domain.com, IP:127.0.0.1
  7. subjectKeyIdentifier=hash

第八步:签署站点 SSL 证书

  1. # openssl x509 -req -days 750 -in "site.csr" -sha256 \
  2. > -CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \
  3. > -out "docker.domain.com.crt" -extfile "site.cnf" -extensions server
  4. Signature ok
  5. subject=/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=docker.domain.com
  6. Getting CA Private Key
  7. [root@localhost fandf]#

这样已经拥有了 docker.domain.com 的网站 SSL 私钥 docker.domain.com.key 和 SSL 证书 docker.domain.com.crt 。
新建 ssl 文件夹并将 docker.domain.com.key docker.domain.com.crt 这两个文件移入,删除其他文件。

私有仓库默认的配置文件位于 /etc/docker/registry/config.yml ,我们先在本地编辑
config.yml ,之后挂载到容器中。

  1. version: 0.1
  2. log:
  3. accesslog:
  4. disabled: true
  5. level: debug
  6. formatter: text
  7. fields:
  8. service: registry
  9. environment: staging
  10. storage:
  11. delete:
  12. enabled: true
  13. cache:
  14. blobdescriptor: inmemory
  15. filesystem:
  16. rootdirectory: /var/lib/registry
  17. auth:
  18. htpasswd:
  19. realm: basic-realm
  20. path: /etc/docker/registry/auth/nginx.htpasswd
  21. http:
  22. addr: :443
  23. host: https://docker.domain.com
  24. headers:
  25. X-Content-Type-Options: [nosniff]
  26. http2:
  27. disabled: false
  28. tls:
  29. certificate: /etc/docker/registry/ssl/docker.domain.com.crt
  30. key: /etc/docker/registry/ssl/docker.domain.com.key
  31. health:
  32. storagedriver:
  33. enabled: true
  34. interval: 10s
  35. threshold: 3

生成 http 认证文件

  1. mkdir auth
  2. $ docker run --rm \
  3. --entrypoint htpasswd \
  4. registry \
  5. -Bbn username password > auth/nginx.htpasswd

将上面的 username password 替换为你自己的用户名和密码

编辑 docker-compose.yml

  1. version: '3'
  2.  
  3. services:
  4. registry:
  5. image: registry
  6. ports:
  7. - "443:443"
  8. volumes:
  9. - ./:/etc/docker/registry
  10. - registry-data:/var/lib/registry
  11. volumes:
  12. registry-data:

修改 hosts

  1. docker.domain.com 127.0.0.1

启动

  1. docker-compose up -d

docker学习笔记(3)的更多相关文章

  1. Docker学习笔记 — 配置国内免费registry mirror

    Docker学习笔记 — 配置国内免费registry mirror Docker学习笔记 — 配置国内免费registry mirror

  2. docker学习笔记1 -- 安装和配置

    技术资料 docker中文官网:http://www.docker.org.cn/ 中文入门课程:http://www.docker.org.cn/book/docker.html docker学习笔 ...

  3. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

  4. docker~学习笔记索引

    回到占占推荐博客索引 使用docker也有段时间了,写了不少文章与总结,下面把它整理个目录出来,方便大家去学习与检索! docker~学习笔记索引 docker~linux下的部署和基本命令(2017 ...

  5. Docker学习笔记 - Docker容器内部署redis

    Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...

  6. docker学习笔记(一)—— ubuntu16.04下安装docker

    docker学习笔记(一)—— ubuntu16.04下安装docker 原创 2018年03月01日 14:53:00 标签: docker / ubuntu 1682 本文开发环境为Ubuntu ...

  7. Docker学习笔记总结

    Docker学习笔记 https://yeasy.gitbooks.io/docker_practice/content/   一 环境搭建 Ubuntu安装 .添加软件源的GPG密钥 curl -f ...

  8. docker学习笔记二:常用命令

    docker学习笔记二:常用命令 查看docker常用命令 docker --help 返回结果如下: 其中常用的命令如下: 1.image相关操作 展示所有的image: 删除image: rmi ...

  9. docker学习笔记-1

    docker学习笔记一:安装 mac安装docker docker官方文档上有这么一段话: Because the Docker daemon uses Linux-specific kernel f ...

  10. Docker:学习笔记(1)——基础概念

    Docker:学习笔记(1)——基础概念 Docker是什么 软件开发后,我们需要在测试电脑.客户电脑.服务器安装运行,用户计算机的环境各不相同,所以需要进行各自的环境配置,耗时耗力.为了解决这个问题 ...

随机推荐

  1. Idea 里明明配置了Tomcat,但是右上角任然没有Tomcat显示

    问题截图如下: 上图明明配置了Tomcat,但是Idea右上角任然是Add Configurations 因为这个问题,困扰了好久.解决方法: 点击Add Configurations   出现如下界 ...

  2. Python自学:第三章 确定列表长度

    >>> cars = ["bmw", "audi", "toyota", "subaru"] > ...

  3. 利用scrapy-client 发布爬虫到远程服务端

    远程服务端Scrapyd先要开启 远程服务器必须装有scapyd,并开启. 这里远程服务开启的端口和ip: 192.166.12.80:6800 客户端配置和上传 先修爬虫项目文件scrapy.cfg ...

  4. C#流程控制语句--跳转语句(break,continue,goto,return,)

    跳转语句:是程序运行到某一位置时,可以跳到程序中另一个代码的语句.循环控制语句. 跳转语句:break 1.用于退出包含在最内层的循环或者退出一个switch或loop语句,程序流将继续紧接着loop ...

  5. FPM六:接五,跳转到明细

    1.在RESULT的Feeder class里添加点击单号事件: method IF_FPM_GUIBB_LIST~GET_DEFINITION. DATA:GW_ACTION TYPE FPMGB_ ...

  6. 调用 CURL 使用正则抓取信息

    Class MyCurl{  protected $_pdo;     //构造方法 链接数据库  public function __construct(){      $this->_pdo ...

  7. 再次精读《javascript高级程序设计第3版》学习笔记(1)

    第一次拿起这本书是2016年暑假,时隔2年,又一次开始研读这本经典书籍.每次读,都是对之前的一次沉淀和总结,每次都会有新的收获.

  8. html和css进阶

    html和css进阶 相对地址与绝对地址 网页上引入或链接到外部文件,需要定义文件的地址,常见引入或链接外部文件包括以下几种: <!-- 引入外部图片 --> <img src=&q ...

  9. linux服务器上使用find查杀webshell木马方法

    本文转自:http://ju.outofmemory.cn/entry/256317 只要从事互联网web开发的,都会碰上web站点被入侵的情况.这里我把查杀的一些方法采用随记的形式记录一下,一是方便 ...

  10. 【转载】C++对象成员与构造函数

    一个类的对象可以作为另一个类的数据成员,此时把该对象称为类的对象成员. 当一个类中出现对象成员时,该类的构造函数就要为对象成员初始化,对象成员的初始化必须在构造函数的初始化表中完成. 注意: 初始化对 ...