自PCでは無く社内にあるサーバにDockerコンテナを多数起動してクライアントから直接コンテナにアクセスする方法(主に開発、社内サーバ用)。
dockerコンテナのポートを変えてdockerホストにマップしたり、dockerホストでproxyを建ててアクセスする方法はたくさん出てくるのですが、あまり出てこないので残しておきます。この方法のメリットは 用途別にホスト名が別けられることと、 http://servername:8080 のようにいちいちポート番号を考えなくても良いことです。
結論
- ルータでコンテナIPへstaticルートを切る
- dockerサーバでip4をforwardする
構成図
下記のようなネットワークだった場合の例。
-
社内ネットワーク(クライアント、ルータ、サーバ)
192.168.0.0/24 -
dockerコンテナ(サーバ内のdockerコンテナ)
172.21.0.0/24
設定
今回の例では、クライアントからnginxコンテナに直接アクセスします。DockerサーバはLinux。
dockerコンテナ
下記のようにブリッジのネットワークを作って、コンテナにIPをつける。
docker-compose.yml
version: '3.6'
networks:
share_nw:
driver: bridge
driver_opts:
com.docker.network.bridge.name: docker1
ipam:
driver: default
config:
- subnet: 172.21.0.0/24
services:
nginx:
image: nginx:latest
networks:
share_nw:
ipv4_address: 172.21.0.10
ルータ
説明書を見てルータのLAN側 静的ルーティングを設定する。
今回の例では、ネットワーク:172.21.0.0/24 → ゲートウェイ:サーバのIP(192.168.0.10)にする。
例)
https://www.asus.com/jp/support/FAQ/1011706/
Dockerサーバ
IPv4 フォワーディングを有効にする。
sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1
reboot
確認
クライアントPCから ping 172.21.0.10
とかしてみる。
ちょっと使いやすく
社内(簡易)DNSサーバを建てる
dnsmasqと言う簡易DNSサーバのコンテナを起動し、各コンテナのIPを名前解決できるようにし、クライアントのDNSはdnsmasqのIPにしておく(ルータのDHCPでDNSをdnsmasqのIPを配るように設定する)。
dnsmasqは下記のような設定をしておく。
nginx-server.example.local 172.21.0.10
dnsmasq (docker hub)
https://hub.docker.com/search?q=dnsmasq&type=image
web経由でコンテナを起動/停止
Portainerがまぁまぁ使いやすい。web経由でコンテナを起動/停止、imageのpullや操作なんかができます。