もりはやメモφ(・ω・ )

インフラなエンジニアからSREへ

Dockerが利用するサブネットを変更する

EC2で稼働していたDockerのサブネットを後から変更したのでメモします。 大体はこちらのブログの通りです。感謝。

support.getjoan.com

経緯

Apache Guacamoleという便利なソフトウェアをご存知でしょうか。簡単に言えば「RDPやVNCの集約ツール」です。WindowsやGUIを有効にしたLinuxなどへのログインを集約できます。

guacamole.apache.org

いずれEKSに載せようと思いつつも、適当に立てたEC2にdocker-composeでインストールした状態で便利に利用していたのですが、特定のサブネットのサーバにだけアクセスできない問題が発生していました。

  • 同じサブネット = 同じRouteTable
  • 同じSG

のEC2からは問題なく疎通ができていたので不思議に思ったのですが、基本に戻ってサーバのルーティングテーブルを確認したところ、Dockerが利用しているサーバ内部のネットワークと、接続できないサーバのネットワークアドレスが重複していました。

これを受けて、Dockerが使用するサブネットの変更を行うことにしました。

なおdocker-compose.ymlについてはGitHubでスターを集めていた以下を少し改変したものを利用しています。こちらも感謝。

github.com

手順

基本的な流れは以下の通りです。

  1. 稼働中のコンテナを停止
  2. 1で消えなかったネットワークがあれば docer network rm で削除
  3. /etc/docker/daemon.json を作成して default-address-pools を指定
  4. docker restart
  5. コンテナを起動

稼働中のコンテナを停止

まずは起動中のコンテナを停止します。docker-composeを利用していたので、 docker-compose down でNetwork Interfaceも削除します。 もちろん停止前にアプリケーションについてはバックアップを行うべきです(今回はGuacamoleのPostgresは事前バックアップ済みでした)

$ cd <docker-compose ファイルのある場所>
$ docker-compose down

ログは以下のような形ででます。

[root@morihaya-101 guacamole]# docker-compose down
Stopping guacamole_guacamole_1 ... done
Stopping guacamole_postgres_1  ... done
Stopping guacamole_guacd_1     ... done
Removing guacamole_guacamole_1 ... done
Removing guacamole_postgres_1  ... done
Removing guacamole_guacd_1     ... done
Removing network guacamole_guacnetwork_compose

消えなかったネットワークがあれば docer network rm で削除

以下のコマンドで、Dockerのnetworkがきれいになったことを確認しましょう。 残っていた場合は docker network rm xxxx で削除します。

ip a
docker network ls

/etc/docker/daemon.json を作成して default-address-pools を指定

daemon.jsonを作成し、Dockerが利用するネットワークを指定します。既存システムが使わないものにしましょう。

vim /etc/docker/daemon.json

jsonの内容は以下です。IP部分はシステムによりますね。

{
 "default-address-pools":
 [
 {"base":"10.254.0.0/16","size":24}
 ]
}

docker restart

dockerを再起動します。

systemctl restart docker.service

コンテナを起動

コンテナを再起動します。

docker-compose up -d

これで無事に既存システムと重複しないサブネットでコンテナを起動することができ、疎通も行えました。

余談

Apache Guacamoleですが、リリース周期は1年ごとと勝手に思っていたところ、5ヶ月間で1.20をリリースしていたのに気付きました。

  • 0.914 (2018-01-18)
  • 1.00 (2019-01-08)
  • 1.10 (2020-01-29)
  • 1.20 (2020-06-28)

guacamole.apache.org

1.20の冒頭にはserverとclientにプロジェクトを分割したなどが書かれていて、開発に動きがあったようで今後も動きが活発になるのかもしれません。

Apache Guacamole is split into two subprojects: "guacamole-client", the HTML5 web application which serves the Guacamole client to users, and "guacamole-server"