Docker + nginx-proxy でGitLab環境(Let's Encrypt付き)を構築する

#### 2017年1月4日追記

2016年12月から下記の内容がうまく動かない状態が起きておりましたが、letsencrypt-nginx-proxy-companionが2017年の年明け早々に修正されたので、現状は問題ない状態かと思います。

---

2016年2月に[Docker + nginx-proxyでGitLab CI環境を作ってみる（1）](http://qiita.com/ABE_TAKASHI/items/5e106b8010037eaa4c97)というという投稿をしたのですが、その後にGitLabなどバージョンアップが続いたり、後に自分で色々気づいたこともあったりで新しく投稿します。

2月の投稿と違うところとして、

- nginxコンテナとdocker-genコンテナを別々に立てていたのを、nginx-proxyコンテナ一つにまとめる

- Let's Encryptを利用して、httpsに対応する

- その他、GitLab周りで細かい設定の追加

となります。前回の説明から変わった部分だけのおおざっぱな説明となります。DockerやGitLabそのものの説明は省略させていただきます。

# nginx-proxy + letsencrypt-nginx-proxy-companion コンテナをDocker composeで一気に立てる

2月の投稿では ドメインによるアクセス先コンテナの分岐処理を実現するためのリバースプロキシを nginx と docker-gen の2つを別々に立ててましたが、nginx-proxy というのがどうやらそれをまとめたものらしいです。2月投稿時にもすでに存在していたのですが、細かい設定をやろうとすると上手く動かなかったため、その時は別々に立ててました。

今回は細かい設定をせずにざっくりとやるため、nginx-proxyで一気に行きます。その代わり、無料でSSL証明書を発行してくれるサービスのLet's Encryptの手続きを自動でやってくれるletsencrypt-nginx-proxy-companionというコンテナを一緒に構築します。複数のコンテナを同時に扱えるdocker-composeを使用します。任意のディレクトリにdocker-compse.ymlという名前で以下のファイルを作成します。

```yml:docker-compose.yml
nginx-proxy:
  image: jwilder/nginx-proxy
  container_name: nginx-proxy
  privileged: true
  ports:
    - 80:80
    - 443:443
  volumes:
    - ./docker-compose.d/certs:/etc/nginx/certs:ro
    - ./docker-compose.d/htpasswd:/etc/nginx/htpasswd
    - /etc/nginx/vhost.d
    - /usr/share/nginx/html
    - /var/run/docker.sock:/tmp/docker.sock:ro
  restart: always

letsencrypt-nginx:
  image: jrcs/letsencrypt-nginx-proxy-companion
  container_name: letsencrypt-nginx
  privileged: true
  volumes:
    - ./docker-compose.d/certs:/etc/nginx/certs:rw
    - /var/run/docker.sock:/var/run/docker.sock:ro
  volumes_from:
    - nginx-proxy
  restart: always
```

作成した後に

```bash
$ docker-compose up -d
```

とすればコンテナが2個立ち上がります。確かめたければ以下のコマンドで確認してください。

```bash
$ docker ps -a
```

# GitLabのコンテナを立てる

nginx-proxy と letsencrypt-nginx-proxy-companion が無事稼働していることを確認したら、次に GitLab を立てます。ここでは

- gitlab-ce（GitLab本体）
- gitlab-runner（GitLab CIを動かすためのコンテナ）
- busybox（データ格納コンテナ）

の3つのコンテナをdocker-composeを使用して一気に立てます。「gitlab.example.com」「gitlab-user@example.com」「googleUSER」「googlePASSWD」という表記はご自分の環境に置き換えて読んでください。smtp関連もご自分で使っているメールサーバを使用してください。「gitlab.example.com」というURLでアクセスできるように、DNSのAレコードの向き先を登録することを忘れずに。

先ほどとは違う任意のディレクトリにdocker-compse.ymlという名前で以下のファイルを作成します。

```yml:docker-compose.yml
gitlab:
  image: gitlab/gitlab-ce:8.12.4-ce.0
  container_name : gitlab-httpd
  hostname: gitlab.example.com
  environment:
    VIRTUAL_HOST: gitlab.example.com
    VIRTUAL_PORT: 80
    LETSENCRYPT_HOST: gitlab.example.com
    LETSENCRYPT_EMAIL: gitlab-user@example.com
    LETSENCRYPT_TEST: "false"
    GITLAB_OMNIBUS_CONFIG: |
      external_url = 'https://gitlab.example.com/'
      gitlab_rails['time_zone'] = 'Asia/Tokyo'
      gitlab_rails['gitlab_email_enabled'] = true
      gitlab_rails['gitlab_email_from'] = 'gitlab_user@example.com'
      gitlab_rails['gitlab_email_reply_to'] = 'gitlab_user@example.com'
      gitlab_rails['smtp_enable'] = true
      gitlab_rails['smtp_address'] = "smtp.gmail.com"
      gitlab_rails['smtp_port'] = 587
      gitlab_rails['smtp_user_name'] = "googleUSER"
      gitlab_rails['smtp_password'] = "googlePASSWD"
      gitlab_rails['smtp_domain'] = "smtp.gmail.com"
      gitlab_rails['smtp_authentication'] = "login"
      gitlab_rails['smtp_enable_starttls_auto'] = true
      gitlab_rails['smtp_tls'] = false
      gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
      gitlab_rails['backup_keep_time'] = '600'
      gitlab_workhorse['enable'] = true
      gitlab_workhorse['listen_network'] = "tcp"
      gitlab_workhorse['listen_addr'] = "127.0.0.1:8181"
  volumes:
    - /etc/localtime:/etc/localtime:ro
  volumes_from:
    - data
  ports:
    - "80"
    - "10022:22"
  restart: always
gitlab-runner:
  image: gitlab/gitlab-runner:latest
  container_name : gitlab-runner
  volumes_from:
    - data
  volumes:
    - /var/run/docker.sock:/var/run/docker.sock
  restart: always
data:
  image: busybox
  container_name: gitlab-data
  volumes:
    - /var/log/gitlab
    - /var/opt/gitlab
    - /etc/gitlab
    - /etc/gitlab-runner
```

作成した後に

```bash
$ docker-compose up -d
```

を叩けば今度は3つのコンテナが立ち上がります。あとは https://gitlab.example.com/ にアクセスすれば、GitLabの画面が表示されると思います。WEBブラウザのURI欄に鍵付きマークが出て、httpsでの接続になっていれば大成功です。sshのポートが10022になっているので、gitアカウントの.ssh/configの設定も忘れずに。

それにしてもSSL証明書が無料なんて良い時代ですね！