Windows Subsystem for Linux(WSL2)とDockerをようやく自分のPCにインストールした。きっかけは以下の記事。
2020 年ではもう使えない Nodist はアンインストールする (Windows)
環境は以下。
- OS:Windows 10 バージョン20H2
- WSL2:Ubuntu 20.04.3
- Docker:バージョン20.10.12
WSL2でネットにつながらない
WSL2のインストールは公式サイトを見て、問題なくできた。
が、問題はここからで、WSL2でapt updateしようとすると、ネットに接続できずにエラーとなる。
調べたところ、pingは通るものの、curlが通らない。
「wsl2 インターネット 接続できない」で検索すると記事は出てくるものの、DNS等のネットワーク設定の記事ばかりで、今回の事象には該当しないようだ。
ちょっと色々調べてみて、原因が分かった。ウィルスソフトのファイアウォールでブロックされているようだ。
参考:WSL からインターネットにアクセスできないのはなぜですか。
プロキシ設定
ネットを調べてみると、Windowsホスト側のプロキシを介せば通信できる模様。
Windows側のプロキシはApacheでもNginxでもいい。(自分はGolangで簡単にプロキシサーバを実装できるライブラリがあるので、それで作った)
Windows側プロキシを起動したら、WSL2側で環境変数に設定すれば、インターネットに接続できるようになる。ただし、WSL2側では、Windows側で起動しているサーバへはlocalhostでは接続できず、「vEthernet(WSL)」ネットワークアダプターに割り当てられたIPアドレスで接続する必要がある。
(反対に、Windows側からWSL2で起動しているサーバへはlocalhostでアクセスできる。参考:Linuxがほぼそのまま動くようになった「WSL2」のネットワーク機能)
Windowsのコマンドプロンプトで「vEthernet(WSL)」のIPを調べる。
> ipconfig
...
イーサネット アダプター vEthernet (WSL):
接続固有の DNS サフィックス . . . . .:
IPv4 アドレス . . . . . . . . . . . .: 172.17.96.1
サブネット マスク . . . . . . . . . .: 255.255.240.0
デフォルト ゲートウェイ . . . . . . .:
...
WSL2側では、上記のIPを基に環境変数を設定。
$ export http_proxy=http://172.17.96.1:9999
$ export https_proxy=${http_proxy}
ターミナルを起動する度に上記を設定するのがめんどくさければ、.profileに以下を追加する。(参考:WSL環境から(Symantec Endpoint Protectionが邪魔して) apt update できない場合の対処法)
if [ -z "$http_proxy" ]; then
export http_proxy=http://$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):9999
export https_proxy=${http_proxy}
export HTTP_PROXY=${http_proxy}
export HTTP_PROXY=${https_proxy}
fi
上記設定後、WSL2からネットに繋がるようになった。
Dockerインストール
公式サイトを見ながら、粛々と。
# Set up the repository
$ sudo apt-get update
$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Install Docker Engine
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io
# Install Docker Compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
Dockerを起動して、hello-world イメージを起動 ⇒ エラー。
$ sudo service docker start
$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 52.72.232.213:443: i/o timeout.
ネットにつながらず、イメージが取得できない。ここでもプロキシ設定の問題が。
プロキシ設定(Docker)
「/etc/default/docker」にプロキシ設定を追加する(プロキシが 172.17.96.1:9999 の場合)。
export http_proxy="http://172.17.96.1:9999"
export https_proxy="http://172.17.96.1:9999"
docker daemonを再起動して、hello-world イメージを起動できることを確認。⇒ できた。
ただし、上記の設定だと、「vEthernet(WSL)」ネットワークアダプターに割り当てられたIPアドレスが変わった場合は変更しなければならない。対処方法は未定。。
その他
WSL2にログインするデフォルトユーザを変更したいとき
WSL2側でユーザ追加。
sudo adduser hoge
Windows側でデフォルトユーザを変更。
ubuntu config --default-user hoge
Windows Terminalから開いたときのホームディレクトリを変更したいとき
Windows Terminalから設定を表示する。
左メニューからWSL2のディストリビューション名を選択し、開始ディレクトリを変更する。
sshのプロキシ設定
WSL2からsshで外部のサーバへアクセスしたい場合、sshコマンドでプロキシを指定してアクセスする(下記はプロキシが 172.17.96.1:9999 の場合)。
ssh -o ProxyCommand='nc -X connect -x 172.17.96.1:9999 %h %p' <ユーザー>@<接続先IP>
gitでssh接続する場合などは、.ssh/config でプロキシ設定する。
Host git-codecommit.*.amazonaws.com
User XXXXXXXX
IdentityFile ~/.ssh/codecommit_rsa
ProxyCommand nc -X connect -x 172.17.96.1:9999 %h %p
以上です。