それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

LXC・LXD のコンテナのポートを外部に公開する docker expose的なやつ

lxc で外部にポートを公開する。

docker だと expose で手軽にできるんだけど、LXCだとiptables使えとか forwarding しろとかめんどくさいので、もっと簡単にポート転送できるものがないか調べた。

プロキシで飛ばせる

たとえば、nginx-container があって、ホスト側のIPを内部にそのまま出すには。

lxc config device add nginx-container my-https proxy  listen=tcp:192.168.12.10:443 connect=tcp:10.185.93.215:443 bind=host
lxc config device add nginx-container my-http proxy  listen=tcp:192.168.12.10:80 connect=tcp:10.185.93.215:80 bind=host

簡単な図解

クライアント 
 →Lxc ホスト 192.168.12.10:80 (転送
   → Lxcゲスト  10.185.93.215:80

追加するときは

lxc config device add $LXC_CONTAINER_NAME $PROXY_DEVICE_NAME proxy  \
   listen=tcp:$LXC_HOST_IP:$LXC_HOST_PORT \
   connect=tcp:$LXC_CONTAINER_IP:$LXC_CONTAINER_PORT bind=host

削除するときは

lxc config device remove $LXC_CONTAINER_NAME $PROXY_DEVICE_NAME

設定の確認

lxc config show nginx-container

これで設定されているプロキシ転送を確認することが出来る。もうすこし楽ちんでも良さそうなものだが。

lxc config proxy お手軽。

proxy で nginx のコンテナを作ってポート転送しておけば、LXCの内部側にいくらでもサービス用にコンテナを起動できて便利。

macvlan や bridge で共有してると、だんだんIPやポートが膨大になってきて頭がおかしくなりそうなので、nginx で一旦中継しちゃうのが便利。

nginx は、比較的なんでも転送できるので、sshpostfix などでも転送できるでちょっとしたルーター代わりにあげておくと便利。

一点だけ問題がある。

lxc のプロキシ設定は、プロキシ先を「IP」で指定しなくちゃいけない。lxc 自体が再起動して、IPが変わると動作しなくなることがあるので注意。

IPが不意に変わることが在り、大混乱を発生させるので、まじで注意。

参考資料

https://hnakamur.github.io/blog/2018/07/05/port-forwarding-using-lxd-proxy/

2020-12-30 更新

削除する方法も併せて書いた