👌

# Docker Desktop使わないDocker環境構築(Docker Desktop有料化対策 windows)

2023/07/13に公開

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

https://docs.microsoft.com/ja-jp/windows/wsl/setup/environment#set-up-your-linux-username-and-password

インストールが完了したら、Debian もしくはUbuntuをwindowsボタンから探して起動

画像
起動したら、インストール待ちみたいになるので、暫く待つと、Username と Passwordを設定しろと言われるので任意に設定する。

パッケージの更新とアップグレード

https://docs.microsoft.com/ja-jp/windows/wsl/setup/environment#update-and-upgrade-packages

sudo apt update && sudo apt upgrade

Windows Terminalの使用が推奨されているので、使いたい人はwindows terminalをインストールする。

https://docs.microsoft.com/ja-jp/windows/wsl/setup/environment#set-up-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にしてあげる

https://docs.microsoft.com/ja-jp/windows/wsl/install#check-which-version-of-wsl-you-are-running

# 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

https://docs.docker.com/engine/install/debian/#uninstall-old-versions

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
  1. 以下を実行
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 以下を実行
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をつかいたい

https://qiita.com/ohtsuka1317/items/617a865b8a9d4fb67989?utm_campaign=email&utm_content=link&utm_medium=email&utm_source=update_stocked_article

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