EC2で稼働していたDockerのサブネットを後から変更したのでメモします。 大体はこちらのブログの通りです。感謝。
経緯
Apache Guacamoleという便利なソフトウェアをご存知でしょうか。簡単に言えば「RDPやVNCの集約ツール」です。WindowsやGUIを有効にしたLinuxなどへのログインを集約できます。
いずれEKSに載せようと思いつつも、適当に立てたEC2にdocker-composeでインストールした状態で便利に利用していたのですが、特定のサブネットのサーバにだけアクセスできない問題が発生していました。
- 同じサブネット = 同じRouteTable
- 同じSG
のEC2からは問題なく疎通ができていたので不思議に思ったのですが、基本に戻ってサーバのルーティングテーブルを確認したところ、Dockerが利用しているサーバ内部のネットワークと、接続できないサーバのネットワークアドレスが重複していました。
これを受けて、Dockerが使用するサブネットの変更を行うことにしました。
なおdocker-compose.ymlについてはGitHubでスターを集めていた以下を少し改変したものを利用しています。こちらも感謝。
手順
基本的な流れは以下の通りです。
- 稼働中のコンテナを停止
- 1で消えなかったネットワークがあれば
docer network rm
で削除 /etc/docker/daemon.json
を作成してdefault-address-pools
を指定- docker restart
- コンテナを起動
稼働中のコンテナを停止
まずは起動中のコンテナを停止します。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)
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"