その1 https://qiita.com/ssugimoto/items/668d33e4b151933b2e19
その2 https://qiita.com/ssugimoto/items/1b19083f5045e190e4ae
その3 この記事
その4 https://qiita.com/ssugimoto/items/a14262fa0bc8f60efee8
Docker Desktop for Windows と wsl2 Ubuntuを連携して使う(wsl2 Ubuntu 内のコンテナを動かす)
- wslconfigの設定(以下の wsl -l -v で Ubuntuに * マークが付くようにする)
>wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Running 2
docker-desktop-data Running 2
docker-desktop Running 2
- wslの設定変更例
>wslconfig /setdefault Ubuntu-20.04
>wslconfig /list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)
docker-desktop-data
docker-desktop
変更したら確認
>wsl -l -v
NAME STATE VERSION
* Ubuntu-20.04 Running 2
docker-desktop-data Running 2
docker-desktop Running 2
- Docker desktop 側の設定
- 設定例、wsl2 Ubuntu(Linuxディストリビューション)で Docker desktop for windowsを使ってコンテナを起動する場合。言い換えると、UbuntuのDockerは使わずにWindowsにインストールしたDockerのバックグラウンドにwsl2 Ubuntuを使う
- Docker desktop の
Settings
>Resources
->WSL Integration
でEnable integration with my default WSL distro
はチェックON - 表示されているLinuxディストリビューションで、
Ubuntu-XX
のどれか1つをチェックON
- 「Apply & Restart」を押す
- 上記の設定により、wsl2 Ubuntuからwindows側にインストールした docker-desktop for windowsにつながる(連携される)
- wsl2 Ubuntu内からdockerコマンドが使えるので、以下のコマンドが実行できる
$ docker images
$ docker ps
$ docker rm imageID
等
設定の参考
-
https://codeaid.jp/blog/docker-windowswsl2/
設定画面で「Use the WSL2 based engine」が有効になっていることを確認します。
あたりから参考に -
https://code.visualstudio.com/blogs/2020/03/02/docker-in-wsl2
-
Once installed, Docker will recognize that you have WSL installed and prompt to enable WSL integration. You want to Enable WSL integration for this tutorial. If you have multiple Linux distros, make sure you only have WSL integration turned on for the correct one in your Docker settings:
の説明あたり
-
wsl2 Ubuntu + Docker Desktop for Windows でコンテナを動かすのは
以下のどちらにも対応できる
- windowsのディレクトリに置いたコンテナ(Docker ファイルや docker-compose.yml)やリモートコンテナ(.devcontainer)
- リモートコンテナの例
C:\work\mysystem\.devcontainer
- docker-composeの例
D:\work\mysystem\docker-compose.yml
- wsl2ではWindows側をマウントすると激遅なので注意
- リモートコンテナの例
- wsl2のUbuntu内のディレクトリに置いたコンテナやリモートコンテナ(この記事の後述参照)
- リモートコンテナの例
\\wsl$\Ubuntu-20.04\home\linux\mysystem\.devcontainer
- docker-composeの例
\\wsl$\Ubuntu-20.04\home\linux\mysystem\docker-compose.yml
- リモートコンテナの例
wsl2 Ubuntu内に リモートコンテナ用のコンテナを置く場合
- 環境イメージ
-
/home/linux/リモートコンテナのディレクトリ
が wsl2 Ubuntu内のローカルディレクトリで、そこにリモートコンテナのファイルを置く - VSCode Remote Container機能を使い、wsl2 Ubuntuへの接続やwsl2 Ubuntu内のファイル編集
- Docker Desktop for Windows が Ubuntu内にあるリモートコンテナを動かす
- リモートコンテナからはUbuntu内のローカルディレクトリ・ファイルを使う
-
実際の例
前段の情報をすっ飛ばしてしまいますが(https://dev.classmethod.jp/articles/vscode-container-connect/ を参考にしても良いです)、コンテナをUbuntu内で実行する場合のVSCodeからの接続例です。
- リモートコンテナは、https://github.com/toricls/aws-amplify-sns-workshop-in-vscode のリポジトリでも良いです、そのリポジトリはAmplifyのworkshop向けのリモートコンテナです。
- Ubuntu内へのコンテナ用のファイルの配布は、Windwosのエクスプローラーから実施しても良いし、UbuntuからGitコマンド等を使ってファイルをダウンロードしても どちらでも良いです
- リモートコンテナのファイルをwsl2 Ubuntu内に置く
- Windows側の VS Codeを開き、 、左下の><をクリックして、
Reopen Folder in WSL
で開いた後に、Reopen in container
で開く - すると、コンテナのビルドがされていない場合は、ビルドされコンテナが起動する。ビルドされた後は、コンテナ起動していなければコンテナが自動起動する。
メリットなどの説明
-
Ubuntu内のディレクトリを使うメリット
- Ubuntu内のコンテナが壊れても、コンテナのリビルドしても Ubuntuを消さない・Ubuntuが動く限りファイルは残っている
-
\\wsl$\Ubuntu-20.04\home\linux\sugimoto-local-develop-container
のように、Windows側からファイルアクセスできる
-
Ubuntu内に置いたコンテナ+Ubuntu内のディレクトリにソース vs Windowsに置いたコンテナ+コンテナ内のディレクトリ
- ディスクアクセスはあまり変わらない。若干Windowsに置いたコンテナの方が速く感じるがキャッシュの影響かもしれない
- VSCodeのリモートコンテナを使えば違いはない
- Windowsに置いたコンテナはコンテナ消したり、コンテナリビルドするとファイルが消えてしまうので注意。コンテナ内のファイルをたまにホスト側にコピーするshellを実行すればファイル等のバックアップはできる。
-
コンテナから、Windows側のマウントパス
/mnt/c/usr
などのディレクトリが使えなかった(コンテナビルドでエラーになる。wsl2のubuntu側からみたパスを設定した)。設定方法が悪いだけかもしれない。Ubuntu内のディレクトリを使うのであれば、問題なし。 -
以下、動かず、エラーになる
"mounts": [
"source=/mnt/c/usr/20210500/sugimoto-local-develop-container/amplify,target=/root/amplify,type=bind,consistency=cached",
],