DockerをDesktopからubuntu on WSL2へ移行

Docker DesktopからUbuntu on WSL2へ移行 Docker

DockerをDesktop for Windowsから、WSL2で動かしているubuntuのdockerへ移行する方法のメモです。

WSL2環境でのDockerの実行方法

WSL+Dockerにも二種類あります
  • Docker Desktop for Windows (Windowアプリケーション。GUIで操作可能)
  • WSL2上のLinuxで動かすDocker (Linuxサービス。すべてCUIで操作)

ややこしいのが「Docker Desktop for Windows」であってもWSL2が使われているので、どちらを指しているのか混乱を招きやすい点です。Windows上でWindowsアプリケーションとして動作させるのか、完全にWSL2内でLinuxのサービスとして実行させるかの違いがあります。

「Docker WSL2 インストール」等のキーワードで検索してもDesktopのインストール方法とWSL2上のサービスとしてインストールする方法の両方が出てきて、この二通りの方法があるということが説明されていないので、私も最初混乱しました。

Desktop版はGUIで起動中のコンテナやイメージを管理できたりとGUIで表示されるのでとっつきやすいのだけど、ボリュームとしてホストのフォルダをバインドマウントすると、ファイルのアクセスが非常に遅いという問題があります。これは結構深刻でLaravelなどのフレームワークなど大量のファイルを使用するプロジェクトでは無視できない遅さになってしまいます。

Docker Desktopでホストのフォルダをバインドマウントすると出る警告

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-compose.ymlなどのDockerコンテナ作成のためのファイル
  • ホストとバインドマウントした共有フォルダ内のファイル
  • Dockerボリューム内のファイル

このうち上二つはホスト上にあるので、バックアップは特に問題なくできますが、Dockerボリューム内のファイルについては、実際のファイルの場所を見つけてそれらをバックアップすることが難しいため、バックアップ用のコンテナ経由でバックアップを作成する必要があります。

ちなみにコンテナのバックアップは普通なら必要ないのがDockerの考え方です。Dockerイメージさえあればどんな環境でも同じ環境が再現されるべきだからです。

Docker Desktop for Windowsのアンインストール

  1. 起動中コンテナの停止&削除
  2. 保存済みイメージの削除
  3. ボリュームの削除
  4. アンインストール

先にUbuntu上にDockerをインストールして正常に動くことを確かめてからWindows上のDocker Desktopで使用しているコンテナやイメージを削除、アンインストールを行うことをお勧めします。

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

WSL2の場合Dockerサービスは自動的に起動しないため、WSL2起動時に毎回このコマンドを実行してDockerサービスを起動する必要があります。

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

もし権限がないというエラーが出る場合は「sudo」を先頭につけて実行してください。

バックアップしておいたファイルをリストア

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に変更することで解決できます。セキュリティ的に問題あるのではとも思いますが、個人用の開発環境であれば得に問題ありません。

  1. rootのパスワードを設定します。
sudo su -
passwd
  1. デフォルトをrootに変更します。
    Windows PowerShellを管理者権限で起動してこのコマンドを実行します。
ディストリビューション名 config --default-user root
Ubuntu20.04の場合
ubuntu2004 config --default-user root

localhostでアクセスできない

Windowsのユーザーディレクトリ直下(通常はc:\User\ユーザー名)に「.wslconfig」というファイルを作成します。

[wsl2]
localhostForwarding=True

WSLを再起動します。

wsl --shutdown

PCを再起動するとまたlocalhostでアクセスできなくなる場合は、その度にWSLを再起動する必要があります。これは高速スタートアップが関係しているため、高速スタートアップを無効にすると改善されます。

この記事を書いた人

PHPが好物な個人開発プログラマ。フリーランスエンジニアとしてWebサービス作ったりしてます。15年の経験を生かしてMENTAでメンターもやってます。WordPressやPHPでお困りのことがあればご相談に乗りますのでDMください。

Follow on SNS
Docker
SOHO MIND

Comments

タイトルとURLをコピーしました