dockerでマルチなWeb環境を整えるのに便利なnginx-proxyの覚え書き

docker便利です。いろんなイメージが用意されていて、慣れてしまえば導入までにかかる時間を大幅に短縮することができます。
ただ、ひとつのサーバでマルチな環境を作ろうと思うと大変だったりもします。

そんな時に便利なコンテナnginx-proxyの使い方の覚え書きを残しておくことにします。(自分用)
Let’sEncryptにも対応させていく所存

 

dockerの準備

まずはdockerを使えるようにしましょう。ここではCentOS7で考えていきます。

 

docker-engine のインストール

こんな時は公式ドキュメントを見れば一発です。他の環境の場合も載っているのでそっちも参考に。
Docker公式ドキュメント(CentOSでのインストール)

 

docker-compose のインストール

ソフトウェアごとにコンテナ群を管理するのが大変なので、ソフトウェアごとに一括で管理できるようにdocker-composeも入れておきましょ
例のごとく公式ドキュメントを見れば確実。
Docker公式ドキュメント(Docker-Composeインストール)

 

nginx-proxyコンテナの起動(ついでにLet’sEncrypt対応)

nginx-proxyコンテナを起動します。このコンテナはNginxでプロキシサーバとして機能し、マルチサイトの環境の各コンテナにアクセスを振り分けてくれる賢いコンテナです。
しかもサイトは振り分け先のコンテナを環境変数をつけて起動すれば自動で追加してくれるというすぐれもの。

今回は、無料SSLの対応までしちゃいます。これで、個人的に使いたいJenkinsやRedmineなどのソフトを簡単にSSLで導入できるんですよ。
というわけで、docker-composeのファイル。docker-compose.ymlとして保存ね。

nginx-proxy:
  image: jwilder/nginx-proxy
  ports: 
    - "80:80"
    - "443:443"
  environment:
    DEFAULT_HOST: hogehoge.com
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - /var/www/certs:/etc/nginx/certs
    - /var/www/htpasswd:/etc/nginx/htpasswd
  restart: always

letsencrypt:  
  image: jrcs/letsencrypt-nginx-proxy-companion
  volumes:
    - /var/www/certs:/etc/nginx/certs:rw
    - /var/run/docker.sock:/var/run/docker.sock:ro
  volumes_from:
    - nginx-proxy
  restart: always

詳しい情報はGithubを見に行くといいんですが、簡単に解説しときます。
nginx-proxyのGithub

 

DEFAULT_HOST(デフォルトのホスト)

Nginxで利用するデフォルトのホストネームが設定できます。

server {
    listen       80  default_server;
    server_name  hogehoge.com;
}

このように設定されるわけですね。ちなみにこれは設定しなくても問題ありません。

 

volumesのcerts部分

nginx-proxyコンテナ内の/etc/nginx/certsにSSL証明書を規定の形で入れておけばSSL対応してくれます。
規定の形はnginxの設定項目に合わせると、

ssl_certificate     hogehoge.com.crt;
ssl_certificate_key hogehoge.com.key;
ssl_dhparam         hogehoge.com.dhparam.pem

こんな感じです。
コンテナとホストを/var/www/certs:/etc/nginx/certsこんな感じで同期させておけば、ホスト側の/var/www/certsにこの命名規則で証明書を入れれば認識してくれるようになります。

今回の場合、この部分もletsencrypt-nginx-proxy-companionのコンテナで自動配置してくれるため、特に何も考えずに追加していけばOKです。
もちろんこの状態でも手動追加は可能です。

 

volumesのhtpasswd部分

BASIC認証を利用したい場合に使います。/var/www/htpasswd:/etc/nginx/htpasswdこのようにホスト側の/var/www/htpasswdと同期させてあるので、ドメイン名でhtpasswdのファイルを作っておけばそのドメインへのアクセスが、BASIC認証になります。

 

マルチサイト側の設定(GitBucket)

例としてGitBucketを入れてみましょ。GitBucket用のdocker-compose.ymlです。

gitbucket:
  image: takezoe/gitbucket
  ports:
    - "8080:8080"
  environment:
    VIRTUAL_HOST: git.hogehoge.com
    VIRTUAL_PORT: 8080
    LETSENCRYPT_HOST: git.hogehoge.com
    LETSENCRYPT_EMAIL: admin@hogehoge.com
  volumes:
    - /var/www/gitbucket-data:/gitbucket
  restart: always

これをdocker-compose up -dで起動してちょっと待てば、自前のGitBucket環境の構築完了です。

 

VIRTUAL_HOST と VIRTUAL_PORT

VIRTUAL_HOSTは利用したいホスト名です。DNSの設定を忘れずに。
VIRTUAL_PORTはこのコンテナで使うポートです。80番で動きますが、プロキシ下なので8080を設定しています。

 

LETSENCRYPT_HOST と LETSENCRYPT_EMAIL

LETSENCRYPT_HOSTはLet’sEncryptでSSL証明書を取得したいホスト名です。VIRTUAL_HOSTと揃えておく必要があります。
LETSENCRYPT_EMAILはLet’sEncryptでSSL証明書を取得する際に設定する、管理者用のメールアドレスです。

 

まとめ

これと同じように他のサービスも追加できます。jenkinsやOwncloud、Redmineなど様々なソフトを1つのサーバ内で動かすことができます。
今回紹介したようにデータのやり取りが暗号化されるようにSSL化することも可能なので、いろんなケースに利用することができると思います。

また、WordPressやconcrete5などの利用でも同様にSSLに対応したWebサイトにすることもできます。Dockerなので、環境を選ばずクラウド・VPSや物理サーバでも同じことができるのでこれに慣れておくといろいろと楽ができるかもしれません。

Dockerでイメージが用意されていればマルチな環境で試すことができますよん。

ヾ(・д・。)マタネー♪