# Docker Desktop使わないDocker環境構築(Docker Desktop有料化対策 windows)
Docker Desktop使わないDocker環境構築(Docker Desktop有料化対策 windows)
こちらの記事を参考にすすめる。(よくまとまってるので基本これの通りでOKだけど、ちょっとつまったので自分でもメモする)
https://blog.ecbeing.tech/entry/2021/09/07/150000#WSL-2のインストール](https://blog.ecbeing.tech/entry/2021/09/07/150000#WSL-2のインストール)
備忘録
- ディストリビューションに応じてインストールされるDockerのversionが異なる。 これはディストリビューションに応じてapt listの中身が違うからっぽい
22/2/1 ubuntuが20系でDebianが19系 - yarnを使う環境の場合、なぜかyarn installで以下のエラーが発生。 管理者権限で実行すれば改善することがわかったので例えばyarn installしたい場合はsudo yarn installにする
# 発生したエラー
error An unexpected error occurred: "EPERM: operation not permitted, copyfile
# 参考にした記事 https://stackoverflow.com/questions/64603970/an-unexpected-error-occurred-eperm-operation-not-permitted-in-yarn
1. WSL2をインストール
※Docker Desktopをインストールしたことがある人はすでにwsl 2 が入っている。 ただし、ディストリビューションはDebianかUbuntuは別途入れて上げる必要ある。
Microsoft公式に沿って実施 https://docs.microsoft.com/ja-jp/windows/wsl/install#manual-installation-steps
自分の環境はデータサイエンス環境を想定しているのでUbuntuが推奨だけど、誤ってDebianで記事を作成してしまったので修正が面d(ry
Ubuntuでの設定方法は↑のMSの記事に書いてある。
# ディストリビューションはデフォルトでUbuntuになっている。 Ubuntuでもいいが、本記事ではDebianで説明するのでDebianをいれる
wsl --install -d Debian
# installできるディストリビューションの一覧は以下でみれる
wsl -l -o
Linux ユーザー情報の設定
Microsoft公式に沿って実施 https://docs.microsoft.com/ja-jp/windows/wsl/install#manual-installation-steps
インストールが完了したら、Debian もしくはUbuntuをwindowsボタンから探して起動
起動したら、インストール待ちみたいになるので、暫く待つと、Username と Passwordを設定しろと言われるので任意に設定する。
パッケージの更新とアップグレード
sudo apt update && sudo apt upgrade
Windows Terminalの使用が推奨されているので、使いたい人はwindows terminalをインストールする。
2. WSL2の設定
インストールが終わったらpowershell でディストリビューションの一覧を取得 DebianがあればOK
wsl --list --verbose
以下のようにDebianがあればOK
NAME STATE VERSION
* docker-desktop Stopped 2
Debian Running 1
docker-desktop-data Stopped 2
Debianの横のVersionが1の場合は WSL1になってるのでWSL2にしてあげる
# DebianをWSL2にする
wsl --set-version Debian 2
# WSL2しかつかわないって人はデフォルトを2にしておけばよい
wsl --set-default-version 2
# WSL2になっているか確認
wsl --list --verbose
以下のようにDebianがあればOK
NAME STATE VERSION
* docker-desktop Stopped 2
Debian Running 2
docker-desktop-data Stopped 2
3. Docker Engineのインストール
公式を参照 https://docs.docker.com/engine/install/debian/
Ubuntuをインストールした人はこっち https://docs.docker.com/engine/install/ubuntu/
以下はDebianで説明
1. Uninstall old version
sudo apt-get remove docker docker-engine docker.io containerd runc
2. set up the repository
https://docs.docker.com/engine/install/debian/#uninstall-old-versions のset up the repositoryを実施
sudo apt-get update
私の場合、この時点で Unable to ****というのが返ってることに気づきました。
読むと Is the package apt-transport-https installed?というのがあったので、指示通りinstallしたらdockerが上手くインストールできました
sudo apt-get install apt-transport-https # ****に指示されたものを記述しインストールする
install packages to allow apt
to use a repository over HTTPS:
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
- 以下を実行
curl -fsSL https://download.docker.com/linux/debian/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/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Install Docker Engine
https://docs.docker.com/engine/install/debian/#uninstall-old-versions のInstall Docker Engineを実行
3つのうち1と3のみ実施
2はdockerのversion指定をする場合のみ
1
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
2
インストールが終わったら動くことを確認する。
公式だと↑の後にdocker runしろと書いてあるが、Dockerが起動していないので動かなかった。
下記リンクのDocker Engineが起動しない に沿って実施すればOK
https://blog.ecbeing.tech/entry/2021/09/07/150000#WSL-2のインストール](https://blog.ecbeing.tech/entry/2021/09/07/150000#WSL-2のインストール)
sudo touch /etc/fstab
sudo service docker start
Docker is runningと出ればOK
hello-worldを実行してみる
sudo docker run hello-world
いろいろ返ってくるが、hello from docker !!って書いてあればOK
sudo なしでdockerコマンドを実行できるように設定する。
sudo usermod -aG docker <username>
# <username> を自分のユーザーに置き換えて入力
dockerコマンドが動くことを確認する
docker images
さっき実行したhello-worldが表示されればOK
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d1165f221234 6 months ago 13.3kB
Anaconda等 指定ポートに接続して使う場合
anacondaやminicondaは ポートを接続して使う必要がある。
Docker Desktopではこのへんをうまいことやってくれてたが、手動でやらないといけない
<追記> 一回やればOK? 9月にPC交換した際は やらなくても上手くできた 謎
<追記> ポートフォワードを自動化することもできるらしい。
https://www.notion.so/WSL2-68d9257b6e4842919882909d4ddf4fe6
windows側のポートフォワードの設定
こちらを参考 https://qiita.com/ktakita1011/items/1525bf9d7d977565fa09#windows側のポートフォワードの設定
wsl2側で以下を実施してipアドレスを取得 (PCを再起動するたびにipは変わるので 都度やる必要がある。 めんどくさい docker desktopやっぱ優秀やったなぁ・・・
hostname -I
次に管理者権限でpowershellで以下を実行 {} の部分をipアドレスで置き換え
netsh.exe interface portproxy add v4tov4 listenport=8080 connectaddress={WLS2 IP}
設定できたかの確認は以下
netsh interface portproxy show v4tov4
ポートの開放方法する場合は以下 (↑での接続をやめる)
powershell にて事項
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 8080 -Action Allow -Protocol TCP
実際に使う方法メモ
WSL側(Debian / Ubutu)からローカルファイルをみれるので、直接ローカルファイルのdockerfileがあるディレクトリに移動してdockerコマンドを実行すれば
通常通りdocker環境を起動できる。
デフォルトで、WSL側を起動したときに /mnt/c/Users にいると思うので、 そこからcdコマンドで移動すればよい。
→ マウントされたファイルの通信速度が非常に遅いため、マウント先でコンテナ起動するとメモリやCPUがカツカツになる。
wsl側のユーザーフォルダ内で作業するほうがよい。
また逆にWSL側にエクスプローラーでファイルを移動することも可能。
エクスプローラーを起動して \wsl$\Debian\home にアクセスすればエクスプローラー上でWSL上のファイルを確認できる。
VSCODEでRemote Containerをつかいたい
GUIアプリを使いたい場合
WSL上で .profileを書き加える
# vi ~/.profile を実行して以下を.profileに追加する
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0
これで、WSLのDISPLAY変数にホストのipアドレスが設定される
次にコンテナのDISPLAY変数を設定する。WSLのDISPLAY変数をコンテナのDISPLAY変数として割り当てる
# docker-compose.ymlの中身
environment:
- DISPLAY=${DISPLAY}
これでコンテナのDISPLAY変数をWSLのDISPLAY変数に設定
あとはxlaunchでサーバーをたててやればOK
Discussion