仓库

docker.io/centos,docker.io 是注册服务器,centos 是仓库名
image.png

使用公共镜像仓库

  1. # docker login 直接登录docker hub仓库
  2. $ docker login
  3. # 提交一个自定义的镜像到自己的仓库
  4. $ docker tag busybox xxx/busybox
  5. $ docker push xxx/busybox

搭建docker官方提供的私有仓库

Docker 官方提供了开源的镜像仓库 Distribution,并且镜像存放在 Docker Hub 的 Registry 仓库下供我们下载。
我们可以使用以下命令启动一个本地镜像仓库

  1. $ docker run -v /var/lib/registry/data:/var/lib/registry -d -p 5000:5000 --name registry registry:2.7

要构建一个支持 HTTPS 访问的安全镜像仓库,需要满足以下两个条件:

  • 拥有一个合法的域名,并且可以正确解析到镜像服务器;
  • 从证书颁发机构(CA)获取一个证书。

在准备好域名和证书后,就可以部署我们的镜像服务器了。这里我以regisry.lagoudocker.io这个域名为例。首先准备存放证书的目录/var/lib/registry/certs,然后把申请到的证书私钥和公钥分别放到该目录下。 假设我们申请到的证书文件分别为regisry.lagoudocker.io.crtregisry.lagoudocker.io.key

如果上一步启动的仓库容器还在运行,我们需要先停止并删除它。

  1. $ docker stop registry && docker rm registry

然后使用以下命令启动新的镜像仓库:

  1. $ docker run -d \
  2. --name registry \
  3. -v /var/lib/registry/data:/var/lib/registry \
  4. -v /var/lib/registry/certs:/certs \
  5. -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  6. -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/regisry.lagoudocker.io.crt \
  7. -e REGISTRY_HTTP_TLS_KEY=/certs/regisry.lagoudocker.io.key \
  8. -p 443:443 \
  9. registry:2.7

这里,我们使用 -v 参数把镜像数据持久化在/var/lib/registry/data目录中,同时把主机上的证书文件挂载到了容器的 /certs 目录下,同时通过 -e 参数设置 HTTPS 相关的环境变量参数,最后让仓库在主机上监听 443 端口。
仓库启动后,我们就可以远程推送镜像了。

  1. $ docker tag busybox regisry.lagoudocker.io/busybox
  2. $ docker push regisry.lagoudocker.io/busybox

Docker 官方开源的镜像仓库Distribution仅满足了镜像存储和管理的功能,用户权限管理相对较弱,并且没有管理界面。如果你想要构建一个企业的镜像仓库,Harbor 是一个非常不错的解决方案。

Harbor搭建

生成证书

  1. $ cd /root/harbor
  2. # 生成ca
  3. $ openssl genrsa -out ca.key 4096
  4. $ openssl req -x509 -new -nodes -sha512 -days 3650 \
  5. -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=diyun.com" \
  6. -key ca.key \
  7. -out ca.crt
  8. # Server Certificate
  9. $ openssl genrsa -out diyun.com.key 4096
  10. $ openssl req -sha512 -new \
  11. -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=diyun.com" \
  12. -key diyun.com.key \
  13. -out diyun.com.csr
  14. # Generate an x509 v3 extension file
  15. $ cat > v3.ext <<-EOF
  16. authorityKeyIdentifier=keyid,issuer
  17. basicConstraints=CA:FALSE
  18. keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
  19. extendedKeyUsage = serverAuth
  20. subjectAltName = @alt_names
  21. [alt_names]
  22. DNS.1=diyun.com
  23. DNS.2=diyun
  24. DNS.3=hostname
  25. EOF
  26. # Use the v3.ext file to generate a certificate for your Harbor host.
  27. $ openssl x509 -req -sha512 -days 3650 \
  28. -extfile v3.ext \
  29. -CA ca.crt -CAkey ca.key -CAcreateserial \
  30. -in diyun.com.csr \
  31. -out diyun.com.crt
  32. # Provide the Certificates to Harbor
  33. $ cp diyun.com.crt /data/cert/
  34. $ cp diyun.com.key /data/cert/
  35. $ openssl x509 -inform PEM -in diyun.com.crt -out diyun.com.cert
  36. $ cp diyun.com.cert /etc/docker/certs.d/diyun.com/
  37. $ cp diyun.com.key /etc/docker/certs.d/diyun.com/
  38. $ cp ca.crt /etc/docker/certs.d/diyun.com/

安装docker-compose和 harbor

  1. $ curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  2. $ chmod +x /usr/local/bin/docker-compose
  1. $ wget https://github.com/goharbor/harbor/releases/download/v1.10.1/harbor-offline-installer-v1.10.1.tgz
  2. $ tar -xvf harbor-offline-installer-v1.10.1.tgz -C /opt/

修改文件harbor.yml

  1. hostname: diyun.com
  2. # http related config
  3. http:
  4. # port for http, default is 80. If https enabled, this port will redirect to https port
  5. port: 80
  6. # https related config
  7. https:
  8. # https port for harbor, default is 443
  9. port: 443
  10. # The path of cert and key files for nginx
  11. certificate: /root/harbor/diyun.com.cert
  12. private_key: /root/harbor/diyun.com.key

开始安装,以下安装命令同时安装了 Clair 服务,一个用户镜像漏洞静态分析的工具。如果不需要,可以省略该选项。

  1. $ ./install.sh --with-clair

使用

  1. $ docker login diyun.com
  2. Username: admin
  3. Password:
  4. WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
  5. Configure a credential helper to remove this warning. See
  6. https://docs.docker.com/engine/reference/commandline/login/#credentials-store
  7. Login Succeeded

登录页面创建一个私有仓库目录pub
image.png

上传镜像到私有仓库

  1. $ docker pull busybox:1.31.1
  2. $ docker tag busybox:1.31.1 diyun.com/pub/busybox:1.31.1
  3. $ docker push diyun.com/pub/busybox:1.31.1

harbor服务管理

  1. $ cd /root/harbor
  2. $ docker-compse down -v
  3. $ docker-compse up -d