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でイメージが用意されていればマルチな環境で試すことができますよん。
ヾ(・д・。)マタネー♪