docker のコンテナに特定のアドレスのポートを紐づける備忘録です.
docker のコンテナとホストのポートを紐づける(ポートフォワードする)設定は色々なサイトに紹介してあるのですが,何故だかコンテナに特定のアドレスの特定のポートを紐づける設定はあまり見かけません.と言うことで,その方法の備忘録です.
いつもの通りズバリ結論は,
docker … -p ip_address:port(host):port(CONTAINER) …
で良さそうです.
いつ使うのか?
Linux の場合,以下のように簡単に複数の IP アドレスを一つの(物理)NIC に割り当てることができます(nmtui でやった方が簡単かもしれません).
$ nmcli device DEVICE TYPE STATE CONNECTION enp1s0 ethernet 接続済み enp1s0 lo loopback 管理無し -- # nmcli c m enp1s0 +ipv4.address 192.168.0.212/24 # nmcli c u enp1s0 接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/4) # ip a show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 94:c6:91:7b:6e:43 brd ff:ff:ff:ff:ff:ff inet 192.168.0.14/24 brd 192.168.100.255 scope global noprefixroute enp1s0 valid_lft forever preferred_lft forever inet 192.168.0.212/24 brd 192.168.100.255 scope global secondary noprefixroute enp1s0 valid_lft forever preferred_lft forever inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link noprefixroute valid_lft forever preferred_lft forever
こういうことする理由って,もちろん,同じポートを使う複数のサービスを一つの(物理)NICで提供したいっていう場合です.
上の例だと,例えば,
- 192.168.100.14:443 は portainer.io で利用する.
- 192.168.100.212:443 は apache で利用する.
としたい場合なんかでしょう.
もちろん,どちらも docker のコンテナが提供されていますので,docker run …. とやって簡単に済ませたい訳です.
実際やってみると,
$ docker run -d --name portainer -p 192.168.0.14:443:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer 19d07168491a3f9e2798a9bed96544e34d57ddc4757a4ac5bb199dea896c87fd $ docker run -d --name apache -p 192.168.0.212:443:80 httpd f1f38a39db81041921620048c7b6b4742b49066b22abb00ff82f594d8b9f1d0b $ curl http://192.168.0.212:443 <html><body><h1>It works!</h1></body></html>
の通り,きちんと期待通りの動きになっていることが分かります.
前回記事
docker のコンテナをホストと同じネットワークに所属させる備忘録
docker のコンテナをホストと同じネットワークに所属させる備忘録です. いつもの通り結論から言うと, macvlan を使う で良いみたいですね.ただし,いくつか注意しないといけないことがあるので,以下その辺りをつらつらと書きたいと思い...
の通り,macvlan を使う手もありますが,docker 的にはこちらの方が筋の良いやり方なんじゃないかなと思います.
以上!