这篇文章介绍如何搭建一个私有的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(仓库地址)+ 其他。

概述

这篇文章主要介绍DC/OS集群从1.10升级到1.11,升级的时候需要保证集群上的应用都是正在运行状态,也就是不能是部署状态或者等待等其他状态。可以通过升级的方式来修改配置,比如从1.10通过这种方式升级到1.10,通过这种方式来修改配置。

注意:
升级前一定要看一下官方文档,如果是实验环境,可以忽略这些信息,直接开始做,如果升级过程中出现了问题,一定要回来看官方文档给出的注意事项,才知道怎么解决问题。

在启动节点上准备安装包

  • 复制之前安装节点中的config.yamlip-detect到一个干净的新目录:1.11
    • 重要:1、不能修改exhibitor_zk_backend设置。2、在集群DC/OS 1.11中config.yaml的语法有改变,点击查看详情
  • 按照新语法更新config.yaml后,注意对照新旧配置,确保配置没有问题,更改这些配置可能会导致集群崩溃。
  • 构建安装程序包
    • 下载最新版dcos_generate_config.sh
      curl -O https://downloads.dcos.io/dcos/stable/dcos_generate_config.sh
      
    • 执行更新,<installed_cluster_version>是即将被更新的版本,版本号去mesosphere的管理页面的Overview可以看。
      dcos_generate_config.sh --generate-node-upgrade-script <installed_cluster_version>
      
    • 构建完成后,会在最后生成一个URL,后面都用URL来替代这一行:http://192.168.0.234:8080/upgrade/940157ff99bf4b6188af4d713f70760b/dcos_node_upgrade.sh
      [root@localhost 1.11]# ./dcos_generate_config.sh --generate-node-upgrade-script 1.10.4
      Generating configuration files...
      Cluster package list:package_lists/f85951fce504ff8dd85773e12ba612166e2ecf9b.package_list.json
      Package filename: packages/dcos-config/dcos-config--    setup_211cb3884a16a4d540a9b521616e990fa8f7bd07.tar.xz
      Package filename: packages/dcos-metadata/dcos-metadata--setup_211cb3884a16a4d540a9b521616e990fa8f7bd07.tar.xz
      Generating Bash configuration files for DC/OS
      Node upgrade script URL:`http://192.168.0.234:8080/upgrade/940157ff99bf4b6188af4d713f70760b/dcos_node_upgrade.sh`
      

      构建完成后的目录结构和安装的时候一样:

      ├── dcos-genconf.<HASH>.tar
      ├── dcos_generate_config.sh
      ├── genconf
      │   ├── config.yaml
      │   ├── ip-detect
      
    • 运行Nginx容器,让其他节点可以远程访问和下载生成的脚本
      sudo docker run -d -p <your-port>:80 -v $PWD/genconf/serve:/usr/share/nginx/html:ro nginx
      

更新Master节点

  • 登录到master节点,下载启动节点上的脚本:
    curl -O <URL>
    sudo bash ./dcos_node_upgrade.sh
    
  • 验证是否更新成功和退出状态是否是0
    echo $?
    0
    
  • 验证更新
    • ZooKeeper是否成功启动:http://<dcos_master>:8181/
    • mesos是否是1.5.0(如果是更新到1.11,mesos版本就是1.5.0):http://<dcos_master>/mesos

更新Agent节点

  • 登录到每一个agent节点,下载启动节点上的脚本:
    curl -O <URL>
    sudo bash ./dcos_node_upgrade.sh
    
  • 验证是否更新成功和退出状态是否是0
    echo $?
    0
    
  • 验证更新
    • 验证节点是否加入了DC/OS集群,并且任务都重新协调完成:http://<dcos_master>/mesos