创建Docker私有库

这篇文章介绍如何搭建一个私有的Docker仓库,包括配置证书和密码认证。

安装

因为本身有docker环境,所以直接通过docker来安装。

下载

下载registry的docker镜像,点击查看官方镜像地址

$ docker pull registry # 这样会使用官方docker镜像库,或者配置在/etc/docker/domain.json中的镜像库。也可以像下面这样,直接指定下载库。
$ docker pull registry.docker-cn.com/library/registry

配置数据存储位置

配置存储位置/var/lib/registry,通过-v指定。

$ docker run -d \
  --restart=always \
  --name registry \
  -v data:/var/lib/registry \
  registry

这样就能够通过:localhost:5000来push自己的镜像了。

配置证书

生成证书

  • 如果你自己的域名已经有证书了,就下载下来会有两个文件:crtpem,然后合并成一个crt:
    $ cat domain.crt intermediate-certificates.pem > certs/domain.crt
    
  • 如果没有证书,可以自己通过openssl生成,注意master.mesos是自己的域名,我这里是因为mesosphere的主节点是这个域名,我就生成master.mesos对应的证书。
    $ openssl req -new -SHA256 -newkey rsa:2048 -nodes -keyout master.mesos.key -out master.mesos.csr -subj "/C=CN/ST=Sichuan/L=Chengdu/O=/OU=/CN=master.mesos"
    

生成好了就会在当前目录下面有两个文件:master.mesos.csrmaster.mesos.key,我们最终是需要crt格式的证书,通过下面的方式转换:

$ openssl x509 -req -in master.mesos.csr -signkey master.mesos.key -out domain.crt

现在在目录下面就是三个文件:master.mesos.csrmaster.mesos.keydomain.crt

使用证书

生成好了domain.crt后,通过以下方式使用证书:

$ docker run -d \
  --restart=always \
  --name registry \
  -v `pwd`/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -p 443:443 \
  registry

注意里面的证书目录,不能配置错了。现在就能够通过https访问仓库了。

密码认证

配置密码认证后,访问仓库必须通过输入用户名和密码才行。

创建密码文件

用户名是testuser,密码是testpassword

$ mkdir auth
$ docker run \
  --entrypoint htpasswd \
  registry:2 -Bbn testuser testpassword > auth/htpasswd

现在在当前目录下面会有一个auth目录,目录下面有一个密码文件:htpasswd,文件内容大概像这个:

[root@master auth]# cat htpasswd 
testuser:$2y$05$pQC8s2X7.k0/yrRr6ksdfsdfsdlkxlkjskld235Im

[root@master auth]#

使用密码

$ 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`/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry

这样使用docker仓库的时候就需要先登录:

$ docker login -u testuser -p testpassword localhost:5000

登录后就可以同之前一样推送和拉去镜像了。

通过docker-compose来启动

我比较喜欢使用docker-compose。完整的配置如下:

registry:
    restart: always
    container_name: registry
    image: registry.docker-cn.com/library/registry
    environment :
      TZ : 'Asia/Shanghai'
      REGISTRY_HTTP_TLS_KEY: /certs/domain.key
      REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
    volumes:
      - ./data/registry:/var/lib/registry
      - ./conf/registry/auth:/auth
      - ./conf/registry/certs:/certs
    ports:
      - 5000:5000 

docker-compose所在目录结构:

[root@master docker]# ls -al
总用量 12
drwxr-xr-x   5 root root   84 5月  30 11:00 .
dr-xr-x---. 15 root root 4096 5月  30 15:24 ..
drwxr-xr-x   4 root root   35 5月   8 17:52 conf
drwxr-xr-x   4 root root   35 5月   8 17:55 data
-rw-r--r--   1 root root  815 5月   9 11:26 docker-compose.yml

目录说明:

domain.crt放到./conf/registry/certs
htpasswd放到./conf/registry/certs
仓库数据在./data/registry目录中

问题

1. 如果出现x509: certificate signed by unknown authority

解决方案:

$ mkdir -p /etc/docker/certs.d/master.mesos:5000 # `master.mesos`是自己的域名
$ 通过scp等方式拷贝之前生成的`domain.crt`到/etc/docker/certs.d/master.mesos:5000/ca.crt

注意:这个不是把domain.crt放到仓库所在的机器上,而是在哪儿使用docker就应该在这台机器上配置这个证书。比如仓库在A服务器,我在B服务器使用,这个配置操作应该在B操作,同样如果在A上也要操作也需要这样做。

简单的使用

$ docker login -u testuser -p testpassword master.mesos:5000
$ docker tag xxxx master.mesos:5000/library/java:8 # xxxx是docker镜像,通过`docker images`查看
$ docker push master.mesos:5000/library/java:8
$ docker pull master.mesos:5000/library/java:8

docker tag这一步很重要,必须要是这种格式:master.mesos:5000(仓库地址)+ 其他。

发表评论

电子邮件地址不会被公开。 必填项已用*标注