设为首页 收藏本站
查看: 982|回复: 0

[经验分享] 自建基于Docker的GitLab

[复制链接]
发表于 2018-1-10 23:42:42 | 显示全部楼层 |阅读模式
  最开始代码一直托管在GitHub上,之后为了CI(主要是自动化生成和测试),将代码迁移到了VSTS上,然而最近因为在写一些类库,想要自动发布nuget包到myget上,却发现免费版的VSTS的CD支持非常不完善几乎没有,文档又比较混乱,再加上电信连接外网实在是太慢太慢,所以决定尝试自建GitLab来托管自己的项目代码。
  官网上提供了各个OS环境的安装文档,为了便于编排、管理,我选择将其托管在Docker上。
  如果没有安装Docker,可以直接使用下面命令一键安装
  

curl -fsSL get.docker.com -o get-docker.sh  
sh get-docker.sh
  

使用docker compose部署gitlab服务

  Docker Compose是一个用来定义和运行复杂应用的Docker工具。使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作。

  docker-compose.yml:
version: '3'  

  
services:
  gitlab:
  image: gitlab/gitlab-ce
  container_name: "gitlab"
  restart: always
  ports:
  - "80:80"
  - "443:443"
  - "10022:22"
  environment:
  GITLAB_OMNIBUS_CONFIG: |
  external_url 'http://gitlab.csys.me'
  gitlab_rails['gitlab_shell_ssh_port'] = 10022
  volumes:
  - '/srv/gitlab/config:/etc/gitlab'
  - '/srv/gitlab/logs:/var/log/gitlab'
  - '/srv/gitlab/data:/var/opt/gitlab'
  
networks:
  default:
  driver: bridge
  在上面的yml中:


  • image指定了使用gitlab-ce版本
  • container_name指定运行的容器名,指定以后比较方便操作
  • ports指定了需要暴露的端口,其中80和443为http/https端口,10022:22是ssh端口,由于22端口被主机的sshd所占用,所以要另外指定一个端口用来和容器内的ssh通信,值得注意的是,docker会自动配置iptables,添加暴露的端口到入站规则,添加dockerfile中指定的entrypoint端口到NAT转发规则中,也就是说不必再额外配置iptables,方便了我这种每次配置iptables都要现查命令和规则的人
  • environment指定环境变量,其中GITLAB_OMNIBUS_CONFIG是gitlab的安装配置,安装脚本会读取其值来进行安装前的配置。官方文档中有各配置项的用途和用法。
  • volumes指定了数据卷的配置,没有具体研究过各volumes的作用,只是从字面上猜测是持久化保存配置、日志、(未知)数据,防止重建容器后丢失这些数据
  在docker-compose.yml的路径下执行docker-compose.yml up -d,就会自动安装、运行Gitlab服务,通过 http://$hostIP测试是否正常运行

使用外部数据库和Redis
  gitlab镜像中捆绑了postgresql和redis,但是如果服务器中本就有postgres和redis服务,就可以使用外部服务来共用数据库和redis

PostgreSQL(pgsql)
  目前CE版本只支持使用pgsql,只需要在之前的docker-compose.yml文件中添加pgsql的服务定义就可以。
  docker-compose.yml:
postgres:  restart: always
  image: postgres:latest
  container_name: "postgres"
  environment:
  - POSTGRES_PASSWORD=csysme
  volumes:
  - /data/postgres:/var/lib/postgresql/data
  pgsql的容器配置可以去看官方文档
  然后配置gitlab服务使其引用外部pgsql
  
docker-compose.yml:
gitlab:  environment:
  GITLAB_OMNIBUS_CONFIG: |
  postgresql['enable'] = false
  gitlab_rails['db_adapter'] = 'postgresql'
  gitlab_rails['db_encoding'] = 'utf8'
  gitlab_rails['db_host'] = 'postgres'
  gitlab_rails['db_port'] = '5432'
  gitlab_rails['db_username'] = 'postgres'
  gitlab_rails['db_password'] = 'csysme'

Redis
  同理,配置redis服务
  docker-compose.yml:
redis:  restart: always
  image: redis:latest
  container_name: "redis"
  官方文档
  配置gitlab服务使其引用外部redis
  
docker-compose.yml:
gitlab:  environment:
  GITLAB_OMNIBUS_CONFIG: |
  redis['enable'] = false
  gitlab_rails['redis_host'] = 'redis'
  gitlab_rails['redis_port'] = 6379

使用外部NginX
  gitlab镜像内同样捆绑了nginx,但是由于gitlab的nginx配置需要passenger module,而nginx只能在编译时才能指定添加module,所以选择不停用容器内部的nginx,而选择用外部的nginx做二次转发
  首先添加nginx服务的定义
  
docker-compose.yml:
proxy:  restart: always
  build: nginx/
  image: nginx-proxy
  container_name: "nginx"
  ports:
  - "80:80"
  nginx服务没有进行ssl的支持,ssl方面有空会单独发一篇来写
  nginx服务没有选择直接使用官方镜像,而是生成自定义镜像
  dockerfile:
FROM nginx:alpine  

  
RUN rm -v /etc/nginx/conf.d/*
  
COPY config/well-known.conf /etc/nginx/conf.d/well-known.conf
  
COPY config/gitlab.conf /etc/nginx/conf.d/gitlab.conf
  dockerfile中使用COPY命令将本地的站点配置添加到容器中
  gitlab.conf:
  

upstream gitlab {  server gitlab:80;
  
}
  

  
server {
  listen 80;
  server_name  gitlab.csys.me;
  

  location / {
  proxy_http_version 1.1;
  proxy_set_header Connection "";
  proxy_pass http://gitlab/;
  }
  
}
  

  由于使用了nginx服务做转发,gitlab服务的80端口就不必再暴露了,所以去掉gitlab服务中的80端口配置
  docker-compose.yml:
    gitlab:  ports:
  - "10022:22"
  只留下了ssh端口10022
  
通过docker ps命令可以查看指定的端口和外部映射的端口

TIPS
  至此gitlab服务应该正常运行,下面是一些tips


  • docker会默认添加DNS解析来发现服务地址,所以可以直接将所引用的服务的hostname配置为服务名,额外的手段还有指定links或hosts
  • 如果gitlab所依赖的服务如redis,pgsql,nginx等没有在docker-compose.yml中定义,可以使用external_links来指定引用外部容器
  • 在使用外部pgsql时,gitlab容器启动后自动安装时,可能会出现ActiveRecord::NoDatabaseError (FATAL:  database "gitlabhq_production" does not exist错误,手动创建数据库即可
  • 可选添加portainer服务来进行可视化管理docker,和watchtower服务来自动更新容器镜像

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-433726-1-1.html 上篇帖子: gitlab重置password 下篇帖子: ubuntu16 gitlab的简单安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表