Open6

WindowsでDockerを使用する

ChiHaRuChiHaRu

手順

1. WSL2のインストール

(1) 管理者モードでPowerShellを起動し、WSLコマンドをインストール

# WSLのインストール
$ wsl --install

(2) PCを再起動して通常モードでPowerShellを起動し、WSL のバージョンを確認

# WSL のバージョンの確認
wsl -l -v

※1: インストールされていないと言われた場合は、再度wsl --installコマンドを実行したら以下のメッセージとともに起動された

Ubuntu は既にインストールされています。
Ubuntu を起動しています...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:

→ この後、コンソールメッセージに従い、ユーザー名とパスワードを設定。その後、Ubuntuにログインされる

一度Ubuntuからexitして、バージョン確認

$ exit
$ wsl -l -v

※この状態で再度、wsl -l -v すると、ステータスがRunningになっているはず

PS C:\Users\xxx> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2

(3) PowerShellの「v」マークをクリック > プルダウンの「Ubuntu」をクリック
→ (2) で作成したユーザーでUbuntu環境にログインされる

補足

※もともとWSL2を入れていたので、1から実施するため以下の手順で一度アンインストールした
https://qiita.com/zakoken/items/61141df6aeae9e3f8e36

ChiHaRuChiHaRu

2. Dockerのインストール

今回、大規模商用利用(会社での利用)を加味し、Docker Desktopを使わないやり方でやってみる
(1) Docker のapt repositoryをセットアップ

$ sudo apt-get update
# ユーザーのパスワードを求められるので入力
$ sudo apt-get install ca-certificates curl
$ sudo install -m 0755 -d /etc/apt/keyrings
$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
$ sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt-get update

(2) Docker パッケージをインストール

# 最新版の場合
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

(3) hello worldイメージの実行により、Docker Engineのインストールが成功していることを確認

$ sudo docker run hello-world

(4) 通常モードでもdockerコマンドが使えるよう権限を変更

$ sudo chmod 666 /var/run/docker.sock
# 通常モードでdockerコマンドが使えることを確認
$ docker ps -a

※(4) 間で実行してpermission denied的なエラーが出る場合は、以下も実行しておく

# 対象ユーザーのグループへの追加
$ sudo usermod -aG docker $USER
# シェルの再起動
$ exec $SHELL -l
# グループへの追加状況の確認
$ groups $USER
# 上記でdocker が表示されない場合、Linuxマシンを再起動
ChiHaRuChiHaRu

3. Docker Hubからimageを取得

(1) docker imageの取得

# 最新版のインストール
$ docker image pull debian
# タグ(バージョン)を指定してのインストール
$ docker pull debian:11.9
$ docker pull debian:11.9
$ docker image ls

docker pullは、docker image pull のエイリアス

※実際に表示された結果

REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
debian        11.9      db0c3f4ff71a   12 days ago     124MB       # 11.9
debian        bullseye   db0c3f4ff71a   12 days ago     124MB     # bullseye(11.9に同じ)
debian        latest    d2a2c1ada45a   12 days ago     117MB      # 最新版

※Docker Hubのdebianはコチラ

(2) コンテナの起動

# debian(最新版)imageからコンテナを作成&起動
$ docker run debian
$ docker ps

→ 起動すると表示されるはずだが、Exitで終わってたので表示されず、、

(3) docker コンテナの削除

# 起動している場合は停止する
$ docker stop [コンテナID | コンテナ名]
$ docker rm [コンテナID | コンテナ名]

(4) docker imageの削除

# 最新版(latest)の削除: latest以外は残る
$ docker rmi debian
# REPOSITORYがdebian、TAGが11.9のimageを削除
$ docker rmi debian:11.9
# CONTAINER IDがdb0c3f4ff71aのものを削除
$ docker rmi db0c3f4ff71a
$ docker image ls
ChiHaRuChiHaRu

4. Dockerfileの作成

今回、LAMPサーバを作成してみる

(1) 専用のディレクトリの作成と移動

$ mkdir docker-practice && cd docker-practice

(2) Dockerfileの作成と編集

$ touch Dockerfile
$ touch src/index.php
$ code .
# VSCodeが未インストールの場合は、インストールされる

(3) VS Codeが起動したら、Dockerfile, index.phpに以下の内容を記述し、保存

Dockerfile
# ベースイメージとしてUbuntuの最新版を使用
FROM ubuntu:latest

# 必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
    apache2 \
    mysql-server \
    php \
    libapache2-mod-php \
    && rm -rf /var/lib/apt/lists/*

# srcディレクトリから/var/www/html/にファイルをコピー
COPY src/ /var/www/html/

# Apacheの設定:envvarsを設定してApacheがフォアグラウンドで実行されるようにする
RUN echo '. /etc/apache2/envvars' > /root/envvars \
    && echo 'mkdir -p /var/run/apache2' >> /root/envvars \
    && echo 'mkdir -p /var/lock/apache2' >> /root/envvars \
    && chmod +x /root/envvars

# ポート80を公開
EXPOSE 80

# Apacheをフォアグラウンドで実行
CMD /root/envvars && /usr/sbin/apache2ctl -D FOREGROUND
index.php
<!DOCTYPE html>
<html>
<head>
    <title>Welcome to My LAMP Application!</title>
</head>
<body>
    <h1>Hello, world!</h1>
    <p>This is a simple LAMP application.</p>
</body>
</html>
ChiHaRuChiHaRu

5. DockerイメージとDockerコンテナの作成

(1) Dockerイメージの作成
Dockerfileを作成したパスにて、以下を実行

# リポジトリ名を付けない場合 ※IMAGE IDが付与されるので、それで識別
$ docker build .
# リポジトリ名に、ubuntu-lampとつける場合
$ docker build -t ubuntu-lamp .
# 作成したイメージの確認
$ docker image ls

※リポジトリ名を付けなかった場合の表示結果

REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
<none>        <none>    99b834b30aa9   55 seconds ago   732MB

→ REPOSITORY, TAGが<none>

※リポジトリ名を付けた場合の表示結果

REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
ubuntu-lamp        latest    99b834b30aa9   55 seconds ago   732MB

(2) Dockerコンテナの作成と起動

$ docker run -d -p 80:80 ubuntu-lamp

(3) 以下のURLを叩き、index.phpの内容が正しく表示されることを確認する

http://localhost/index.php

▼イメージとしてはこんな感じ