1.システム要件
(0)現環境:ホストOS(Windows11)、ゲストOS(Windows10Pro、22H2)
(1)システム主要件:①ネストされたゲストOSの仮想化の有効化、②BIOSレベルのHW仮想化サポート有効化、③WSL2機能の有効化、等
2.仮想化:有効化されていること。
ホストOS、ゲストOSとも、以下の手順で仮想化を有効化する。
(1)仮想マシンのネストされた仮想化の有効化:
①ホストOS(Windows11)/PowerShell(管理者モード)/
Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true
※<VMName>:対象となるゲストOSの仮想マシン名称(ここでは、Windows10_03)
※参考資料:
(a)入れ子になった仮想化の有効化(https://learn.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/enable-nested-virtualization)
②対象となる仮想マシンを起動(ゲストOS上で移行手順実施)
(2)BIOSレベルのHW仮想化サポートの有効化:
①Windowsの機能の有効化または無効化/Hyper-V→全てON
※[ファイル名を指定して実行]/optionalfeatures.exe
※再起動が必要
※仮想化(https://docs.docker.com/desktop/troubleshoot/topics/#virtualization)
(3)WSL2機能の有効化:
①PowerShell(管理者モード)/wsl –install
※デフォルト(Ubunts)、後で変更または複数インストールの後に変更も可能
※再起動が必要(再起動直後に以下プロンプト表示あり)
※再起動直後に再度、wsl –install 実行(下図)
②Linuxユーザ情報設定
新規ユーザ名、パスワードを設定
↓ ※WSLコンソール起動
※上記の様になればWSL2インストール完了。
※もし以下のメッセージが表示された場合、上記(1)手順をが失敗している可能性が高い。
※上記内容:※BIOSレベルで仮想化が有効化されていない、という趣旨文
Ubuntu は既にインストールされています。
Ubuntu を起動しています…
Installing, this may take a few minutes…
WslRegisterDistribution failed with error: 0x80370102
Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS.
For information please visit https://aka.ms/enablevirtualization
Press any key to continue…
※参考資料:
(a)WSL コマンドのインストール(https://learn.microsoft.com/ja-jp/windows/wsl/install#install-wsl-command)
(b)Docker Desktop WSL 2 バックエンド(https://docs.docker.jp/docker-for-windows/wsl.html)
(c)Windows に Docker デスクトップをインストールする(https://docs.docker.com/desktop/install/windows-install/)
(d)[ガイドツアー]Docker Desktop インストール 記録(https://zakku-spot.com/2023/06/05/ガイドツアーdocker-desktop-インストール-記録/)
3.Docker for Windowsインストール
※手順:
(a)別記事「[ガイドツアー]Docker Desktop インストール 記録」(https://zakku-spot.com/2023/06/05/ガイドツアーdocker-desktop-インストール-記録/)
※今回はv4.22(上記別記事はv4.20時点)
※上記(a)別記事最後で起動失敗しているのは、本記事の上記1~2手順を実施していなかった為。
4.エディタ準備
必要に応じてエディタ準備
(1)秀丸エディタ
(2)VSCode
※別記事「[ガイドツアー記録] Visual Studio Code 1.78.2 (x64)」(https://zakku-spot.com/2023/05/14/ガイドツアー記録%e3%80%80visual-studio-code-1-78-2-x64/)参照
5.作業フォルダ準備
6.DB準備
必要に応じてDB(テーブル、データ)作成のためのスクリプトを準備
(1)適宜フォルダ準備
(例)¥env、¥init¥sql¥data
(2)適宜スクリプト作成・配置
(a)例: init.sh、create-tables.sql、prefecture.sql
(b)詳細例:
(1) init.sh
#!/bin/bash # create database mysql -u root -p -e "DROP DATABASE IF EXISTS railroad; CREATE DATABASE railroad;" # create tables mysql -u root -p railroad < "/docker-entrypoint-initdb.d/sql/create-tables.sql" # import data mysql -u root -p railroad < "/docker-entrypoint-initdb.d/sql/data/prefecture.sql"
※本シェルは(実行場所がコンテナ内である(つまりLinux上にマウントされている)為)改行コードに関する問題を内包しており、実際にコンテナ作成後に、これが原因でDB作成が正しく行われない場合がある。
この事象の対応策はこちらの別記事を参照願います。
・別記事「[基礎知識]「docker-entrypoint-initdb.d」について」
・別記事「[基礎知識]Dockerコンテナ内で、shファイル実行時に、改行コードに関するエラーが表示された場合の対処方法」
(2) create-tables.sql
CREATE TABLE prefecture ( code CHAR(2) NOT NULL, name VARCHAR(20) NOT NULL, name_kana VARCHAR(20) NOT NULL, name_rome VARCHAR(40) NOT NULL, created_at DATETIME(6) NOT NULL DEFAULT NOW(6), PRIMARY KEY (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
(3) prefecture.sql
7.設定ファイル準備
必要に応じて、Dockerのベースイメージ・コンテナ作成の為の設定ファイル作成・配置
(例)docker-compose.yml、Dockerfile、my.cnf
設置場所(例):
作成ファイル(例):※依存関係があるので設定漏れに注意
詳細(例):
(1)docker-compose.yml
# MySQL各コンテナ構築・設定 # Docker Compose バージョン version: "3" # ↓サービス(各コンテナ)定義 services: # MySQLサービル(コンテナ) mysql: # Dockerイメージのビルド時設定 build: # ※Docker Compose 実行 と同じ場所の Dockerfileを使用する、という設定 context: . # Dockerfile: ビルドで使用するDockerfileのファイル名 dockerfile: Dockerfile # コンテナを実行するプラットフォームの指定 # ※windowsのamd64アーキテクチャ ※今回はコメントして実施 # platform: windows/amd64 # コンテナ名 container_name: mysql-container01 # コンテナ内の環境変数指定 environment: # ※MySQLのルートユーザーのパスワード MYSQL_ROOT_PASSWORD: damedame # ※タイムゾーン TZ: "Asia/Tokyo" # ホストマシン(ローカルコンピュータ)のコンテナ内への # (コンテナ初期化時実行)マウント設定 # ※./init(ホストマシン内)⇒マウント⇒ /docker-entrypoint-initdb.d(コンテナ内) volumes: - ./init:/docker-entrypoint-initdb.d # ポートフォワーディングの設定(ホストマシンからMySQLサーバーにアクセス可能にする) # ※ホストマシンのポート3306⇒マッピング⇒コンテナのポート3306 ports: - "3306:3306"
(2)Dockerfile
# Dockerベースイメージ指定 # 公式MySQL最新版 # FROM mysql:latest # ↓version8.0.32 FROM mysql:8.0.32 # ホストマシン(Dockerビルドを実行している # ローカルコンピュータ)の # ./env/my.cnf(MySQLコンテナが起動時設定) # を /etc/mysql/conf.d/ディレクトリにコピー ADD ./env/my.cnf /etc/mysql/conf.d/my.cnf # コンテナ内の/etc/mysql/conf.d/my.cnf #の権限設定 RUN chmod 644 /etc/mysql/conf.d/my.cnf
(3)my.cnf
# my.cnfファイル #MySQLサーバーとクライアントの設定のカスタマイズ [mysqld] # MySQLサーバーで使用するデフォルトの文字セット character-set-server=utf8mb4 # MySQLサーバーで使用するデフォルトの照合順序(collation) collation-server=utf8mb4_unicode_ci [client] # MySQLクライアント(DB接続ツール)の設定 default-character-set=utf8mb4
8.Dockerコンテナ作成
適宜、Docker上に、MySQLイメージを取得して、MySQLコンテナ作成
※もし既に(以下手順で)コンテナ作成済みで(事情(コンテナ起動時にスクリプト起動を再実行したい等の理由により))再びコンテナを再起動する場合は、別記事(「[基礎知識]/docker-entrypoint-initdb.d ディレクトリへのスクリプトやSQLの自動実行が、正常に行われない場合の対処方法」)を実施の上(以降の(1)~(2)手順を飛ばして)以降の(3)手順に進む。
※今回は、上記7で準備した設定ファイルを使用して、同じフォルダで以下を実施
(1)docker-compose実行
docker-compose up -d
※以下は完了後のDocker Desktop画面
作成されたイメージ名:mysql-docker-spl01–mysql
※イメージ名は、「作業フォルダ名」+「(docker-compose.ymlに設定した)サービス名」になっている。
作成されたDockerネットワーク名:mysql-docker-spl01
※ネットワーク名は、「作業フォルダ名」になっている。
作成されたコンテナ名:mysql-container01
※コンテナ名は、(docker-compose.ymlで設定した)コンテナ名になっている。
(2)MySQLコンテナ起動
docker start mysql-container01
※以下はDocker Desktop画面の状態
※ちなみに、上記コンテナ停止コマンドは次の通り。
docker stop mysql-container01
※この類のコンテナ操作コマンドは以下参照
別記事(「[基礎知識]Dockerコマンドリファレンス(レビュー)~コンテナ用コマンド~」)
(3)MySQLコンテナ接続確認
docker exec -it mysql-container01 mysql -u root -p
※途中パスワード入力あり
※DockerコンテナのTerminal画面からDB接続する場合は、別記事「[基礎知識]Docker上MySQLコンテナのTerminalからMySQL接続するコマンド」参照
(4)DB作成結果確認
①DB確認
show databases;
※以下の様にシェルによるDBが作成されていればOK。
※もしDBが作成されていない場合は、シェルが正しく実行されていない可能性がある。
→次の別記事参照願います。
・別記事「[基礎知識]docker-compose.ymlを使用してDockerコンテナ作成・起動する手順」
・別記事「[基礎知識]「docker-entrypoint-initdb.d」について」
・別記事「[基礎知識]Dockerコンテナ内で、shファイル実行時に、改行コードに関するエラーが表示された場合の対処方法」
②テーブル確認
show tables;
select * from prefecture;
以上で、Hyper-V(ホストOS(Windows11))上のゲストOS(Windows10)に、
MySQLのDocker(Docker Desktop)コンテナ作成の手順は完了です。
[…] 確認方法2> もし既にDocker for Windows等、仮想拡張機能有効化必須のソフトが稼働していればOKです。(参考URL(1章参照): https://zakku-spot.com/2023/08/18/review-docker-mysql-container-001/) […]