centos7下docker gitlab(四)container register容器镜像仓库

1,292 阅读2分钟

很gitlab,竟然支持容器镜像仓库。该功能在gitlab有个名字叫container register,接下来介绍以下如何开启该功能。
开启container register需要提供https服务,官方给出两种方式:gitlab域名 + 端口方式和独立域名方式,本文采用第二种方式。

流程

这里有两个nginx:
一个是主机的nginx,对外方便提供域名服务;另外一个是gitlab的容器内部nginx,方便gitlab为主机提供https和其他网关服务。 docker push默认的https,所以必须要通过nginx搭建https,为了方便管理,两个nginx共用同一个域名,共享同一份域名证书。
以docker.gitlab.demo.com为contain register地址,gitlab.demo.com为gitlab访问地址为例,docker push docker.gitlab.demo.com/workerman/thinkphp:latest ,我们查看下两个nginx conf:

nginx host下的conf

upstream docker_gitlab {
    server docker.gitlab.thanhoo.com:8443;
}
server {
    listen 443;
    server_name docker.gitlab.demo.com;

    ssl on;
    ssl_certificate /etc/nginx/cert/docker.gitlab.demo.com.pem;
    ssl_certificate_key /etc/nginx/cert/docker.gitlab.demo.com.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
    ssl_prefer_server_ciphers on; #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码

    access_log  /var/log/nginx/docker.gitlab.demo.com-access.log;
    error_log   /var/log/nginx/docker.gitlab.demo.com-error.log;
    location / {
        proxy_pass_header Server;
        proxy_set_header Host $host;
        proxy_set_header Connection "";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_pass https://docker_gitlab; #注意这里是https
    }
}

nginx container下的conf

几个相关知识点
docker exec -it gitlab /bin/bash 进入正在运行name=gitlab的容器内部
/var/opt/gitlab/nginx/conf/gitlab-registry.conf 为容器内部container registry配置文件

server {
  listen *:443 ssl;
  server_name  docker.gitlab.demo.com;
  server_tokens off; ## Don't show the nginx version number, a security best practice

  client_max_body_size 0;
  chunked_transfer_encoding on;

  ## Strong SSL Security
  ## https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html & https://cipherli.st/
  ssl_certificate /etc/gitlab/ssl/docker.gitlab.demo.com.pem;
  ssl_certificate_key /etc/gitlab/ssl/docker.gitlab.demo.com.key;

  ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4';
  ssl_protocols  TLSv1.2 TLSv1.3;
  ssl_prefer_server_ciphers on;
  ssl_session_cache  builtin:1000  shared:SSL:10m;
  ssl_session_timeout  5m;


  ## Real IP Module Config
  ## http://nginx.org/en/docs/http/ngx_http_realip_module.html

  access_log  /var/log/gitlab/nginx/gitlab_registry_access.log gitlab_access;
  error_log   /var/log/gitlab/nginx/gitlab_registry_error.log;

  location / {

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Ssl on;

    proxy_read_timeout                  900;
    proxy_cache off;
    proxy_buffering off;
    proxy_request_buffering off;
    proxy_http_version 1.1;

    proxy_pass          http://0.0.0.0:4567;
  }
}

我们看到

ssl_certificate /etc/gitlab/ssl/docker.gitlab.demo.com.pem;
ssl_certificate_key /etc/gitlab/ssl/docker.gitlab.demo.com.key;

共享了主机域名的 docker.gitlab.demo.com 的证书。
我们看到

proxy_pass       http://0.0.0.0:4567

意思是container register提供了服务端口,端口为4567,那么这个如何设置呢?我们接下来修改gitlab配置文件。

修改gitlab配置文件

vi /srv/gitlab/config/gitlab.rb
gitlab_rails['registry_enabled'] = true # 开启container register功能
gitlab_rails['registry_host'] = "docker.gitlab.demo.com" # gitlab对外提供镜像仓库地址,当然这里是docker
registry['registry_http_addr'] = "0.0.0.0:4567" # container register 对外提供的服务端口
gitlab_rails['registry_path'] = "/var/opt/gitlab/gitlab-rails/shared/registry" # 镜像仓库地址,已挂载到主机上了
registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/docker.gitlab.thanhoo.com.pem" # 域名证书地址,必须配置
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/docker.gitlab.thanhoo.com.key" # 域名证书地址,必须配置

更新配置

docker exec gitlab gitlab-ctl reconfigure

ssl_certificate,必须配置;否则会报错。
浏览器打开gitlab

docker操作

docker login docker.gitlab.demo.com

输入你的gitlab账号密码即可(非邮箱)即可。

docker tag zentao:latest docker.gitlab.demo.com/workerman/thinkphp:latest

为你的image打tag,workerman/thinkphp为gitlab的group/project

docker push docker.gitlab.demo.com/workerman/thinkphp:latest

推送成功,查看结果

优化

我们在push过程中发现,速度很慢,因为域名绑定的是公网ip,所以push实际占用的是公网带宽。
我的环境要推送的镜像和镜像仓库都是在同一台主机上,所以,我们需要在主机和docker上对docker.gitlab.demo.com本地做个解析,这样速度就快了。
主机设置和docker设置

cat /etc/hosts
127.0.0.1 docker.gitlab.demo.com

有点缺陷,如果容器gitlab重新生成了,还需要重新配置容器的/etc/hosts

我们查看gitlab容器内部nginx的conf反向代理到http://0.0.0.0:4567,因为我们主机端口4567,在docker run的时候已经和gitlab容器的4567端口做了映射,所以我们主机nginx可以不代理到容器内部的nginx,而是直接代理到http://0.0.0.0:4567。
接下来,将容器内部的nginx conf拷贝出来,和主机的nginx整合一下,得出新的主机conf:

server {
  listen *:443 ssl;
  server_name  docker.gitlab.demo.com;
  server_tokens off; ## Don't show the nginx version number, a security best practice

  client_max_body_size 0;
  chunked_transfer_encoding on;

  ssl on;
  ssl_certificate /etc/nginx/cert/docker.gitlab.demo.com.pem;
  ssl_certificate_key /etc/nginx/cert/docker.gitlab.demo.com.key;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
  ssl_prefer_server_ciphers on; #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
  ssl_session_cache  builtin:1000  shared:SSL:10m;
  ssl_session_timeout  5m;


  ## Real IP Module Config
  ## http://nginx.org/en/docs/http/ngx_http_realip_module.html

  access_log  /var/log/nginx/docker.gitlab.demo.com-access.log;
  error_log   /var/log/nginx/docker.gitlab.demo.com-error.log;

  location / {

    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Ssl on;

    proxy_read_timeout                  900;
    proxy_cache off;
    proxy_buffering off;
    proxy_request_buffering off;
    proxy_http_version 1.1;

    proxy_pass          http://0.0.0.0:4567;
  }
}

具体流程如下:

完结!