Windows11 + Linux(WSL) + VSCode で開発環境を構築したい

以下不十分なとこ書き換え中

  • docker-compose自動起動のこと書けてない
  • 一部不整合なとこあるか見直しできてない
  • MySQL停止ではまったこと別のページに飛ばす

行いたいこと

WIndows11上に以下の様な開発環境を構築したい

  • Windows11上でUbuntu24.04を利用したい
  • Linux(WSL)上のdockerコンテナを用いて、MySQLとか立ち上げたい
  • VSCodeでコンテナを用いた開発をしたい

docker desktopを用いない理由

ライセンス料払えないので。。

最終的に行えるようになったこと

VSCodeの開発に関しては、後ほど解説

  • WSL2のLinuxを立ち上げることでdockerを起動
  • WSL2のLinuxでdockerを管理
  • VSCodeにて開発
    • Windows上のVSCodeを起動して、サービスとして利用
    • WSL2でVSCodeを起動してリモートデバック開発

前提条件

実施方法

WSLにUbuntu 24.04 LTSをインストールし、起動

wsl --install Ubuntu-24.04
wsl 

ubuntuにdockerをインストール

sudo apt update
sudo apt install docker.io
systemctl enable docker
systemctl start docker

参考リンク

Quick Docker Installation on Ubuntu 24.04 - LinuxConfig windowsにWSL2+Docker環境を構築する手順 #Windows - Qiita

ubuntuでdockerを利用する

MySQLが利用したかったので、MySQLを立ち上げる。
今後も踏まえてdocker-composeも一緒に入れる。
まずは、以下の様なフォルダ構成で各種ファイルを配置する。

【フォルダ構成】
/opt/dockerfiles/app1
├── docker-compose.yml
└── mysql
    ├── Dockerfile
    ├── db(初回起動後、データが溜まる箇所)
    ├── initdb.d(初回起動時のみ利用)
    │   └── init.sql
    └── my.cnf
【Dockerfile】
# 利用するイメージ
FROM mysql:8.4.2 # MySQL9にならない様に指定

# ポート番号
EXPOSE 3306

# MySQL設定ファイルを上書き
COPY ./my.cnf /etc/mysql/conf.d/my.cnf

# docker run時にMySQLを起動させるコマンド
CMD ["mysqld"]
【docker-compose.yml】
version: "3"
services:
  mysql:
    build: ./mysql/
    volumes:
      - ./mysql/initdb.d:/docker-entrypoint-initdb.d #初期処理(初期起動後消しても可)
      - ./mysql/db:/var/lib/mysql #データ永続化設定
    image: mysql:8.4.2
    container_name: "mysql"
    environment:
      - MYSQL_ROOT_PASSWORD=password
    ports:
      - "3306:3306"
【init.sql】
DROP DATABASE IF EXISTS testdb;
CREATE DATABASE testdb;
USE testdb;
DROP TABLE IF EXISTS testtable;

CREATE TABLE testtable
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  name TEXT NOT NULL
)DEFAULT CHARACTER
  SET=utf8mb4;

  INSERT INTO testtable
    (name)
  VALUES
    ("ほげ1"),
    ("ふが2"),
    ("げほ3");
【my.cnf】
[mysqld]
character-set-server=utf8mb4

[mysql]
default-character-set=utf8mb4

[client]
default-character-set=utf8mb4

docker-composeをインストールし、docker-compose経由でMySQLを起動する。

apt install docker-compose
cd /opt/dockerfiles/app1
docker-compose build
docker-compose up -d

参考リンク

Dockerで永続化したmySQLの環境を作る! #MySQL - Qiita

VSCodeからubuntuのdockerを利用する

VSCodeからWSL2のdockerを操作できる様にする

  1. VSCodeにRemote Development拡張機能をインストール
  2. この中のWSLという拡張機能を利用
  3. 他にも同時に色々インストールされる(ex. Remote SSH, Dev Containers)
  4. Linuxで作業したいディレクトリ(ex. /home/user)でcode .を実行

すると、不思議なことにWindows側のVSCodeが起動する。 また、その際左下が以下の様な状態で表示される。

WSL側にログインした状態でVSCodeが起動

WindowsVSCodeからWSLのdockerを操作できないのか?

出来る。 但し、設定がかなり苦行そう。 加えて、性能的にもちょっと問題ありそう。 そのため、割り切った方が良さげ。

参考リンク

MS Learn:Linux 用 Windows サブシステムで Visual Studio Code の使用を開始する WSL2上のDockerをWindows上のVSCodeから操作する

補記事項

sudo apt install docker.ioがうまくいかない

aptitudeというパッケージマネージャを使えばうまくいくかも なお、aptと混合利用でも問題ないとのこと

sudo apt install aptitude
sudo aptitude install docker.io

MySQLコンテナがすぐ落ちる

事象

MySQLコンテナがすぐエラーになる

原因

MySQL9を起動した後に、MySQL8.4を起動したため

対応方法

コンテナ用に永続化したファイルを一度削除する。
その後、再度MySQLを起動する。

WSLを扱う際によく使うコマンド

コマンド 効能 補記事項
wsl --list --online 現在インストールできる一覧
wsl --list -verbose 現在インストールしている一覧 wsl -l -v
wsl --install "Name" "Name"で指定したのをインストール
wsl --set-default "Name" "Name"で指定したのをデフォルトに切替 -s も同義
wsl デフォルトを起動
wsl --distribution "Name" "Name"で指定したのを起動 省略すればデフォルトを対象に起動
wsl --terminate "Name" "Name"で指定したのを停止 省略すればデフォルトを対象に停止
wsl --shutdown WSL全てを停止 WSL全てを起動は無い
wsl --list --running 現在稼働している一覧 wsl -l -r