DockerもいいけどLXDもね 7 〜ネストさせてDockerコンテナを集約したい〜

4 min read

10年以上続くようなシステムのレガシー開発してると対向サーバが大量に出てきてとても煩雑になります。

httpするだけとかftpでファイル置くだけとか今どきrshとかtelnetとか。。。
しかもそれらのシステムがなんちゃって冗長化されててそっちが内部でやってくれればいいのに何故かこっちがそれぞれに同じアクセスして同期取らないとだめとか。。。。
。。。。てかそれ冗長化っていう?。。。。

そいつら全部が自分の所の管理してるシステムなら良いんですが大抵他社が作った内部が謎サーバなのですよね。
なので開発時にスタブとなるサーバを用意しないといけないんですがポンコツサーバにVMWareいれて大量に維持環境用のシステム載せてあるところにそれを用意したりします。

まぁそのスタブもポンコツサーバあるからそこに自分で作ってくれみたいな感じなんですが。

おかげで単にftpとかするだけでも滅茶苦茶重かったりするので使い物にならなくなってたりします。

私以外の人はそれ使ってるんで使えないことは無いんでしょうが

さらに宛先IPも実際のものとは変わるので設定ファイルを維持環境用に用意したりしかもその設定ファイルが外注A、外注B、外注Cとかで別フォーマットだったり。。。

とてもじゃないけど管理しきれないし案の定リリースで問題になってる人もよく見ます。
そこで私はローカルのLXD内にスタブのDockerコンテナを集約して実際のIPと同じIPを割り振って使うようにしてるのですがその環境を作るための備忘録です。

イメージはこんな感じ

Imgur
余談:VSCodeのdrawioプラグイン使って書いてみたけど便利だねこれ

スタブ用LXDコンテナを作成

lxc launch images:ubuntu/21.04 stub

Dockerを使えるように権限付与

lxc config set stub security.nesting=true security.privileged=true

DockerとDocker-composeをインストール

Docker-composeわからないって人でもとりあえずDocker使えてたらなんとかなると思います。
Dockerがーって人はLXD使ってる時点で居ない気が。。。🤔

lxc exec stub apt update
lxc exec stub -- apt install -y docker.io docker-compose wget w3m

スタブサーバ(サンプル)を作成

流石に実務で使ってるやつは使えないのでnginxで3台位のサンプル作りました

lxc shell stub
mkdir stub
cd stub
wget https://git.io/JOmLJ -q -O - | tee docker-compose.yml

wgetでdocker-compose.ymlを保存していますが内容がこれになります。

version: '2'

networks:
  network1:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    ipam:
      driver: default
      config:
        - subnet: 10.10.0.0/16
          gateway: 10.10.0.1

services:
  one:
    image: nginx
    networks:
      network1:
        ipv4_address: 10.10.10.10
  two:
    image: nginx
    networks:
      network1:
        ipv4_address: 10.10.10.11
  three:
    image: nginx
    networks:
      network1:
        ipv4_address: 10.10.10.12

要約すると
10.10.0.0/16のブリッジインターフェースを作ってそこに接続されたone,two,threeというnginxのコンテナを作成しますよというだけの設定ファイルです。

これで準備は出来ました

起動

docker-compose up -d

これで3台のnginxスタブサーバが起動しました。
docker-composeマンドで設定ファイル通りにnginxのコンテナを3つ立ち上げただけですね

LXD内での動作確認

デフォルトのnginxなのでhttpでアクセスできればOKです

root@stub:~/stub# w3m -dump 10.10.10.10 | head -n1
Welcome to nginx!
root@stub:~/stub# w3m -dump 10.10.10.11 | head -n1
Welcome to nginx!
root@stub:~/stub# w3m -dump 10.10.10.12 | head -n1
Welcome to nginx!

それぞれymlに設定したIPでちゃんとアクセス出来ました。

ホストOSでの動作確認

ここがポイントですホストOSから使えなきゃ意味ないです。

LXDコンテナ内のDockerネットワークにアクセスするには一旦LXDのeth0を経由する必要があるのでホストOS側にルーティングを追加する必要があります。

なのでとりあえずLXDのIPを確認しましょう

$ lxc list stub
+------+---------+-----------------------------+----------------------------------------------+-----------+-----------+
| NAME |  STATE  |            IPV4             |                     IPV6                     |   TYPE    | SNAPSHOTS |
+------+---------+-----------------------------+----------------------------------------------+-----------+-----------+
| stub | RUNNING | 172.17.0.1 (docker0)        | fd42:d878:2ae:7d9e:216:3eff:fec2:adaf (eth0) | CONTAINER | 0         |
|      |         | 10.116.214.243 (eth0)       |                                              |           |           |
|      |         | 10.10.0.1 (br-1a333990175d) |                                              |           |           |
+------+---------+-----------------------------+----------------------------------------------+-----------+-----------+

スタブに割り当てた10.10.xx.xxに到達するためには
10.116.214.243を経由する必要があるということですね
やってみましょう

$ sudo ip route add 10.10.0.0/16 via 10.116.214.243 dev lxdbr0
$ ip r|grep 10.10
10.10.0.0/16 via 10.116.214.243 dev lxdbr0 

消す時はsudo ip route del 10.10.0.0/16

はい、OKです以降の通信で10.10.x.xに関するパケットは10.116.214.243を経由するようになりました。

lxdbr0ってなんだよって思うかも知れませんがLXD入れた時に追加されるLXD用のブリッジインターフェース名ですもしこんなもん無いって言われたら初期設定で違う名前にしてる可能性があるのでip aとかで確認してみましょう。

ではホストOS側からアクセスできるか確認してみましょう

$ w3m -dump 10.10.10.10 | head -n1
Welcome to nginx!
$ w3m -dump 10.10.10.11 | head -n1
Welcome to nginx!
$ w3m -dump 10.10.10.12 | head -n1
Welcome to nginx!

3台ともアクセス可能になりました。
これでスタブサーバをLXD内に集約する事が出来るようになりましたー

本筋からずれるので説明しませんがスタブサーバをどう作るかについてはcompose関連のドキュメントを探して下さい。
かなり柔軟に色んな事が出来ますので簡単なスタブサーバ立てるならすぐ出来ますよー

それでは良いLinuxライフを!

しゃみしゃっきりー