DockerをDesktop for Windowsから、WSL2で動かしているubuntuのdockerへ移行する方法のメモです。
WSL2環境でのDockerの実行方法
ややこしいのが「Docker Desktop for Windows」であってもWSL2が使われているので、どちらを指しているのか混乱を招きやすい点です。Windows上でWindowsアプリケーションとして動作させるのか、完全にWSL2内でLinuxのサービスとして実行させるかの違いがあります。
「Docker WSL2 インストール」等のキーワードで検索してもDesktopのインストール方法とWSL2上のサービスとしてインストールする方法の両方が出てきて、この二通りの方法があるということが説明されていないので、私も最初混乱しました。
Desktop版はGUIで起動中のコンテナやイメージを管理できたりとGUIで表示されるのでとっつきやすいのだけど、ボリュームとしてホストのフォルダをバインドマウントすると、ファイルのアクセスが非常に遅いという問題があります。これは結構深刻でLaravelなどのフレームワークなど大量のファイルを使用するプロジェクトでは無視できない遅さになってしまいます。

Docker Desktop -Filesharing
Docker Desktop has detected that you shared a Windows file into a WSL 2 container, which may perform poorly. Click here for more details.
ホストと共有しないDocker内部だけでのボリュームを作成してそれを使用して使うのならまだいいのですが、それだとホストからそのフォルダにアクセスできず利便性が悪くなってしまいます。
それで今回DockerをDesktop for WindowsからUbuntu on WSL2上でDockerをサービスとして起動させる方法へ移行することにしました。
最初はWSL2のサービスとしてLinux上でさらにDockerを動かすというのが邪道のような感じがあったのですが、全然問題なく動きます。むしろファイルアクセスが早くてこっちのほうが便利かも。(ただ、毎回コマンドでDockerサービスを起動させないといけない手間はあります。)
今回移行したDocker環境
WordPressイメージとMySQLイメージをdocker-composeを使用して組み合わせて実行しています。
version: '3'
volumes:
  db-store:
services:
   db:
     image: mysql:5.7
     container_name: mysqld
     volumes:
       - db-store:/var/lib/mysql
     environment:
       MYSQL_ROOT_PASSWORD: password
       MYSQL_DATABASE: blog_db
       MYSQL_USER: blog_user
       MYSQL_PASSWORD: password
   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     container_name: wordpress
     volumes:
       - ./html:/var/www/html
     ports:
       - "5000:80"
     environment:
       WORDPRESS_DB_HOST: mysqld:3306
       WORDPRESS_DB_NAME: blog_db
       WORDPRESS_DB_USER: blog_user
       WORDPRESS_DB_PASSWORD: password
MySQLのデータ永続化はDockerボリューム「db-store」を使用し、Wordpressのデータ永続化はホストとのバインドマウントを使用しています。
Desktop for Windowsで使用しているデータのバックアップ
このうち上二つはホスト上にあるので、バックアップは特に問題なくできますが、Dockerボリューム内のファイルについては、実際のファイルの場所を見つけてそれらをバックアップすることが難しいため、バックアップ用のコンテナ経由でバックアップを作成する必要があります。
Docker Desktop for Windowsのアンインストール
- 起動中コンテナの停止&削除
- 保存済みイメージの削除
- ボリュームの削除
- アンインストール
Dockerサービスのインストール(Ubuntu20.04)
WSL2のUbuntuを起動します。
>wsl
$Docker公式ドキュメントを参考にDockerレポジトリの追加→Dockerインストールと進みます。
Dockerリポジトリの追加
sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
echo \
  "deb [arch=amd64 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/nullDockerのインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-composeサービス起動
sudo service docker startDockerバージョン確認
docker version
Client: Docker Engine - Community
 Version:           20.10.6
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        370c289
 Built:             Fri Apr  9 22:47:17 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
Server: Docker Engine - Community
 Engine:
  Version:          20.10.6
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       8728dd2
  Built:            Fri Apr  9 22:45:28 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.4
  GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc:
  Version:          1.0.0-rc93
  GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdec
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0Hello worldでDockerの実行を確認
docker run hello-worldバックアップしておいたファイルをリストア
Windows側に置いてあったDocker用のファイルをWSL2側へ移行させます。せっかくWSL2でDockerサービスとして実行しても、ファイル類がWindows側「/mnt/c/」にあるのでは結局ファイルアクセスが遅いので、DockerからアクセスするファイルはすべてWSL2の領域へ配置します。
今回は「/home/ship/project/wordpress」というディレクトリを作成し、そこにDocker関係のファイルを配置します。
mkdir /home/ship/project/wordpress
cd /home/ship/project/wordpressWindowsエクスプローラーからWSL2のUbuntuディレクトリを開くにはアドレス欄に「//wsl$」と入力します。

- docker-compose.ymlなどのDockerコンテナ作成のためのファイル
- ホストとバインドマウントした共有フォルダ内のファイル
これらのファイルはエクスプローラーでWindows側からWSL2へコピーできます。
コンテナ経由でバックアップしたDockerボリュームをリストアする
移行できたか確認
docker-compose up -dhttp://localhost:5000へアクセスし、データが移行されているかどうか確認します。無事Docker Desktopでのデータが表示されました。

WSLで発生する問題
コンテナ内で作成したファイルをWindowsから変更できない
WSLのデフォルトユーザーをrootに変更することで解決できます。セキュリティ的に問題あるのではとも思いますが、個人用の開発環境であれば得に問題ありません。
- rootのパスワードを設定します。
sudo su -
passwd- デフォルトをrootに変更します。
 Windows PowerShellを管理者権限で起動してこのコマンドを実行します。
ディストリビューション名 config --default-user rootubuntu2004 config --default-user rootlocalhostでアクセスできない
Windowsのユーザーディレクトリ直下(通常はc:\User\ユーザー名)に「.wslconfig」というファイルを作成します。
[wsl2]
localhostForwarding=TrueWSLを再起動します。
wsl --shutdown
 
  
  
  
  


Comments