2017年1月4日追記
2016年12月から下記の内容がうまく動かない状態が起きておりましたが、letsencrypt-nginx-proxy-companionが2017年の年明け早々に修正されたので、現状は問題ない状態かと思います。
2016年2月にDocker + nginx-proxyでGitLab CI環境を作ってみる(1)というという投稿をしたのですが、その後に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という名前で以下のファイルを作成します。
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
作成した後に
$ docker-compose up -d
とすればコンテナが2個立ち上がります。確かめたければ以下のコマンドで確認してください。
$ 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という名前で以下のファイルを作成します。
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
作成した後に
$ docker-compose up -d
を叩けば今度は3つのコンテナが立ち上がります。あとは https://gitlab.example.com/ にアクセスすれば、GitLabの画面が表示されると思います。WEBブラウザのURI欄に鍵付きマークが出て、httpsでの接続になっていれば大成功です。sshのポートが10022になっているので、gitアカウントの.ssh/configの設定も忘れずに。
それにしてもSSL証明書が無料なんて良い時代ですね!