📖

日々の記録 2025-02-01

2025/02/01に公開

日々の記録 2025-02-01

動機

WSL で動く Debian 上で動く Docker コンテナから、Windows で動くアプリに通信できていることを検証したい。
=> Windows 上で TCP listen するダミーのアプリが必要。
=> Python で適当に作ろう。
=> Python をインストールしよう。

Python のインストール

https://www.python.org/

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

で別ウィンドウが開く。

https://qiita.com/wagase/items/8db531eb58fed35dcbb8

Visual Studio Code に Python Extension をインストール

.py 開いたら、インストールする ? と聞いてきたので、何も考えずにインストール。

python で tcp port を listen するプログラムを書いてみる

ほとんど github copilot にまかせ

https://github.com/TakadaYouhei/sandbox/blob/8c5f40187ed23b3bfefa852a17deb4acc76859b1/python/listen_tcp_port.py

一度 connect されると終了してしまう。
connect した直後に send しないと receive に失敗して終了してしまう。 ※追記 : この認識は誤りと後で気づいた
とかつっこみどころが多いけど、docker コンテナから接続できたかどうかの確認はできそうだからひとまず OK 。

telnet が入っていなかったので 動作確認は下記コマンドで実施。

Test-NetConnection localhost -Port 12345

https://qiita.com/Yorcna/items/325f02f2cd416ea94234

windows の IP アドレスを調べてみる

ipconfig でいいのかな ?

ipconfig

いろいろ出てくる。PC は wifi に接続しているので、 Wireless LAN adapter Wi-Fi: の アドレスを見ればよいかな ?

リストを見ると イーサネット アダプター vEthernet (WSL (Hyper-V firewall)): という項目がある。これが WSL と通信するときの IP アドレスかな ?

WSL Debian の IP アドレスを調べてみる

https://blog.future.ad.jp/linux-ipアドレスの確認方法4選

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' から '' に変更して再度テスト

https://github.com/TakadaYouhei/sandbox/commit/bff316b631010a0cdf6b4e9ad61285ac53370b90

テスト用のサーバー起動

> 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 に対応できるようなので対応する。

https://zenn.dev/amenaruya/articles/ad9e45fdbe5e32

https://github.com/TakadaYouhei/sandbox/blob/1c5b4457e568033a93069d0233860c2f7ebe411a/python/listen_tcp_port.py

コンテナ内からのアクセスを確認

コンテナの中からも 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 を使うのが正解。

https://qiita.com/samunohito/items/019c1432161a950892be

ip route | grep 'default via' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

公式の方だとちょっと違う感じだった。結果は一緒。

https://learn.microsoft.com/ja-jp/windows/wsl/networking

ip route show | grep -i default | awk '{ print $3}'

zenn は絵文字が必要だった
=> 絵文字って windows で変換ではでてこないのか・・・
=> web で検索しよう

https://lets-emoji.com/emojilist/

https://qiita.com/Yarakashi_Kikohshi/items/e740d9a24f11caa76585

Zenn では prism.js を使っているらしい

https://prismjs.com/#features-full

次の日々の記録

https://zenn.dev/yohei_takada201/articles/diary_2025_02_02

Discussion