これまでDocker Composeで立ち上げるインスタンス全てのポートを公開できる設定にしていましたが、いくつかの問題点があるのでdockerネットワークを使い、既存の開放ポートを閉じることとします。
$ sudo docker ps -a aa4cacc1d506 wordpress:latest "docker-entrypoint.s…" 15 seconds ago Up 9 seconds 0.0.0.0:32704->80/tcp docker_wp04_1 #32704を公開している状態
$ cat docker-compose.yml ....中略.... wp04: image: wordpress:latest ports: - 32704:80 #32704番で公開
よって、Dockerで立ち上げているNGINXロードバランサーのコンフィグにはサーバーローカルIPアドレスを書いて以下のようにルーティングを行っていました。
upstream blog.com { server 192.168.2.132:32704; }
問題点
上記のコンフィグでも問題なく動作するのですが2つの問題点があります。
- 外部に公開される
- ローカルIPアドレス変更時に合わせて変更する必要がある
外部に公開される件ですが、もともと公開するものであれば問題ありません。しかしながら、現在の設定では同じくDockerから立ち上げているNGINXからルーティングされるので、wordpressそのものを外部に公開する必要はありません。
また、ローカルIPアドレスの変更についてですが、こちらの記事に書いたように、インスタンスの引っ越しを行った際に変更となるため、その度に全てのコンフィグファイルの修正を行わなくてはならなくなります。
対策
基本的にDocker内通信で完結するものは、外部に公開しない方針とします。
ネットワークの確認をします。
$ sudo docker network inspect docker_default [ { .......中略......... "Config": [ { "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" } .......中略......... "ConfigOnly": false, "Containers": { "6b3f70880bf41fb6a7942a71e8f6373197af3de37e5afb30b6db0a35c30687a9": { "Name": "docker_wp04_1", "EndpointID": "5f0c7ae78e28088770f457df8a64ac5104eac2cec4afb60ca100adb1cb394e0f", "MacAddress": "02:42:ac:12:00:07", "IPv4Address": "172.18.0.7/16", "IPv6Address": "" },
例えば docker_wp03_1というコンテナに対しては、172.18.0.7というアドレスが振られているのですが、このアドレスについて実は名前解決して通信することができます。ですので先ずは開放しているポートを閉じます。コメントアウトしてますが、削除しても構いません。
wp04: image: wordpress:latest #ports: #- 32704:80 #32704番で公開
そしてNGINXロードバランサーに記載するコンフィグは名前解決できるので以下となります。
upstream blog.com { server docker_wp04_1; }
この設定により外部公開せずにロードバランサーよりアクセスが可能となります。
$ sudo docker ps -a e75ee3e22115 wordpress:latest "docker-entrypoint.s…" 13 seconds ago Up 9 seconds 80/tcp docker_wp01_1 #Docker Network内部で80番で待ち受けている状態
以上によりセキュリティも向上しながら、インスタンスの引っ越しなどのローカルIPが変更するイベントにも簡単に耐えられる構成となります。