您的位置:时时app平台注册网站 > 时时app平台注册网站 > Docker 体系四(自定义货仓).时时app平台注册网站

Docker 体系四(自定义货仓).时时app平台注册网站

2019-10-15 22:30

4、配置支持 HTTP

    Docker 默认不允许非 HTTPS 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,(Ubuntu 16.04 , Debian 8 , centos 7)在 /etc/docker/daemon.json 中写入如下内容:

{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ],
  "insecure-registries": [
    "xx.xx.xx.xx:8082"
  ]
}

     重启 Docker :

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

# service nginx start

开启https

  如果使用http的这里可以跳过,我们把已经申请好的证书文件放到/data/cert 目录下面。然后修改harbor.cfg文件

时时app平台注册网站 1
  安装成功之后打开之前自己设定的域名或者IP地址。测试地址 。测试用户名:harbor_test,测试密码:Harbor_test123
时时app平台注册网站 2

2、HTTPS 认证

    因为对 HTTPS 的那些证书认证什么的,着实没有什么大的概念,就不在这里大夸其辞了。国内各大云服务商均提供了免费的站点证书,常见的做法是:申请个域名,绑定服务器IP,然后下载云服务提供的证书,添加认证即可。

    这里的做法是使用 openssl 自行签发 docker.domain.com 的站点 SSL 证书,也是看着步骤,一步步傻瓜式操作下来的,就不献丑了。具体步骤可以参考:https://yeasy.gitbooks.io/docker_practice/content/repository/registry_auth.html

    至于坑,那还是有的,比如上面的 Docker Compose 安装就折腾了好久。另外需要注意的是,最后生成的文件都要放在 /etc/docker 相关目录下,目录结构如下:

时时app平台注册网站 3

时时app平台注册网站 4

 

参考资料:《Docker — 从入门到实践》

2014/11/14 02:32:48 Error response from daemon: Invalid Registry endpoint: Get : x509: certificate signed by unknown authority

创建用户

harbor已经创建成功。现在我们来开始创建一个用户。
时时app平台注册网站 5

一、Docker hub 交互

    Docker hub 是 Docker 官方维护的一个公共仓库,大部分需求都可以通过在 Docker hub 中直接下载镜像来完成。接下来,来看一下怎么与 Docker hub 进行交互,包括登陆登出以及将本地镜像推送到 Docker hub 等...

注册:https://hub.docker.com/ 注册的时候需要FQ~~

登陆:docker login 

时时app平台注册网站 6

登出:docker logout

搜索镜像

docker search [name] --filter=stars=30
                     --filter=stars=N (参数可以指定仅显示收藏数量为 N 以上的镜像)

时时app平台注册网站 7

拉取镜像:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

推送镜像

#1、打镜像标签(username 表示Docker账号用户名)
docker tag REPOSITORY[:tag] username/REPOSITORY[:tag]
docker tag myenv:1.0 jmcui/myenv:1.0

#2、推送到Docker hub
docker push username/REPOSITORY[:tag]
docker push jmcui/myenv:1.0

部署自己的私有 Docker Registry [英文]

创建项目

创建项目,并添加用户
时时app平台注册网站 8

二、创建 Docker 私库(基于HTTP)

    在企业中把内部的一些工具包放入 Nexus 中是比较常见的做法,最新版本 Nexus3.x 全面支持 Docker 的私有镜像。所以使用 Nexus3.x 一个软件来管理 Docker , Maven , Yum , PyPI 等是一个明智的选择。

stateOrProvinceName_default    = GD

为什么要搭建私有镜像仓库

  对于一个刚刚接触Docker的人来说,官方的Docker hub是用于管理公共镜像。既然官方提供了镜像仓库我们为什么还要去自己搭建私有仓库呢?虽然也可以托管私有镜像。我们可以非常方便的把我们自己镜像推送上去,但是Docker hub提供的私有仓库个数有限。对于个人来说Docker hub是个不错的选择,但是对于企业来说,相对于安全 ,成本和公司的架构来说搭建自己的私有镜像仓库才是正确的道路。

三、私有仓库高级配置(HTTPS 认证)

    下面,我们将要搭建的私有仓库地址为 docker.domain.com,使用 openssl 自行签发 docker.domain.com 的站点 SSL 证书,并用 Docker Compose 搭建一个拥有权限认证、TLS 的私有仓库。

    由于是在 Centos 7 下玩的 Docker ,首先要解决 Docker Compose 安装的问题。

# cd /etc/nginx/ssl

什么是Harbor?为什么要选择Harbor

  Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

  • 基于角色的访问控制 - 用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
  • 镜像复制 - 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
  • 图形化用户界面 - 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
  • AD/LDAP 支持 - Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
  • 审计管理 - 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
  • 国际化 - 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
  • RESTful API - RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
  • 部署简单 - 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。
    这就是官网原话。完美解释了什么是Harbor?为什么要选择Harbor。上面解释那么多的Harbor, 现在我们来开始安装吧。

    #### Harbor安装

      要安装Harbor,有以下几个先决条件:
        Python版本大于或者等于2.7     Docker engine的版本大于等于1.10
        Docker Compose的版本大于1.6.0

  首先我们需要检查自己服务器是否支持上面3个条件。输入以下代码检查

#python2.7官网安装页面

#检查Python版本.Ubuntu 16.04已经集成了python2.7。
python -V
#检查Docker的版本
docker -v
#Docker Compose安装脚本
sudo curl -L -s`-`uname -m` -o /usr/local/bin/docker-compose
#检查Docker Compose的版
docker-compose --version
#如果提示Permission denied。执行以下语句赋权
sudo chmod x /usr/local/bin/docker-compose

  确保服务器上的软件版本已经满足以上要求之后。我们现在开始安装Harbor。如果不知道怎么安装docker 可以参考  https://www.linuxidc.com/Linux/2018-03/151318.htm

5、验证效果

#1、登陆
docker login xx.xx.xx.xx:8082
#2、私库标签
docker tag myenv:1.0  xx.xx.xx.xx:8082/myenv
#3、推送镜像到私有仓库
docker push xx.xx.xx.xx:8082/myenv
#4、查看私有仓库镜像,验证是否推送成功
curl xx.xx.xx.xx:8082/v2/_catalog
#5、拉取私有仓库镜像
docker pull xx.xx.xx.xx:8082/myenv

# docker tag 68edf809afe7 registry.domain.com:5000/centos6-test

时时app平台注册网站 9

 3、创建私有仓库

    页面上方的齿轮按钮 —> Repository —> Repositories —> Create repository —> 选择 docker (hosted)

时时app平台注册网站 10

      还可以创建一个 docker (proxy) 类型的仓库链接到 DockerHub 上。再创建一个 docker (group) 类型的仓库把刚才的 hosted 与 proxy 添加在一起。主机在访问的时候默认下载私有仓库中的镜像,如果没有将链接到 DockerHub 中下载并缓存到 Nexus 中。

certs          = $dir/certs            # Where the issued certs are kept

下载Harbor

#下载安装包
wget
#解压
tar -xzf harbor-offline-installer-v1.1.2.tgz
cd harbor
#编辑配置文件
vi harbor.cfg

1、安装 Docker Compose

x86_64 架构的 Linux 建议安装如下:

    从 官方 GitHub Release 处选择最新版本安装,类似如下~

#1、直接下载对应的二进制包
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod  x /usr/local/bin/docker-compose
#2、添加环境变量
export PATH=$PATH:/usr/local/bin/docker-compose

#卸载
sudo rm /usr/local/bin/docker-compose

ARM 架构的 Linux 建议安装如下:

#1、检查linux有没有安装python-pip包
 pip -V
#2、执行安装 epel-release 包
 yum -y install epel-release
#3、执行安装 python-pip 包
 yum install python-pip
#4、对安装好的pip进行升级
 pip install --upgrade pip
#5、再次验证pip是否安装成功
 pip -V
#6、安装Docker-Compose(失败的话可重复多次)
 pip --default-timeout=300 install -U docker-compose --ignore-installed requests
#7、检查docker-compose 安装
 docker-compose -version

#卸载
sudo pip uninstall docker-compose
yum -y remove python-pip
yum -y remove epel-release

bash 补全命令 :sudo curl -L -o /etc/bash_completion.d/docker-compose

 

直接用容器来执行Docker Compose:

curl -L https://github.com/docker/compose/releases/download/1.22.0/run.sh > /usr/local/bin/docker-compose
chmod  x /usr/local/bin/docker-compose

of Certificate Authority (CA) public keys (CA certs). If the default

使用harbor

2、登陆

    访问 http:// ip地址:8081 默认账号:admin,默认密码:admin123

时时app平台注册网站 11

...

配置文件注释参考]

## Configuration file of Harbor

#设置访问地址,支持IP,域名,主机名,禁止设置127.0.0.1
hostname = reg.mydomain.com

#访问方式,http或者https
ui_url_protocol = http

#邮件通知相关设置
email_server = smtp.mydomain.com
email_server_port = 25
email_username = sample_admin@mydomain.com
email_password = abc
email_from = admin <sample_admin@mydomain.com>
email_ssl = false

#用户登录密码
harbor_admin_password = Harbor12345

#harbor认证模式,默认为db_auth,本地mysql,也可以配置ldap认证
auth_mode = db_auth

#ldap认证配置
ldap_url = ldaps://ldap.mydomain.com
ldap_basedn = ou=people,dc=mydomain,dc=com
ldap_uid = uid
ldap_scope = 3

#mysql数据库设置
db_password = root123
self_registration = on
use_compressed_js = on
max_job_workers = 3
token_expiration = 30
verify_remote_cert = on
customize_crt = on

#显示的认证及组织信息
crt_country = CN
crt_state = State
crt_location = CN
crt_organization = organization
crt_organizationalunit = organizational unit
crt_commonname = example.com
crt_email = example@example.com
project_creation_restriction = everyone

#SSL证书地址。只有开启https访问才生效
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
#############

  以上按照自己需求修改。如果想开启https模式访问需要自己申请ssl证书。harbor默认监听80端口。如果需要修改端口。请修改目录下的docker-compose.yml文件,
时时app平台注册网站 12
修改完成之后。运行

sudo ./install.sh

  进行安装。安装完成之后他会自己启动。这里他会自己下载一些他所需的images。过程有点慢。可以通过阿里云的镜像加速器来加速。阿里云镜像加速器 .打开链接登录之后点击镜像加速。然后你会得到一个专属加速地址。如图
时时app平台注册网站 13可以根据自己的环境查看文档安装使用。然后等待命令执行结束。
时时app平台注册网站 14

1、使用 Docker 安装 Nexus

docker run -d --name nexus3 --restart=always -p 8081:8081 -p 8082:8082 -p 8083:8083 --mount src=nexus-data,target=/nexus-data sonatype/nexus3
## 8081:nexus3网页端
## 8082:docker(hosted)私有仓库,可以pull和push
## 8083:docker(proxy)代理远程仓库,只能pull 

目前的办法三个:

上传镜像

首先使用docker login命令登录:

#登录
robin:~ robin$ sudo docker login shepherd618.cn
Username: admin
Password:
Login Succeeded
#查看本地镜像
robin:docker_demo robin$ sudo docker images
Password:
REPOSITORY          TAG                IMAGE ID            CREATED            SIZE
docker_demo        latest              fdd994bee741        19 seconds ago      283MB
node                8.9-alpine          406f227b21f5        2 weeks ago        68.1MB
#给dcoker_demo新增tag
robin:docker_demo robin$ sudo docker tag docker_demo shepherd618.cn/test/demo
#push images
robin:docker_demo robin$ docker push shepherd618.cn/test/demo
The push refers to repository [shepherd618.cn/test/demo]
f8387a884f73: Layer already exists
d74f9d9e7013: Pushed
f846841ed47f: Layer already exists
0198944a9875: Layer already exists
9dfa40a0da3b: Layer already exists
latest: digest: sha256:5b33acc5edf6f48cbd8e7ccd216daa4a7da1ebd4871fbc68bc2517136f1ccf44 size: 1374

然后打开harbor,会看到刚刚上传的images和操作日志
时时app平台注册网站 15

当我们需要用到这个images的时候可以通过上面给的pull命令下载到本地。到此整个安装过程结束。

本文永久更新链接地址

时时app平台注册网站 16

带用户认证的docker-registry:

...[ req_distinguished_name ]部分主要是颁证时一些默认的值,可以不动

# curl -X GET

The Docker Hub and the Registry spec

# cp config/config_sample.yml /opt/data/registry/config.yml

本文后的第1篇参考文档没有出现这个问题,但评论中有提及。

RANDFILE        = $dir/private/.rand    # private random number file

}

确认CA的一些配置文件

# docker login

(2) 配置完nginx的docker-registry.conf后启动报错

原因是nginx版本太低,一些配置指令不兼容,使用yum install nginx默认安装了1.0.x,卸载重新下载nginx-1.4.7-1.el6.ngx.x86_64.rpm安装解决。

经分析产生这个问题的原因是做了一个操作:在docker后台进程启动的终端,继续回车后会临时退出后台进程的日志输出,我就在这个shell下使用yum安装软件包,但由于网络原因yum卡住不动,于是我就另起了一个终端kill了这个yum进程,不知为何会影响到表面已经退出前台输出的docker。解决办法是umount容器的挂载点:(见这里)

#unique_subject = no                    # Set to 'no' to allow creation of

# openssl genrsa -out nginx.key 2048

如果直接访问访问将得到未授权的信息:

...

}

会提示输入一些内容,因为是私有的,所以可以随便输入,最好记住能与后面保持一致。上面的自签证书cacert.pem应该生成在/etc/pki/CA下。

# openssl req -new -x509 -key private/cakey.pem -out cacert.pem

Locality Name (eg, city) []:SZ

{"num_results": 2, "query": "", "results": [{"description": "", "name": "library/centos6"}, {"description": "", "name": "library/nginx"}]}

  1. 加入nginx认证

Username: sean

curl: (60) Peer certificate cannot be authenticated with known CA certificates

# docker login registry.domain.com:8080

(1) 生成根密钥

# docker pull registry.domain.com:8080/library/centos6

# cd docker-registry && mkdir -p /opt/data/registry

方法有多种,直接运行下面的命令:

# must be commented out to leave a V1 CRL

# yum install nginx

# service docker start  正常

bundle file isn't adequate, you can specify an alternate file

Error: Cannot start container b36bd796bd3d: Error getting container b36bd796bd3d463c4fedb70d98621e7318ec3d5cd14b2f60b1d182ad3cbcc652

将cacert.pem根证书追加到ca-bundle.crt后一定要重启docker后台进程才行。

# ssl on;

proxy_pass ;

# let Nginx know about our auth file

# curl

listen 8080;

location /v1/_ping {

{"num_results": 2, "query": "", "results": [{"description": "", "name": "library/centos6"}, {"description": "", "name": "library/nginx"}]}

auth_basic off;

这个地方挣扎了很久,重点关注一下这个下面几个issue:

# htpasswd -c /etc/nginx/docker-registry.htpasswd sean

ssl_certificate_key /etc/nginx/ssl/nginx.key;

  1. Docker Registry 说明

# service nginx restart

40627956f44c: Image successfully pushed

# docker run -d -e SETTINGS_FLAVOR=dev -e STORAGE_PATH=/tmp/registry -v /opt/data/registry:/tmp/registry  -p 5000:5000 registry

(6) 目前让根证书起作用的只发现一个办法:

docker push registry.domain.com:5000/centos6-test

Re-type new password:

proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

# htpasswd /etc/nginx/docker-registry.htpasswd itsection

Sending image list

build完成后,就可以运行这个docker-registry

Official docker-registry README

[ req_distinguished_name ]

# cat /etc/pki/CA/cacert.pem >> /etc/pki/tls/certs/ca-bundle.crt

# vi /etc/pki/tls/openssl.cnf

countryName_max                = 2

2.2 客户端使用

nginx/1.4.7

# curl localhost:5000

官方提供了Docker Hub网站来作为一个公开的集中仓库。然而,本地访问Docker Hub速度往往很慢,并且很多时候我们需要一个本地的私有仓库只供网内使用。

The push refers to a repository [registry.domain.com:8080/ubuntu] (len: 1)

auth_basic off;

Docker仓库实际上提供两方面的功能,一个是镜像管理,一个是认证。前者主要由docker-registry项目来实现,通过http服务来上传下载;后者可以通过docker-index(闭源)项目或者利用现成认证方案(如nginx)实现http请求管理。

Password:

private_key    = $dir/private/cakey.pem # The private key

crlnumber      = $dir/crlnumber        # the current crl number

# ln -s /etc/nginx/sites-enabled/docker-registry /etc/nginx/conf.d/docker-registry.conf

database        = $dir/index.txt        # database index file.

创建存放证书的目录

(5) 私有CA根据请求来签发证书

State or Province Name (full name) [Some-State]:GD

serial          = $dir/serial          # The current serial number

Please enter the following 'extra' attributes

the bundle, the certificate verification probably failed due to a

##这里可以设置本地存储SETTINGS_FLAVOR=dev,local STORAGE_PATH:/tmp/registry等待

3.2 加入认证后使用docker-registry

Username (sean): sean

都会报错:

于是在另外一台要使用docker的主机上就可以通过这台私服拉取和推送镜像了:

Email Address []:

default_days    = 3650                  # how long to certify for

pull, push官网的镜像时由于GFW的原因需要设置代理,但不是http_proxy而是HTTP_PROXY,对于docker来说同时设置这两个值就会出问题,有时出于安装软件包的需要设置http_proxy,就会导致冲突。在docker-registry中如果忘记了当前哪一个在起作用,找遍所有问题都发现不了原因,而docker返回给我们的错误也难以判断。切记~

第一次push到私服上时会提示用户名、密码和邮箱,创建即可。也可以在docker私服端加入认证机制。

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

new_certs_dir  = $dir/newcerts        # default place for new certs.

## 给container去另外一个名字

New password:

ssl_certificate /etc/nginx/ssl/nginx.crt;

...

创建两个登录用户

crl_dir        = $dir/crl              # Where the issued crl are kept

Adding password for user sean

经验证以下几个位置不行:(Adding trusted root certificates to the server)

If this HTTPS server uses a certificate signed by a CA represented in

(3) 网络设置代理问题

(2) 生成根证书

Organization Name (eg, company) [Internet Widgits Pty Ltd]:COMPANY

/etc/pki/ca-trust/extracted/pem/、/etc/pki/tls/certs/cacert.crt

proxy_set_header Host      $http_host;  # required for Docker client sake

curl performs SSL certificate verification by default, using a "bundle"

修改源码session.go,去掉相应的判断行,然后git下来重新安装。我猜你更不会这么做

3.1 安装及配置nginx

## 本地对份镜像启动起来,形成container

# vi /opt/data/registry/config.yml

How To Set Up a Private Docker Registry on Ubuntu 14.04

auth_basic_user_file    docker-registry.htpasswd;

/etc/pki/ca-trust/source/anchors、/etc/pki/ca-trust/source、/etc/pki/ca-trust/extracted、

为了让nginx使用这个密码文件,并且转发8080端口的请求到Docker Registry,新增nginx配置文件

安装SSL证书,使用HTTPS传输。这是明智的选择,新版本docker也推荐我们这么做,往下看。

(7) 最终搞定:

server_name registry.domain.com;

# ssl_certificate /etc/ssl/certs/docker-registry;

certificate    = $dir/cacert.pem      # The CA certificate

Pulling repository registry.domain.com:8080/library/centos6

有人说是backend storage的问题,这里是本地存储镜像,不应该。经过查阅大量资料,并反复操作验证,是docker-registry版本的问题。从v0.10.0开始,docker login虽然Succeeded,但pull或push的时候,~/.dockercfg下的用户登录信息将不允许通过HTTP明文传输。(如果你愿意可以查看v0.10.0的源码 registry.go,在分支v0.9.1及以前是没有HTTP code 401, Docker will not send auth headers over HTTP的)

...

按条件搜索nginx

2014/11/08 15:14:57 Error: failed to start one or more containers

nginx日志

此时主机的5000端口应该通过防火墙禁止访问(或者在docker run端口映射时只监听回环接口的IP -p 127.0.0.1:5000:5000)。

# umount /var/lib/docker/devicemapper/mnt/b36bd796bd3d463c4fedb70d98621e7318ec3d5cd14b2f60b1d182ad3cbcc652

An optional company name []:

countryName                    = Country Name (2 letter code)

# docker push registry.domain.com:8080/ubuntu:sean

到此我们已经拥有了建立ssl安全连接所需要的所有文件,并且服务器的crt和key都位于配置的目录下,唯有根证书cacert.pem位置不确定放在CentOS6下的哪个地方。

# ssl_certificate_key /etc/ssl/private/docker-registry;

}

location / {

1 # mkdir /etc/nginx/ssl

client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads

  1. 在CentOS上搭建docker私服

...

authenticatGET /v1/repositories/library/centos6/tags HTTP/1.1", host: "registry.domain.com:8080"

如何删除docker-registry的里的镜像

撤退,这就是为什么先说明在操作前线查看到这的原因了

server_name sean.domain.com;  -- your registry server_name

from driver devicemapper: Error mounting '/dev/mapper/docker-253:0-787676-b36bd796bd3d463c4fedb70d98621e7318ec3d5cd14b2f60b1d182ad3cbcc652'

关于如何创建和使用本地仓库,其实已经有很多文章介绍了。因为docker技术正处于发展和完善阶段,所以有些文章要么内容已经过时,要么给出了错误的配置,导致无法正常创建仓库。本文记录的是个人完整的搭建过程,docker version为1.1.2。

# required to avoid HTTP 411: see Issue #1486 ()

# several ctificates with same subject.

同样会提示输入一些内容,其它随便,除了Commone Name一定要是你要授予证书的服务器域名或主机名,challenge password不填。

# docker pull registry.domain.com:8080/library/centos6

拉取image到本地

Common Name (e.g. server FQDN or YOUR name) []:your.domain.com

proxy_pass ;

主要思路:

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

Login Succeeded

The push refers to a repository [registry.domain.com:8000/centos6] (len: 1)

我们先配置自己的config.yml文件,第一种方法是直接在run的时候指定变量

Login Succeeded

  1. 参考

Sending image list

crl            = $dir/crl.pem          # The current CRL

vi /etc/nginx/sites-enabled/docker-registry:

(请在实际操作以前,先阅读完本节,再确定是否在前端加入nginx)

"docker-registry server (dev) (v0.8.1)"

我们的CA中心与要申请证书的服务器是同一个,否则应该是在另一台需要用到证书的服务器上生成。

server {

不出意外的话,上面的docker pull会失败:

ssl on;

to be sent with your certificate request

# docker -d --tlsverify --tlscacert /etc/pki/CA/cacert.pem或者将cacert.pem拷贝到~/.docker/ca.pem# mkdir ~/.docker && cp /etc/pki/CA/cacert.pem ~/.docker/ca.pem

If you'd like to turn off curl's verification of the certificate, use

要从私服上获取镜像或向私服提交镜像,现在变得非常简单,只需要在仓库前面加上私服的地址和端口,形如172.29.88.222:5000/centos6。注意,这里可以选择不使用IP,而是用hostname,如registry.domain.com:5000,但不能仅用不带.的主机名registry,docker会认为registry是用户名,建议使用带域名的hostname加port来表示。

为了安全起见,修改cakey.pem私钥文件权限为600或400,也可以使用子shell生成( umask 077; openssl genrsa -out private/cakey.pem 2048 ),下面不再重复。

2014/11/12 08:11:32 HTTP code 401, Docker will not send auth headers over HTTP.

countryName_default            = CN

...

# cp /etc/pki/tls/certs/ca-bundle.crt{,.bak}    备份以防出错

upstream docker-registry {

# git clone

docker-registry既然也是软件应用,自然最简单的方法就是使用官方提供的已经部署好的镜像registry。官方文档中也给出了建议,直接运行sudo docker run -p 5000:5000 registry命令。这样确实能启动一个registry服务器,但是所有上传的镜像其实都是由docker容器管理,放在了/var/lib/docker/….某个目录下。而且一旦删除容器,镜像也会被删除。因此,我们需要想办法告诉docker容器镜像应该存放在哪里。registry镜像中启动后镜像默认位置是/tmp/registry,因此直接映射这个位置即可,比如到本机的/opt/data/registry目录下。

TO-DO

重启nginx来激活虚拟主机的配置

上面用“如果”是因为一开始总提示certificate signed by unknown authority,有人说将根证书放在/etc/docker/certs.d下,还有人说启动docker daemon收加入--insecure-registry .. 但终究是因为版本差异不成功。但后来又奇迹般的不需要--tlscacert就好了。

从私服上搜索存在哪些可用镜像

换成v0.9.1及以下版本。现在都v1.3.1了,我猜你不会这么做

Pushing tag for rev [40627956f44c] on {

docker run -d -e SETTINGS_FLAVOR=dev -e STORAGE_PATH=/tmp/registry -v /db/docker-images:/tmp/registry -p 5000:5000 registry

# docker start b36bd796bd3d

# openssl genrsa -out private/cakey.pem 2048

countryName_min                = 2

# For versions of Nginx > 1.3.9 that include chunked transfer encoding support

(4) 为nginx生成证书签署请求

}

# curl -X GET

# vi /etc/nginx/conf.d/docker-registry.conf

# curl

auth_basic              "Restricted";

# curl localhost:8080401 Authorization Required

# cd /etc/pki/CA/

## 最后将新的docker images推送到私服上

# docker push registry.domain.com:8000/centos6:test_priv

[ CA_default ]

5b12ef8fd570: Image successfully pushed

最好重启一下registry# docker restart

Email: zhouxiao@domain.com

上面签发过程其实默认使用了-cert cacert.pem -keyfile cakey.pem,这两个文件就是前两步生成的位于/etc/pki/CA下的根密钥和根证书。

2014/11/12 07:03:49 [error] 14898#0: *193 no user/password was provided for basic

Pushing repository registry.domain.com:8000/centos6 (1 tags)

Docker 体系四(自定义货仓).时时app平台注册网站。让nginx来使用这个virtual-host

511136ea3c5a: Image successfully pushed

2014/11/11 21:00:25 Could not reach any registry endpoint

# docker -d

the -k (or --insecure) option.

但还有一个小问题没解决,虽然已经可以正常使用,但每次请求在nginx的error.log中还是会有[error] 8299#0: *27 no user/password was provided for basic authentication,应该是这个版本docker暂未解决的bug。

能想到的另外一个办法是,启动docker后台进程时,重定向输出docker -d > /dev/null 2>&1(/var/log/docker已自动记录了一份日志)。

如果docker login依然报错certificate signed by unknown authority,参考Running Docker with https,启动docker后台进程时指定信任的CA根证书:

首先打开nginx配置文件中ssl的三行注释

"docker-registry server (dev) (v0.8.1)"

server localhost:5000;

via:

# curl

chunked_transfer_encoding on;

2.1 安装docker-registry

stateOrProvinceName            = State or Province Name (full name)

# docker login

using the --cacert option.

server {

not match the domain name in the URL).

# openssl req -new -key nginx.key -out nginx.csr

保存之后,nginx会分别从/etc/nginx/ssl/nginx.crt和/etc/nginx/ssl/nginx.key读取ssl证书和私钥。如果你自己愿意花钱买一个ssl证书,那就会变得非常简单,把证书和私钥拷贝成上面一样即可。关于SSL以及签署ssl证书,请参考其他文章。

3.3 其它问题(1) docker后台进程意外中断后,重新docker start报错

More details here:

这里我们自签署一个ssl证书,把当前系统作为(私有)证书颁发中心(CA)。

最好安装1.4.x版本,不然下面的有些配置可能会不兼容

A challenge password []:

}

docker pull library/centos6

proxy_pass ;

68edf809afe7: Image successfully pushed

# docker build -t "local-sean" .

Password:

(3) 为我们的nginx web服务器生成ssl密钥

location /_ping {

Pushing repository registry.domain.com:8080/ubuntu (1 tags)

3.3 为nginx安装ssl证书

[emerg] 14714#0: unknown directive "upstream" in /etc/nginx/conf.d/docker-registry.conf:4

# docker run -d -e SETTINGS_FLAVOR=dev -e STORAGE_PATH=/tmp/registry -v /opt/data/registry:/tmp/registry  -p 5000:5000 registry

"docker-registry server (dev) (v0.8.1)"

on '/var/lib/docker/devicemapper/mnt/b36bd796bd3d463c4fedb70d98621e7318ec3d5cd14b2f60b1d182ad3cbcc652': device or resource busy

listen 8000;

Username: sean

problem with the certificate (it might be expired, or the name might

dir            = /etc/pki/CA          # Where everything is kept

#Docker 体系四(自定义货仓).时时app平台注册网站。 openssl ca -in nginx.csr -out nginx.crt

# Replace with appropriate values where necessary

Email: zhouxiao@domain.com

# docker run -d -v /opt/data/registry:/tmp/registry -p 5000:5000 -e  DOCKER_REGISTRY_CONFIG=/tmp/registry/config.yml registry

从上面的过程可以看到,除非防火墙限制,否则任何主机可以创建账号并想私服推送镜像,更安全的做法是在外层加入登录认证机制。

# curl

本文由时时app平台注册网站发布于时时app平台注册网站,转载请注明出处:Docker 体系四(自定义货仓).时时app平台注册网站

关键词: