Docker Compose例項之nginx反向代理GitLab

阿狸不歌發表於2019-01-30

在上一篇文章(Docker快速搭建GitLab私有倉庫)中探索瞭如何用docker實現最簡單的GitLab服務。但是現實場景中往往會遇到複雜的情況和需求,光用docker指令可能就比較繁瑣了。

舉個例子? 如下圖所示,在一個伺服器上要部署一個GitLab,N個其它服務(那N個服務或許還要與GitLab進行隔離),如果用docker 指令一個一個的run起來,管理起來可就麻煩了。 網路示意圖

當然docker作為流行工具,不會讓我們那麼累,我們藉助Docker Compose的檔案來描述這個多容器的配置,並通過一條命令就能啟動這些容器。

Docker Compose 的配置檔案 docker-compose.yml 如下:

version: '3.6'
services:
  gitlab: # gitlab服務名
    container_name: gitlab-site # gitlab 容器名
    image: gitlab/gitlab-ce:latest
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://gitlab.example.com'  # git域名
        unicorn['worker_timeout'] = 60
        unicorn['worker_processes'] = 2
        nginx['enable'] = true
        nginx['client_max_body_size'] = '250m'
        nginx['redirect_http_to_https'] = true
        nginx['ssl_certificate'] = "/etc/ssl/gitlab.example.com.crt" # 加密證書檔案
        nginx['ssl_certificate_key'] = "/etc/ssl/gitlab.example.com.key"
        nginx['ssl_ciphers'] = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
        nginx['ssl_prefer_server_ciphers'] = "on"
        nginx['ssl_protocols'] = "TLSv1.1 TLSv1.2"
        nginx['ssl_session_cache'] = "builtin:1000  shared:SSL:10m"
        nginx['listen_addresses'] = ["0.0.0.0"]
        nginx['http2_enabled'] = true
    volumes:
      - "/srv/gitlab/config:/etc/gitlab"         # 此處使用的是絕對路徑
      - "/srv/gitlab/logs:/var/log/gitlab"
      - "/srv/gitlab/data:/var/opt/gitlab"
      - "/srv/ssl:/etc/ssl"                         # 加密證書檔案路徑對映
    networks:
      - git-network  # 使用 git-network 網路,與 other-network 相隔離
other-app: # 用 nginx 模擬的其它服務
    container_name: other-app-nginx
    image: nginx:stable-alpine
    volumes:
      - "./nginx-conf-site:/etc/nginx/conf.d:ro"     # 此處使用的是相對路徑
      - "./contents:/usr/share/nginx/html/sites:ro" # 相對的是 docker-compose.yml 的位置
    networks:
      - other-network   # 使用 other-network 網路,與 git-network 相隔離
  nginx-reverse:  # nginx 反向代理服務
    container_name: nginx-reverse
    depends_on:    # 反向代理依賴的服務名
      - gitlab  
      - other-app
    image: nginx:stable-alpine
    ports:
      - "443:443"
      - "80:80"
    volumes:
      - "./nginx-conf-reverse:/etc/nginx/conf.d:ro"  # 此處使用的是相對路徑
      - "/srv/ssl:/etc/ssl:ro"   # 此處使用的是絕對爐具
    networks:  # nginx反向代理使用的網路
      - git-network     # gitlab使用的網路
      - other-network  # 其它app使用的網路
networks:  # 宣告網路
  git-network:  
  other-network:

nginx反向代理的配置檔案1: git-reverse.conf ,放在與docker-compose.yml 所在目錄相對的 nginx-conf-reverse 目錄下,作用是將對 https://gitlab.example.com 的訪問進行轉發

server{
    listen      443 ssl http2;    # 監聽 443 埠
    listen [::]:443 ssl http2;
    server_name gitlab.example.com;

    ssl_certificate        /etc/ssl/gitlab.example.com.crt;
    ssl_certificate_key    /etc/ssl/gitlab.example.com.key;
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;

    location / {
      proxy_pass https://gitlab-site;   # 轉發給名為 "gitlab-site" 的 容器
    }
}

nginx反向代理的配置檔案2: other-reverse.conf ,放在與docker-compose.yml 所在目錄相對的 nginx-conf-reverse 目錄下, 作用是將對 http://other.example.com 的訪問進行轉發

server{
    listen      80;   # 監聽 80 埠
    server_name other.example.com;  # 其它服務的域名
    location / {
      proxy_pass http://other-app-nginx;  # 轉發到"其它"服務
    }
}

本例中的“其它服務”由一個nginx靜態網站模擬,其配置檔案other-site.conf放在與docker-compose.yml 所在目錄相對的 nginx-conf-site 目錄下:

server {
    listen 80;
    server_name other.example.com;
    location / {
        root   /usr/share/nginx/html/sites/other-site;
        index  index.html;
    }
}

當然,上述配置中用 nginx 模擬的“其它服務” 可以是任意的網路服務,你不需要的話,把這部分刪掉也沒問題。

最後,執行一個指令

sudo docker-compose up -d

GitLab服務、其它服務、Nginx反向代理 就會依次啟動起來。


Docker經典例項封面

《Docker經典例項》這本書涉及了與Docker很多方方面面的例子,上面的 GitLab 的例子我也是參照此書裡的例子進行學習和實踐的,下一步準備好好學習一下里面的Kubernetes。

相關文章