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/null
Dockerのインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose
サービス起動
sudo service docker start
Dockerバージョン確認
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: de40ad0
Hello 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/wordpress
WindowsエクスプローラーからWSL2のUbuntuディレクトリを開くにはアドレス欄に「//wsl$」と入力します。
- docker-compose.ymlなどのDockerコンテナ作成のためのファイル
- ホストとバインドマウントした共有フォルダ内のファイル
これらのファイルはエクスプローラーでWindows側からWSL2へコピーできます。
コンテナ経由でバックアップしたDockerボリュームをリストアする
移行できたか確認
docker-compose up -d
http://localhost:5000へアクセスし、データが移行されているかどうか確認します。無事Docker Desktopでのデータが表示されました。
WSLで発生する問題
コンテナ内で作成したファイルをWindowsから変更できない
WSLのデフォルトユーザーをrootに変更することで解決できます。セキュリティ的に問題あるのではとも思いますが、個人用の開発環境であれば得に問題ありません。
- rootのパスワードを設定します。
sudo su -
passwd
- デフォルトをrootに変更します。
Windows PowerShellを管理者権限で起動してこのコマンドを実行します。
ディストリビューション名 config --default-user root
localhostでアクセスできない
Windowsのユーザーディレクトリ直下(通常はc:\User\ユーザー名)に「.wslconfig」というファイルを作成します。
[wsl2]
localhostForwarding=True
WSLを再起動します。
wsl --shutdown
Comments