dockerコンテナごとにドメイン運用でしたい

2022年5月3日

dockerでコンテナごとにドメインを設定して運用したい

ドメインを割り振る為にサーバをもう一つ借りたりするのは苦しいのです。と言う事でコンテナにドメインを割り当てて運用しようと考えました。
私はさくらのVPSを使用しています。ホストOSへのドメインの設定が済んでいない方はこちらが参考になります。

参考:
  ・Dockerコンテナへのアクセスをドメインごとに変更する
  ・Nginxのリーバスプロキシ化
  ・Dockerのjwilder/nginx-proxyとは

今回コンテナにドメインを割り振ろうと...


docker run ...-e VIRTUAL_HOST=sample.com -p 8080:80 centos:7...

とコマンドを打ってコンテナを作成しましたがコンテナへのアクセスは...


http://sample.com:8080

という感じになってしまいます...

ポートを指定するのは嫌ですね。
解決方法を調べていたら見つかりました。

nginx-proxyの実行

まず nginx-proxy を起動します。これはDockerイメージで配布されています。


$ docker run -d -p 80:80 --name nginx -v /tmp/nginx:/etc/nginx/conf.d -t nginx

ホストの80番ポートへのアクセスをそのまま受け取る仕組みになっています。

docker-genのインストール

次に docker-gen をインストールします。これはDockerのコンテナ設定を生成するライブラリです。


mkdir -p /tmp/templates && cd /tmp/templates
curl -o nginx.tmpl https://raw.githubusercontent.com/jwilder/docker-gen/master/templates/nginx.tmpl
docker run -d --name nginx-gen --volumes-from nginx \
   -v /var/run/docker.sock:/tmp/docker.sock \
   -v /tmp/templates:/etc/docker-gen/templates \
   -t jwilder/docker-gen:0.3.4 -notify-sighup nginx -watch \
   --only-published /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf

docker-gen はDockerのソケットファイルを監視しており、起動するタイミングや逆にkillされるタイミングで設定を変更します。

コンテナを立ち上げる

コンテナを立ち上げます。


docker run -itd --privileged --name test -e VIRTUAL_HOST=sample.com -p 8080:80 centos:7 /sbin/init

これで「sample.com」とドメインだけ叩けばコンテナ内のページにアクセスできるようになります。
(※コンテナ内のWEBサーバを立ち上げてから)

エラー

プロキシ用のコンテナがポート80を使用するので下記のエラーが出る場合があります。


Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use
ERROR: Encountered errors while bringing up the project.

下記のコマンドで使用しているプロセスを確認してみて下さい。


lsof -i -P | grep "LISTEN"

apacheやnginxであれば下記のコマンドで停止するかポートを変更します。


sudo systemctl stop nginx

2022年5月3日