docker のコンテナに特定のアドレスのポートを紐づける備忘録

Networks
Photo by hyt.

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 的にはこちらの方が筋の良いやり方なんじゃないかなと思います.

以上!

NetworksServer
スポンサーリンク
Following hyt!
タイトルとURLをコピーしました