開発マシン上WSL2/Alpine/docker-composeでkafkaを動かそうとしたら手間取ったので、備忘録。
- WSL2で動かすLinuxのIPアドレスはホストWindowsによってプライベートアドレスを与えられ、Windows起動の度に変わる(おそらくセキュリティ向上のため)
- DHCPはLinux起動時にWSL2で特別な処理が行われているようで、/etc/network/interfaceに記載してもおそらく無視される
- /etc/network/interfaceに書かれた内容はLinux起動後ifdown/ifupコマンドでstaticは反映されるが、DHCPはサーバーが見つからない理由でエラーになる
- 上記DHCPが失敗した状態では、WSL2ホストマシン外と通信できない(Hyper-Vの仮想スイッチ設定をいじればできる?)
- 一方dockerコンテナ上のkafkaは、ADVERTISED_HOST設定のため毎回変わるアドレスでは運用しづらい
- 192.168.99.1: WSL2ホスト側のアドレス(=Windows)
- 192.168.99.100: Windowsから見たLinux側のアドレス
Windows側
仮想スイッチ'vEthernet (WSL)'はWSL2起動時に作成されるようなので、先にLinuxディストリビューションを起動しておく。このスイッチにホストWindowsのアドレスを追加。要管理者権限。Windows再起動ごとに行う。netsh interface ip add address "vEthernet (WSL)" 192.168.99.1 255.255.255.0
Linux側(dockerホスト on WSL2)
Linuxに固定アドレスを与える。要root。こちらもLinux起動ごとに必要。ip addr add 192.168.99.100/24 dev eth0
Linux側(docker-compose)
wurstmeister/kafka-docker を使用。docker-compose.yml変更点は- kafkaのportsを9092:9092に
- KAFKA_ADVERTISED_HOST_NAMEを書き換え
docker-compose後はホストWindowsからはbootstrap-server=192.168.99.100:9092でkafkaにアクセス可能。
version: '2' services: zookeeper: image: wurstmeister/zookeeper ports: - "2181:2181" restart: unless-stopped kafka: build: . ports: - "9092:9092" environment: DOCKER_API_VERSION: 1.22 KAFKA_ADVERTISED_HOST_NAME: 192.168.99.100 KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 volumes: - /var/run/docker.sock:/var/run/docker.sock restart: unless-stopped
[参考]
Comments