GVKun编程网logo

Moving to Docker(二)搭建一个私有 registry 服务(如何搭建私有服务器)

25

在这篇文章中,我们将带领您了解MovingtoDocker的全貌,包括二搭建一个私有registry服务的相关情况。同时,我们还将为您介绍有关167dockerdocker构建nginx容器系列问题d

在这篇文章中,我们将带领您了解Moving to Docker的全貌,包括二搭建一个私有 registry 服务的相关情况。同时,我们还将为您介绍有关167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、CentOS 7 : Docker私有仓库搭建和使用 registry2.0、centos7 docker 搭建私有仓库 registry、CentOS7.4 Docker Harbor + docker-registry基于Http方式安全认证私有仓库搭建的知识,以帮助您更好地理解这个主题。

本文目录一览:

Moving to Docker(二)搭建一个私有 registry 服务(如何搭建私有服务器)

Moving to Docker(二)搭建一个私有 registry 服务(如何搭建私有服务器)

这是迁移到 Docker 系列的第二篇,整个系列都是介绍我们公司是如何把基础设施从 PaaS 迁移到 Docker 的。

  • 第一篇:我会介绍在使用 Docker 之前我们的处理过程。

  • 第三篇:我会介绍如何自动化构建整个镜像的过程以及如何用 Docker 部署 Rails 应用。


为什么我们想要搭建一个私有的 registry?对于初学者,Docker Hub 只允许你有一个免费的私有库。虽然其他公司也开始提供类似的服务,但是价格也都不便宜。并且,如果你需要部署基于 Docker 的生产环境,你也不想将这些镜像发布到公开的 Docker Hub。

这是一个非常务实的方法来处理搭建私有 Docker registry 的复杂过程。在这个教程中,我们会用一个 512M 的 DigitalOcean 机器。你需要具备 Docker 的基础知识,因为我会引入一些复杂的东西。

本地搭建

首先,你需要安装boot2dockerdocker CLI。如果你已经安装了 Docker 的环境并运行着,可以跳过这一节了。

从终端运行下面的命令:

brew install boot2docker docker


如果这一步安装成功,就可以启动一个供 Docker 运行的虚拟机,命令如下:

boot2docker up


根据说明,使用export命令,boot2docker 会在终端输出。如果你现在运行docker ps,你就可以看到下面的结果:

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES


现在,Docker 已经安装好了,下一步我们开始安装 registry。

创建服务器

登录你的 DigitalOcean 账号,并创建一个预安装了 Docker 镜像的 Droplet,如下图:

s1.png


你会在 email 中收到 root 用户的登录凭证。登陆并运行docker ps来确认机器可以正常工作。

创建一个亚马逊 AWS S3

我们准备去使用亚马逊的简单存储服务(S3)作为我们 registry 的物理存储。下面我们需要创建一个 Bucket 和用户凭证来让 Docker 容器使用它。

登陆 AWS 账号(如果你没有,可以在 http://aws.amazon.com/ 注册一个),然后选择 S3 服务,如下图:

s2.png



点击创建 Bucket,输入该 Bucket 的唯一码(记下来,后面还要用到),然后点击生成,如下图:

s3.png



我们已经完成了创建存储的部分。

安装 AWS 登陆凭证

接下来我们将创建一个新用户。回到 AWS 的控制台界面,选择 IAM(Identity & Access Management)。

s4.png



你会看到下面这个界面:

s5.png



用户需要授权密钥来启用通过 REST 或者 Query 协议来连接 AWS 的服务 API。如果需要连接 AWS 的管理终端,在完成这个向导(下面这段英文)之后在用户面板创建一个密码就行。

Enter a name for your user (e.g. docker-registry) and click on Create. Write down (or download the csv file with) your Access Key and Secret Access Key that we''ll need when running the Docker container. Go back to your users list and select the one you just created.


Under the  Permission section, click on Attach User Policy. In the next screen, you will be presented with multiple choices: select Custom Policy.

设置权限

选择一个策略模板,创建一个策略或者自定义一个策略。策略是一个文档,它包含一个或者多个权限,可以通过下面这个界面来修改策略或者通过用户、组和角色页面来修改。

s7.png



下面是一个自定义的策略:

{
    "Version""2012-10-17",
    "Statement": [
    {
    "Sid""SomeStatement",
    "Effect""Allow",
    "Action": [
        "s3:*"
        ],
    "Resource": [
        "arn:aws:s3:::docker-registry-bucket-name/*",       
        "arn:aws:s3:::docker-registry-bucket-name"
        ]
    }
]
}


这样可以允许用户(例如:registry)在 Bucket 上操作(当创建 AWS S3 之前确认 bucket 已经创建完成)。简而言之:当你要准备把 Docker 镜像从本地机器发布到自己的库里时,服务器将会把它们保存在 S3 上。

安装 registry

接下来,用 SSH 连接到 DigitalOcean 的虚拟机上。我们准备使用官方提供的 registry 镜像

用下面的命令启动 registry:

docker run \  
     -e SETTINGS_FLAVOR=s3 \
     -e AWS_BUCKET=bucket-name \
     -e STORAGE_PATH=/registry \
     -e AWS_KEY=your_aws_key \
     -e AWS_SECRET=your_aws_secret \
     -e SEARCH_BACKEND=sqlalchemy \
     -p 5000:5000 \
     --name registry \
     -d \
     registry


Docker 会从 Docker Hub 上下载相应的 fs 层并启动守护进程容器。

测试 registry

如果前面都顺利的话,接下来可以通过ping测试 registry 的服务并搜索它内部的内容(尽管现在它还是空的)。

我们的 registry 是个非常基本的安装,它并不提供任何权限上的控制。因为添加权限的方法都比较麻烦(至少我没有发现哪个方法可以容易的实现并确认权限控制),我决定用最简单的方法来查询、下载和发布来使用 registry,那就是利用 ssh 在 HTTP 协议上做一个不加密的隧道连接。

通过下面的命令可以从你的机器创建一个隧道:

ssh -N -L 5000:localhost:5000 root@your_registry.com


这条命令使得服务器(就是刚才docker run启动的那个机器)的 5000 端口到本地的 5000 端口之间通过 SSH 协议做了一个隧道。

如果你通过 http://localhost:5000/v1/_ping 来请求,你会得到一个简单结果:

{}


这说明你的 registry 已经正常工作了。通过 http://localhost:5000/v1/search 可以列出整个 registry 中的内容,如下:

{
    "num_results"2,
    "query""",
    "results": [
        {
            "description""",
            "name""username/first-repo"
        },
        {
  "description""",
  "name""username/second-repo"
        }
    ]
}


创建一个镜像

下面我们尝试创建一个非常简单的镜像来测试我们的 registry 服务。在本地机器上创建如下内容的 Dockerfile:

Base image with ruby 2.2.0
FROM ruby:2.2.0
MAINTAINER Michelangelo Chasseur <michelangelo.chasseur@touchwa.re>


然后创建它

docker build -t localhost:5000/username/repo-name .


其中localhost:5000部分非常重要:一个 Docker 镜像的第一部分是告诉docker push应该把镜像发布到哪儿。在我们的例子中,因为我们通过 SSH 连接了我们的私有 registy 到本地的 5000 端口,于是localhost:5000就是指代我们的 registry。

如果运行的正常,当这个命令返回结果后,你可以通过docker images来查看新创建的镜像了,请自己尝试一下。

发布到 registry

接下来介绍一些技巧。我也花了一些时间来弄明白自己要介绍的东西,所以如果你第一次没看懂,请保持耐心并尝试。我知道这些东西看起来很复杂(如果你没有自动化这个过程,它确实很复杂),但是我保证它们都是有意义的。接下来的一篇,我会展示一堆 shell 脚本和 Rake 任务,它们将把整个过程自动化,方便你用一条简单的命令来部署一个 Rails 应用到你的 registry。

你从本地终端运行的docker命令确实是用 boot2docker 虚拟机来运行容器并且做了所有的操作。于是我们运行一条像docker push some_repo的命令时,就是 boot2docker 虚拟机在连接 registry 而不是我们本地的。

这是非常重要的一点:为了发布 Docker 镜像到远端私有 registry,SSH 隧道需要被 boot2docker 虚拟机创建而不是从给你的本机。

这里有几种方法来实现它,我会介绍最简洁的一种(它并不是最容易理解的,却是它可以帮助我们通过 shell 脚本来自动化这个过程)。

建立 SSH

先来添加 boot2docker 的 SSH 密钥到远端 registry 服务器的 known hosts. 我们可以通过ssh-copy-id功能,它可以用如下命令来安装:

brew install ssh-copy-id


然后运行:

ssh-copy-id -i /Users/username/.ssh/id_boot2docker root@your-registry.com


请确保/Users/username/.ssh/id_boot2docker是你的 ssh 密钥的正确路径。

然后我们来测试一下:

boot2docker ssh "ssh -o ''StrictHostKeyChecking no'' -i /Users/michelangelo/.ssh/id_boot2docker -N -L 5000:localhost:5000 root@registry.touchwa.re &" &


解释下:

  • boot2docker ssh 可以让你传递一条命令作为参数让 boot2docker 虚拟机来执行

  • 最后的 & 来保证我们的命令在后台运行

  • ssh -o ''StrictHostKeyChecking no'' -i /Users/michelangelo/.ssh/id_boot2docker -N -L 5000:localhost:5000 root@registry.touchwa.re & 才是虚拟机真正执行的。

    • -o ''StrictHostKeyChecking no'' 部分可以确保不用回答设置的安全问题

    • -i /Users/michelangelo/.ssh/id_boot2docker 来说明我们希望虚拟机使用的授权 SSH 密钥 (这个需要是在上一步添加给远端 registry 服务的那个密钥)。

    • 最后我们打开了一个隧道来连接远端 5000 端口和本地的 5000 端口


从别的服务器下载

现在你可以通过下面的命令来实现从远端 registry 服务发布镜像:

docker push localhost:5000/username/repo_name


在接下来的本系列第三篇,我会介绍如何自动化这些步骤并且我们会把一个实际 Rails 应用容器化。
请保持关注!

P.S. 请留言关于我的教程中的任何不一致或者错误的地方。希望你会喜欢。

  1. 前提是你也在用 OS X 系统

  2. 请参考 http://boot2docker.io/ 中完整的说明来安装你的 docker 环境和相关的依赖。

  3. 本文的环境选择是 Image>Applications>Docker 1.4.1 on 14.04

  4. 参考 https://github.com/docker/docker-registry/。

  5. 这只是一小部分,下一篇我会介绍你如何把一个 Rails 应用打包进一个 Docker 容器。


167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo

167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo

docker构建nginx容器系列问题


background : 最近为小伙伴们筹划docker系列的技术分享,研究了一会docker相关技术, 在此记录一下构建nginx容器时候的坑

1.nginx服务器根目录问题

docker 官方镜像提供的nginx基于debian/jessie平台,其文件结构和ubuntu中的nginx中并不相同

eg:

run一个niginx容器

<span>//80端口被占用,so...</span>
$ sudo docker run <span>-it</span><span>-p</span><span>800</span>:<span>800</span> nginx
$ sudo docker ps 

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                   NAMES
<span>1801</span>a32aab54        nginx               <span>"nginx -g ''daemon off"</span><span>2</span> minutes ago       Up <span>2</span> minutes        <span>80</span>/tcp, <span>443</span>/tcp, <span>0.0</span><span>.0</span><span>.0</span>:<span>800</span><span>-&gt;</span><span>800</span>/tcp   berserk_kare
登录后复制

进入容器内部

<span>$ </span>sudo docker exec -it <span>1801</span>a32aab54 /bin/bash
root<span>@1801a32aab54</span><span>:/</span><span># </span>
登录后复制

查看nginx目录

<span># cd /etc/nginx/</span>
conf<span>.d</span>/         koi-utf         mime<span>.types</span>      nginx<span>.conf</span>      uwsgi_params    
fastcgi_params  koi-win         modules/        scgi_params     win-utf  
登录后复制

可以看到不仅没有熟悉的 /sites-available,也没有 /sites-enabled

继续查看nginx配置

<span># cat /conf.d/default.conf</span><span>server</span> {
    listen       <span>80</span>;
    server_name  localhost;

    <span>#charset koi8-r;</span><span>#access_log  /var/log/nginx/log/host.access.log  main;</span>    location / {
        root   /usr/share/nginx/html;
        <span>index</span><span>index</span>.html <span>index</span>.htm;
    }

    <span>#error_page  404              /404.html;</span><span># redirect server error pages to the static page /50x.html</span><span>#</span>
    error_page   <span>500</span><span>502</span><span>503</span><span>504</span>  /<span>50</span>x.html;
    location = /<span>50</span>x.html {
        root   /usr/share/nginx/html;
    }
    <span>#...省略php-fpm配置,好长..</span>
}
登录后复制

根目录配置: root /usr/share/nginx/html;

测试

<span># cd /usr/share/nginx/html</span><span># touch index.html</span><span># echo "test nginx in docker" &gt;index.html</span>
登录后复制

php-fpm配置相关

'').addClass(''pre-numbering'').hide(); $(this).addClass(''has-numbering'').parent().append($numbering); for (i = 1; i '').text(i)); }; $numbering.fadeIn(1700); }); });

以上就介绍了167 docker docker构建nginx容器系列问题,包括了docker,nginx方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

CentOS 7 : Docker私有仓库搭建和使用 registry2.0

CentOS 7 : Docker私有仓库搭建和使用 registry2.0

http://www.cnblogs.com/xcloudbiz/articles/5526262.html

系统环境: CentOS 7.2
192.168.0.179:docker仓库
192.168.0.60:客户端

安装并启动docker

1、yum -y install docker
2、systemctl start docker 3、systemctl enable docker

搭建私有仓库

192.168.0.179服务端 上下载registry镜像

1、docker pull registry
  • 防火墙添加运行5000端口
1、iptables -I INPUT 1 -p tcp --dport 5000 -j ACCEPT

下载完之后我们通过该镜像启动一个容器

1、docker run -d -p 5000:5000 --privileged=true -v /opt/registry:/tmp/registry-dev registry
  • 参数说明:
    -v /opt/registry:/tmp/registry :默认情况下,会将仓库存放于容器内的/tmp/registry目录下,指定本地目录挂载到容器

    –privileged=true :CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报权限错误(OSError: [Errno 13] Permission denied: ‘/tmp/registry/repositories/liibrary’)或者(Received unexpected HTTP status: 500 Internal Server Error)错误

    Registry的存放目录在Docker Hub上显示的是/tmp/registry-dev,但是映射之后发现并没有存放在该目录,查看源码发现,镜像信息存放在/var/lib/registry目录下,因此这里修改为将/opt/registry目录映射到/var/lib/registry。

    192.168.0.60客户端上传镜像

    修改/etc/sysconfig/docker(Ubuntu下配置文件地址为:/etc/init/docker.conf),增加启动选项(已有参数的在后面追加),之后重启docker,不添加报错,https证书问题。

    1、OPTIONS='--insecure-registry 192.168.0.179:5000'    #CentOS 7系统
    2、other_args='--insecure-registry 192.168.0.179:5000' #CentOS 6系统
    • 因为Docker从1.3.X之后,与docker registry交互默认使用的是https,而此处搭建的私有仓库只提供http服务
      在docker公共仓库下载一个镜像

      1、docker pull docker.io/centos
      • 来修改一下该镜像的tag
      1、docker tag centos 192.168.0.179:5000/centos
      • 把打了tag的镜像上传到私有仓库
      1、docker push 192.168.0.179:5000/centos
      • 1

      客户端添加私有仓库地址

      1、# 添加这一行
      2、ADD_REGISTRY='--add-registry 192.168.0.179:5000'

      加上后,search镜像,私有仓库和docker hub上都会显示;
      不加搜索私有仓库,需要命令中指定私有仓库ip

      使用仓库中的镜像

      查询私有仓库中的所有镜像,使用docker search命令:

      1、curl -u myuser https://registry_ip:5000/v1/search
      2、curl registry_ip:5000/v1/search
      1、docker search registry_ip:5000/     #centos 7
      2、docker search registry_ip:5000/library #centos 6
      • 查询仓库中指定账户下的镜像,则使用如下命令:
      1、docker search registry_ip:5000/account/

      转载请务必保留此出处:http://blog.csdn.net/fgf00/article/details/52040492


      https://tonybai.com/2016/02/26/deploy-a-private-docker-registry/

      部署私有Docker Registry

      安装部署一个私有的Docker Registry是引入、学习和使用Docker这门技术的必经之路之一。尤其是当Docker被所在组织接受,更多人、项目和产品开始接触和使用Docker时,存储和分发自制的Docker image便成了刚需。Docker Registry一如既往的继承了“Docker坑多”的特点,为此这里将自己搭建”各类”Registry过程中执行的步骤、遇到的问题记录下来,为己备忘,为他参考。

      Docker在2015年推出了distribution项目,即Docker Registry 2。相比于old registry,Registry 2使用Go实现,在安全性、性能方面均有大幅改进。Registry设计了全新的Rest API,并且在image存储格式等方面不再兼容于old Registry。去年8月份,docker官方hub使用Registriy 2.1替代了原先的old Registry。如果你要与Registry2交互,你的Docker版本至少要是Docker 1.6。

      Docker的开发者也一直在致力于改善Registry安装和使用的体验,通过提供官方Registry Image以及Docker Compose工具等来简化Registry的配置。不过在本文中,我们只是利用Docker以及Registry的官方Image来部署Registry,这样更便于全面了解Registry的部署配置细节。

      Registry2在镜像存储方面不仅支持本地盘,还支持诸多主流第三方存储方案。通过分布式存储系统你还可以实现一个分布式Docker Registry服务。这里仅以本地盘以及single node registry2为例。

      一、环境

      这里还是复用以往文章中的Docker环境:

      Docker Registry Server: 10.10.105.71 Ubuntu 14.04 3.16.0-57-generic;docker 1.9.1
      
      其他两个工作Server:
      10.10.105.72 Ubuntu 14.04 3.19.0-25-generic; docker 1.9.1
      10.10.126.101 Ubuntu 12.04 3.16.7-013607-generic; docker 1.9.1

      本次Registry使用当前最新stable版本:Registry 2.3.0。由于镜像采用本地磁盘存储,root分区较小,需要映射使用其他volume。

      二、初次搭建

      本以为Docker Registry的搭建是何其简单的,甚至简单到通过一行命令就可以完成的。比如我们在Registry Server上执行:

      在~/dockerregistry下,执行:
      
      $sudo docker run -d -p 5000:5000 -v `pwd`/data:/tmp/registry-dev --restart=always --name registry registry:2
      Unable to find image 'registry:2' locally
      2: Pulling from library/registry
      f32095d4ba8a: Pull complete
      9b607719a62a: Pull complete
      973de4038269: Pull complete
      2867140211c1: Pull complete
      8da16446f5ca: Pull complete
      fd8c38b8b68d: Pull complete
      136640b01f02: Pull complete
      e039ba1c0008: Pull complete
      c457c689c328: Pull complete
      Digest: sha256:339d702cf9a4b0aa665269cc36255ee7ce424412d56bee9ad8a247afe8c49ef1
      Status: Downloaded newer image for registry:2
      e9088ef901cb00546c59f89defa4625230f4b36b0a44b3713f38ab3d2a5a2b44
      
      $ docker images
      REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
      registry            2                   c457c689c328        9 days ago          165.7 MB
      
      $ docker ps
      CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                    NAMES
      e9088ef901cb        registry:2          "/bin/registry /etc/d"   About a minute ago   Up About a minute   0.0.0.0:5000->5000/tcp   registry

      Registry container已经跑起来了,其启动日志可以通过:docker logs registry查看。

      我们在71本地给busyBox:latest打一个tag,并尝试将新tag下的image push到Registry中去:

      $ docker tag busyBox:latest 10.10.105.71:5000/tonybai/busyBox:latest
      $ docker images
      REPOSITORY                          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
      registry                            2                   c457c689c328        9 days ago          165.7 MB
      busyBox                             latest              65e4158d9625        9 days ago          1.114 MB
      10.10.105.71:5000/tonybai/busyBox   latest              65e4158d9625        9 days ago          1.114 MB
      ... ...

      push到Registry中:

      $ docker push 10.10.105.71:5000/tonybai/busyBox
      The push refers to a repository [10.10.105.71:5000/tonybai/busyBox] (len: 1)
      unable to ping registry endpoint https://10.10.105.71:5000/v0/
      v2 ping attempt Failed with error: Get https://10.10.105.71:5000/v2/: Tunnel or SSL Forbidden
       v1 ping attempt Failed with error: Get https://10.10.105.71:5000/v1/_ping: Tunnel or SSL Forbidden

      出错了!简单分析了一下,可能是71上docker daemon配置中加了http代理的缘故,导致无法ping通registry endpoint。于是在/etc/default/docker中注释掉export http_proxy=”xxx”的设置,并重启docker daemon。

      再次尝试push:

      $ docker push 10.10.105.71:5000/tonybai/busyBox
      The push refers to a repository [10.10.105.71:5000/tonybai/busyBox] (len: 1)
      unable to ping registry endpoint https://10.10.105.71:5000/v0/
      v2 ping attempt Failed with error: Get https://10.10.105.71:5000/v2/: tls: oversized record received with length 20527
       v1 ping attempt Failed with error: Get https://10.10.105.71:5000/v1/_ping: tls: oversized record received with length 20527

      虽然还是失败,但错误信息已有所不同了。这次看来连接是可以建立的,但client端通过https访问server端,似乎想tls通信,但这一过程并未完成。

      在其他机器上尝试push image到registry也遇到了同样的错误输出,如下:

      10.10.105.72:
      
      $ docker push 10.10.105.71:5000/tonybai/ubuntu
      The push refers to a repository [10.10.105.71:5000/tonybai/ubuntu] (len: 1)
      unable to ping registry endpoint https://10.10.105.71:5000/v0/
      v2 ping attempt Failed with error: Get https://10.10.105.71:5000/v2/: tls: oversized record received with length 20527
       v1 ping attempt Failed with error: Get https://10.10.105.71:5000/v1/_ping: tls: oversized record received with length 20527

      从错误信息来看,client与Registry交互,默认将采用https访问,但我们在install Registry时并未配置指定任何tls相关的key和crt文件,https访问定然失败。要想弄清这个问题,只能查看Registry Manual。

      三、Insecure Registry

      Registry的文档还是相对详尽的。在文档中,我们找到了Insecure Registry,即接收plain http访问的Registry的配置和使用方法,虽然这不是官方推荐的。

      实际上对于我们内部网络而言,Insecure Registry基本能满足需求,部署过程也避免了secure registry的那些繁琐步骤,比如制作和部署证书等。

      为了搭建一个Insecure Registry,我们需要先清理一下上面已经启动的Registry容器。

      $ docker stop registry
      registry
      $ docker rm registry
      registry

      修改Registry server上的Docker daemon的配置,为DOCKER_OPTS增加–insecure-registry:

      DOCKER_OPTS="--insecure-registry 10.10.105.71:5000 ....

      重启Docker Daemon,启动Registry容器:

      $ sudo service docker restart
      docker stop/waiting
      docker start/running,process 6712
      $ sudo docker run -d -p 5000:5000 -v `pwd`/data:/tmp/registry-dev --restart=always --name registry registry:2
      5966e92fce9c34705050e19368d19574e021a272ede1575385ef35ecf5cea019

      尝试再次Push image:

      $ docker push 10.10.105.71:5000/tonybai/busyBox
      The push refers to a repository [10.10.105.71:5000/tonybai/busyBox] (len: 1)
      65e4158d9625: Pushed
      5506dda26018: Pushed
      latest: digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 size: 2739

      这回push ok!

      我们将本地的tag做untag处理,再从Registry pull相关image:

      $ docker images
      REPOSITORY                          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
      registry                            2                   c457c689c328        9 days ago          165.7 MB
      10.10.105.71:5000/tonybai/busyBox   latest              65e4158d9625        9 days ago          1.114 MB
      busyBox                             latest              65e4158d9625        9 days ago          1.114 MB
      ubuntu                              14.04               6cc0fc2a5ee3        5 weeks ago         187.9 MB
      
      $ docker rmi 10.10.105.71:5000/tonybai/busyBox
      Untagged: 10.10.105.71:5000/tonybai/busyBox:latest
      
      $ docker images
      REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
      registry            2                   c457c689c328        9 days ago          165.7 MB
      busyBox             latest              65e4158d9625        9 days ago          1.114 MB
      ubuntu              14.04               6cc0fc2a5ee3        5 weeks ago         187.9 MB
      
      $ docker pull 10.10.105.71:5000/tonybai/busyBox
      Using default tag: latest
      latest: Pulling from tonybai/busyBox
      Digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892
      Status: Downloaded newer image for 10.10.105.71:5000/tonybai/busyBox:latest
      
      $ docker images
      REPOSITORY                          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
      registry                            2                   c457c689c328        9 days ago          165.7 MB
      10.10.105.71:5000/tonybai/busyBox   latest              65e4158d9625        9 days ago          1.114 MB
      busyBox                             latest              65e4158d9625        9 days ago          1.114 MB
      ubuntu                              14.04               6cc0fc2a5ee3        5 weeks ago         187.9 MB

      可以看到:Pull过程也很顺利。

      在Private Registry2中查看或检索Repository或images,将不能用docker search:

      $ docker search 10.10.105.71:5000/tonybai/busyBox/
      Error response from daemon: Unexpected status code 404

      但通过v2版本的API,我们可以实现相同目的:

      $curl  http://10.10.105.71:5000/v2/_catalog
      {"repositories":["tonybai/busyBox"]}
      
      $ curl  http://10.10.105.71:5000/v2/tonybai/busyBox/tags/list
      {"name":"tonybai/busyBox","tags":["latest"]}

      在其他主机上,我们尝试pull busyBox:

      10.10.105.72:
      
      $docker pull 10.10.105.71:5000/tonybai/busyBox
      Using default tag: latest
      Error response from daemon: unable to ping registry endpoint https://10.10.105.71:5000/v0/
      v2 ping attempt Failed with error: Get https://10.10.105.71:5000/v2/: tls: oversized record received with length 20527
       v1 ping attempt Failed with error: Get https://10.10.105.71:5000/v1/_ping: tls: oversized record received with length 20527

      我们发现依旧不能pull和push!在Registry手册中讲到,如果采用insecure registry的模式,那么所有与Registry交互的主机上的Docker Daemon都要配置:–insecure-registry选项。

      我们按照上面的配置方法,修改105.72上的/etc/default/docker,重启Docker daemon,再执行pull/push就会得到正确的结果:

      $ sudo vi /etc/default/docker
      $ sudo service docker restart
      docker stop/waiting
      docker start/running,process 10614
      $ docker pull 10.10.105.71:5000/tonybai/busyBox
      Using default tag: latest
      latest: Pulling from tonybai/busyBox
      5506dda26018: Pull complete
      65e4158d9625: Pull complete
      Digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892
      Status: Downloaded newer image for 10.10.105.71:5000/tonybai/busyBox:latest
      
      $ docker images
      REPOSITORY                          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
      ubuntu                              14.04               36248ae4a9ac        8 days ago          187.9 MB
      10.10.105.71:5000/tonybai/ubuntu    14.04               36248ae4a9ac        8 days ago          187.9 MB
      10.10.105.71:5000/tonybai/busyBox   latest              65e4158d9625        9 days ago          1.114 MB
      
      $ docker push 10.10.105.71:5000/tonybai/ubuntu
      The push refers to a repository [10.10.105.71:5000/tonybai/ubuntu] (len: 1)
      36248ae4a9ac: Pushed
      8ea5373bf5a6: Pushed
      2e0188208e83: Pushed
      e3c70beaa378: Pushed
      14.04: digest: sha256:72e56686cb9fb38438f0fd68fecf02ef592ce2ef7069bbf97802d959d568c5cc size: 6781

      四、Secure Registry

      Docker官方是推荐你采用Secure Registry的工作模式的,即transport采用tls。这样我们就需要为Registry配置tls所需的key和crt文件了。

      我们首先清理一下环境,将上面的Insecure Registry停掉并rm掉;将各台主机上Docker Daemon的DOCKER_OPTS配置中的–insecure-registry去掉,并重启Docker Daemon。

      如果你拥有一个域名,域名下主机提供Registry服务,并且你拥有某知名CA签署的证书文件,那么你可以建立起一个Secure Registry。不过我这里没有现成的证书,只能使用自签署的证书。严格来讲,使用自签署的证书在Docker官方眼中依旧属于Insecure,不过这里只是借助自签署的证书来说明一下Secure Registry的部署步骤罢了。

      1、制作自签署证书

      如果你有知名CA签署的证书,那么这步可直接忽略。

      $ openssl req -newkey rsa:2048 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
      Generating a 2048 bit RSA private key
      ..............+++
      ............................................+++
      writing new private key to 'certs/domain.key'
      -----
      You are about to be asked to enter information that will be incorporated
      into your certificate request.
      What you are about to enter is what is called a distinguished Name or a DN.
      There are quite a few fields but you can leave some blank
      For some fields there will be a default value,If you enter '.',the field will be left blank.
      -----
      Country Name (2 letter code) [AU]:CN
      State or Province Name (full name) [Some-State]:Liaoning
      Locality Name (eg,city) []:shenyang
      Organization Name (eg,company) [Internet Widgits Pty Ltd]:foo
      Organizational Unit Name (eg,section) []:bar
      Common Name (e.g. server FQDN or YOUR name) []:mydockerhub.com
      Email Address []:bigwhite.cn@gmail.com

      2、启动Secure Registry

      启动带证书的Registry:

      $ docker run -d -p 5000:5000 --restart=always --name registry -v /root/openssl/data:/tmp/registry-dev -v /root/openssl/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key docker.io/registry:2.0
      35e8ce77dd455f2bd50854e4581cd52be8a137f4aaea717239b6d676c5ea5777

      由于证书的CN是mydockerhub.com,我们需要修改一下/etc/hosts文件:

      10.10.105.71 mydockerhub.com

      重新为busyBox制作一个tag:

      $docker tag busyBox:latest mydockerhub.com:5000/tonybai/busyBox:latest

      Push到Registry:

      $ docker push mydockerhub.com:5000/tonybai/busyBox
      The push refers to a repository [mydockerhub.com:5000/tonybai/busyBox] (len: 1)
      unable to ping registry endpoint https://mydockerhub.com:5000/v0/
      v2 ping attempt Failed with error: Get https://mydockerhub.com:5000/v2/: x509: certificate signed by unkNown authority
       v1 ping attempt Failed with error: Get https://mydockerhub.com:5000/v1/_ping: x509: certificate signed by unkNown authority

      push失败了!从错误日志来看,docker client认为server传输过来的证书的签署方是一个unkNown authority(未知的CA),因此验证失败。我们需要让docker client安装我们的CA证书:

      $ sudo mkdir -p /etc/docker/certs.d/mydockerhub.com:5000 $ sudo cp certs/domain.crt /etc/docker/certs.d/mydockerhub.com:5000/ca.crt $ sudo service docker restart //安装证书后,重启Docker Daemon 

      再执行Push,我们看到了成功的输出日志。由于data目录下之前已经被push了tonybai/busyBox repository,因此提示“已存在”:

      $docker push mydockerhub.com:5000/tonybai/busyBox
      The push refers to a repository [mydockerhub.com:5000/tonybai/busyBox] (len: 1)
      65e4158d9625: Image already exists
      5506dda26018: Image already exists
      latest: digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 size: 2739需要用域名,直接用IP地址会报错:

      如果要想支持IP方式

      如果Docker registry要想支持https,需要生成证书。这里我们采用openssl生成证书,一般情况下,证书只支持域名访问,要使其支持IP地址访问,需要修改配置文件openssl.cnf。

      修改openssl.cnf,支持IP地址方式,HTTPS访问

      在Redhat7或者Centos系统中,文件所在位置是/etc/pki/tls/openssl.cnf。在其中的[ v3_ca]部分,添加subjectAltName选项:

      [ v3_ca ]

      subjectAltName= IP:129.144.150.111

      用openssl生成自签名的证书:

      我们直接在root用户下操作,创建一个目录: /root/certs

      然后执行:

      openssl req -newkey rsa:2048 -nodes -sha256-keyout /root/certs/domain.key -x509 -days 365 -out /root/certs/domain.crt

      Country Name (2 letter code) [XX]:CN

      State or Province Name (full name) []:bj

      Locality Name (eg,city) [Default City]:bj

      Organization Name (eg,company) [DefaultCompany Ltd]:mycom

      Organizational Unit Name (eg,section)[]:it

      Common Name (eg,your name or your server'shostname) []:129.144.150.111

      Email Address []:xcjing@yeah.Net

      执行成功后会生成:domain.key 和domain.crt 两个文件

      3、外部访问Registry

      我们换其他机器试试访问这个secure registry。根据之前的要求,我们照猫画虎的修改一下hosts文件,安装ca.cert,去除–insecure-registry选项,并重启Docker daemon。之后尝试从registry pull image:

      $ docker pull mydockerhub.com:5000/tonybai/busyBox
      Using default tag: latest
      latest: Pulling from tonybai/busyBox
      
      Digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892
      Status: Downloaded newer image for mydockerhub.com:5000/tonybai/busyBox:latest
      
      $ docker images
      REPOSITORY                             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
      10.10.105.71:5000/tonybai/ubuntu       14.04               36248ae4a9ac        9 days ago          187.9 MB
      ubuntu                                 14.04               36248ae4a9ac        9 days ago          187.9 MB
      10.10.105.71:5000/tonybai/busyBox      latest              65e4158d9625        9 days ago          1.114 MB
      mydockerhub.com:5000/tonybai/busyBox   latest              65e4158d9625        9 days ago          1.114 MB

      这样来看,如果使用自签署的证书,那么所有要与Registry交互的Docker主机都需要安装mydockerhub.com的ca.crt(domain.crt)。但如果你使用知名CA,这一步也就可以忽略。

      五、Registry的鉴权管理

      Registry提供了一种基础的鉴权方式。我们通过下面步骤即可为Registry加上基础鉴权:

      在Register server上,为Registry增加foo用户,密码foo123:(之前需要停掉已有的Registry,并删除之)

      //生成鉴权密码文件
      $ mkdir auth
      $ docker run --entrypoint htpasswd registry:2 -Bbn foo foo123  > auth/htpasswd
      $ ls auth
      htpasswd
      
      //启动带鉴权功能的Registry:
      $ docker run -d -p 5000:5000 --restart=always --name registry \
         -v `pwd`/auth:/auth \
         -e "REGISTRY_AUTH=htpasswd" \
         -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
         -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
         -v `pwd`/data:/var/lib/registry \
         -v `pwd`/certs:/certs \
         -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
         -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
         registry:2
      199ad0b3591fb9613b21b1c96f017267f3c39661a7025d30df636c6805e7ab50

      在105.72上,我们尝试push image到Registry:

      $ docker push mydockerhub.com:5000/tonybai/busyBox
      The push refers to a repository [mydockerhub.com:5000/tonybai/busyBox] (len: 1)
      65e4158d9625: Image push Failed
      Head https://mydockerhub.com:5000/v2/tonybai/busyBox/blobs/sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4: no basic auth credentials

      错误信息提示:鉴权失败。

      在72上执行docker login:

      $docker login mydockerhub.com:5000
      Username: foo
      Password:
      Email: bigwhite.cn@gmail.com
      WARNING: login credentials saved in /home/baiming/.docker/config.json
      Login Succeeded

      login成功后,再行Push:

      $ docker push mydockerhub.com:5000/tonybai/busyBox
      The push refers to a repository [mydockerhub.com:5000/tonybai/busyBox] (len: 1)
      65e4158d9625: Image already exists
      5506dda26018: Image already exists
      latest: digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 size: 2739

      Push ok!

      六、Registry中images的管理

      前面提到过,通过V2版Rest API可以查询Repository和images:

      $ curl --cacert domain.crt  --basic --user foo:foo123 https://mydockerhub.com:5000/v2/_catalog
      {"repositories":["tonybai/busyBox","tonybai/ubuntu"]}

      但如果要删除Registry中的Repository或某个tag的Image,目前v2还不支持,原因见Registry的roadmap中的说明。

      不过如果你的Registry的存储引擎使用的是本地盘,倒是有一些第三方脚本可供使用,比如:delete-docker-registry-image。

      七、小结

      Registry2发布不到1年,目前还有许多问题待解决,就比如delete image的问题,相信在2.4以及后续版本这些问题会被逐个解决掉或能找到一个相对理想的方案。

      © 2016,bigwhite. 版权所有.

      Related posts:

      1. Go和HTTPS
      2. 搭建自己的ngrok服务
      3. docker容器内服务程序的优雅退出
      4. WordPress迁移到Docker容器
      5. 理解Docker跨多主机容器网络

centos7 docker 搭建私有仓库 registry

centos7 docker 搭建私有仓库 registry

环境规划:

docker私有仓库地址:192.168.0.167

docker客户端地址 : 192.168.0.167

·关闭防火墙和selinux

服务端

1.安装并启动docker

2.拉取本地私有仓库registry

3.查看registry镜像

4.基于私有仓库镜像运行容器

默认情况下,会将仓库存放于容器的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器的/tmp/registry下, 两个目录下都有!

·registry的默认存储路径是/tmp/registry,只是个临时目录,一段时间之后就会消失

·所以使用-v参数,指定个本地持久的路径,

5.访问私有仓库

6.从Docker HUB 上拉取一个镜像测试

7.创建镜像链接为基础镜像打个标签

8.修改docker配置文件,指定私有仓库url

9.上传镜像到本地私有仓库

10.查看私有仓库是否有对应的镜像

11.查看镜像的存储目录和文件

客户端

1.安装并启动docker

2.修改docker配置文件,指定私有仓库url

3.测试,下载刚才上传的镜像


CentOS7.4 Docker Harbor + docker-registry基于Http方式安全认证私有仓库搭建

CentOS7.4 Docker Harbor + docker-registry基于Http方式安全认证私有仓库搭建

准备工作

版本

更新或下载URL

CentOS

7.4 64位

yum -y update && yum -y upgrade


依赖项(不分先后顺序)

docker

1.13.1,build 774336d/1.13.1

yum install -y docker

systemctl start docker.service

docker-compose

docker-compose version 1.21.2,build a133471
docker-py version: 3.3.0
cpython version: 2.7.5

pip install docker-compose

go

1.7.5

yum install -y golang

python

2.7.5

yum install -y python

python-pip

9.0.1

yum install -y epel-release python-pip

pip install --upgrade pip backports.ssl_match_hostname

openssl

OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013 yum install -y openssl

1.安装前置组件

yum -y update && yum -y upgrade && yum -y install wget python-devel libevent-devel epel-release python-pip gcc gcc-c++ xz-devel

yum -y upgrade kernel && yum -y reinstall kernel

2.创建证书存放目录

mkdir-p/data/cert
cd/data/cert/

2.1 创建 CA 根证书

opensslreq-newkeyrsa:4096\
-nodes-sha256-keyoutca.key-x509-days365\
-outca.crt-subj"/C=CN/L=shanghaI/O=baoshan/CN=harbor-registry"

2.2 生成一个证书签名,设置访问域名为 [你的域名]

-nodes-sha256-keyoutserver.key\
-outserver.csr-subj"/C=CN/L=shanghaI/O=baoshan/CN=docker-hub.onechain.com"

2.3 生成主机的证书

opensslx509-req-days365\
-inserver.csr-CAca.crt-CAkeyca.key\
-CAcreateserial-outserver.crt

3. 安装docker

yum -yinstalldocker

3.1 设置docker为开启启动

systemctlenabledocker.service

3.2 启动 docker 服务

systemctlstartdocker.service

3.3 安装 docker-compose

预先安装epel-release后方可安装python-pip[在前置条件中已安装,此处可不执行]
yum -y install epel-releasepython-pip
pipinstall--upgradepip
pipinstalldocker-compose
pipinstall--upgradebackports.ssl_match_hostname

yum clean all

python-pip其他安装方法:
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip -V

4.安装harbor

4.1 下载harbor离线版

wget https://github.com/vmware/harbor/releases/download/v1.1.2/harbor-offline-installer-v1.1.2.tgztar xvf harbor-offline-installer-v1.1.2.tgz

4.2 修改habor配置

hostname=docker-hub.onechain.com #指定私有仓库的主机名,可以是IP地址,也可以是域名
ui_url_protocol=https #用户访问私仓时使用的协议,默认时http,配置成https
db_password=root123   #指定MysqL数据库管理员密码
harbor_admin_password:Harbor12345 #harbor的管理员账户密码
ssl_cert=/data/cert/server.crt    #设置证书文件路径
ssl_cert_key=/data/cert/server.key #设置证书密钥文件路径

4.3 通过自带脚本一键安装(在harbor目录下)
[root@harborharbor]#./prepare
[root@harborharbor]# ./install.sh

4.4 通过浏览器访问管理
[提前设置本地 hosts文件本地重定向至harbor服务器IP]
vi /etc/hosts
添加
127.0.0.1 localhost docker-hub.onechain.com

4.5 开启80/443端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload
firewall-cmd --query-port=80/tcp
firewall-cmd --query-port=443/tcp
firewall-cmd --list-all

https://docker-hub.onechain.com
用户默认为admin
密码默认为Harbor12345 [可通过安装前 harbor.cfg 配置文件修改harbor_admin_password指定 ]


测试登陆

今天的关于Moving to Docker二搭建一个私有 registry 服务的分享已经结束,谢谢您的关注,如果想了解更多关于167 docker docker构建nginx容器系列问题 docker registry docker run docker toolbo、CentOS 7 : Docker私有仓库搭建和使用 registry2.0、centos7 docker 搭建私有仓库 registry、CentOS7.4 Docker Harbor + docker-registry基于Http方式安全认证私有仓库搭建的相关知识,请在本站进行查询。

本文标签: