自建基於Docker的GitLab


最開始代碼一直托管在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服務來自動更新容器鏡像


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM