日々の記録 2025-02-01
日々の記録 2025-02-01
動機
WSL で動く Debian 上で動く Docker コンテナから、Windows で動くアプリに通信できていることを検証したい。
=> Windows 上で TCP listen するダミーのアプリが必要。
=> Python で適当に作ろう。
=> Python をインストールしよう。
Python のインストール
Downloads から Python 3.13.1 をダウンロード
インストーラー起動
Add python.exe to PATH にチェック
Install Now を選択
=> AppData\Local\Programs\Python313 にインストールされる
Disable path length limit を実行
<= パス長いからライブラリとかインストールしたときに問題になるかも
Close
Python の動作確認
powershell 起動してバージョン確認。
windows の python は python ではなくて py だった
> python --version
Python
> python -v
Python
> python3 --version
Python
> py --version
Python 3.13.1
記事を書きながらコードも書きたい
Visual Studio Code を利用しているが普通に使っているとアプリは 1 つしか起動しない。
CTRL + SHIFT + n
で別ウィンドウが開く。
Visual Studio Code に Python Extension をインストール
.py 開いたら、インストールする ? と聞いてきたので、何も考えずにインストール。
python で tcp port を listen するプログラムを書いてみる
ほとんど github copilot にまかせ
一度 connect されると終了してしまう。
connect した直後に send しないと receive に失敗して終了してしまう。 ※追記 : この認識は誤りと後で気づいた
とかつっこみどころが多いけど、docker コンテナから接続できたかどうかの確認はできそうだからひとまず OK 。
telnet が入っていなかったので 動作確認は下記コマンドで実施。
Test-NetConnection localhost -Port 12345
windows の IP アドレスを調べてみる
ipconfig でいいのかな ?
ipconfig
いろいろ出てくる。PC は wifi に接続しているので、 Wireless LAN adapter Wi-Fi: の アドレスを見ればよいかな ?
リストを見ると イーサネット アダプター vEthernet (WSL (Hyper-V firewall)): という項目がある。これが WSL と通信するときの IP アドレスかな ?
WSL Debian の IP アドレスを調べてみる
debian に標準で入っているのは ip と hostname のみの模様。
$ ifconfig
-bash: ifconfig: command not found
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 172.27.122.173/20 brd 172.27.127.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 xxxx::xxxx:xxxx:xxxx:9864/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
4: br-c85d05cfb2a2: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
inet 172.18.0.1/16 brd 172.18.255.255 scope global br-c85d05cfb2a2
valid_lft forever preferred_lft forever
$ hostname -I
172.27.122.173 172.17.0.1 172.18.0.1
$ hostname -i
127.0.1.1
$ nmcli show device
-bash: nmcli: command not found
多分仮想ネットワークのせいでぱっと見では全然わからない・・
WSL から接続テスト
telnet が入っていないからインストール
# @ WSL Debian
sudo apt update
sudo apt upgrade
sudo apt install telnet
powershell で検証用のサーバープログラム実行
# @ powershell
py .\listen_tcp_port.py 12345
いろいろ接続を試みてみる
# @ WSL Debian
$ # これはダメ
$ telnet localhost 12345
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
$ # wireless LAN Adapter の IP アドレス
$ # 処理がかえって来なかったので CTRL + c で中断
$ telnet 192.168.10.195 12345
Trying 192.168.10.195...
^C
$ # WSL Ethernet の IP アドレス
$ # 処理がかえって来なかったので CTRL + c で中断
$ telnet 172.27.112.1 12345
Trying 172.27.112.1...
^C
> # powershell からは OK
> Test-NetConnection localhost -Port 12345
警告: TCP connect to (::1 : 12345) failed
ComputerName : localhost
RemoteAddress : 127.0.0.1
RemotePort : 12345
InterfaceAlias : Loopback Pseudo-Interface 1
SourceAddress : 127.0.0.1
TcpTestSucceeded : True
python の方 bind するときの hostname が localhost なのがいけないのか ?
hostname を 'localhost' から '' に変更して再度テスト
テスト用のサーバー起動
> py .\listen_tcp_port.py 12345
実行後、ネットワークのアクセスを許可しますか ? の質問がでたので はい を選択。
wifi 側の IP アドレス入力で問題なく接続できた
$ # @ WSL Debian
$ # Telnet 接続後下記入力
$ # hello
$ # CTRL + ]
$ # close
$ telnet 192.168.10.195 12345
Trying 192.168.10.195...
Connected to 192.168.10.195.
Escape character is '^]'.
hello
^]
telnet> close
Connection closed.
WSL 側の IP アドレスでも問題なかった
$ # @ WSL Debian
$ telnet 172.27.112.1 12345
Trying 172.27.112.1...
Connected to 172.27.112.1.
Escape character is '^]'.
hello
^]
telnet> close
Connection closed.
Python の socket テスト用のサーバーが ctrl + c で中断できない
どうやら windows のバグらしい。
thread 化することで ctrl + c に対応できるようなので対応する。
コンテナ内からのアクセスを確認
コンテナの中からも wsl 上と同じように ip アドレス指定でホストの windows で動くプログラムに connect できる。
$ # @ WSL 上
$ docker run -it --rm debian /usr/bin/bash
$ # @ WSL 上で動く debian コンテナ上
$ apt update
$ apt install -y telnet
# power shell 上で py .\listen_tcp_port.py 12345 実行してから
$ telnet 192.168.10.195 12345
# ctrl + ]
# close
# power shell 上で py .\listen_tcp_port.py 12345 実行してから
$ telnet 172.27.112.1 12345
# ctrl + ]
# close
windows ホストの IP アドレスはどう調べたらよい ?
/etc/resolv.conf に書かれている nameserver の IP アドレス。と書いてある記事があったが、ここの IP アドレスは違うっぽい。
ip route を使うのが正解。
ip route | grep 'default via' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'
公式の方だとちょっと違う感じだった。結果は一緒。
ip route show | grep -i default | awk '{ print $3}'
他
zenn は絵文字が必要だった
=> 絵文字って windows で変換ではでてこないのか・・・
=> web で検索しよう
Zenn では prism.js を使っているらしい
次の日々の記録
Discussion