TECHNOLOGY

WindowsでのDocker Desktop導入とApacheによるボリュームマウントの手順解説

本記事では、Windows環境にDocker Desktopを導入し、ApacheコンテナでローカルのHTMLファイルを同期表示させるまでの手順をまとめました。インストールなどの初期設定から、基本操作、そしてボリュームマウントの設定までを一通り解説します。

目次

Dockerの特徴

Dockerは、プロセスやプログラムの実行環境を隔離できる技術です。

プログラムとその動作環境をまとめて入れるための「箱」であるコンテナを使用し、それぞれのコンテナ内で使うライブラリや設定がお互いに影響しないように隔離します。

コンテナ同士は干渉しないため、1つのコンテナに1つのサーバーを入れて、複数のコンテナをパソコンにいれることで、サーバーを複数同時に稼働させることができます。そして、その際にライブラリの競合のような問題は起こりません。

また、コンテナにはライブラリや依存関係も含まれるので、どの環境に持っていっても同じように動作します。これによりテスト環境から本番環境への移行が簡単になります。

DockerはLinuxの仕組みを利用しており、他のOSで利用する際には、内部でLinux環境を動かして、その上でDockerを実行します。

Dockerを使って、データやプログラムを隔離すると、次のメリットがあります。

メリット

  • 依存関係やライブラリのバージョン競合を防げる。
  • 異なるバージョンのプログラムを共存させられる。
  • 複数のサーバー環境を一台のマシン上に独立して構築できる。
  • コンテナは不要になればすぐ削除して、再作成できる。
  • コンテナをイメージ化して、複製・配布が簡単にできる。
  • Docker Hubから既存のイメージを取得して流用できる。
  • コンテナはホストのLinuxカーネルを共有するため、仮想マシンより軽量に動作する。

隔離されているということはステートレスに扱えば「スケールアウト/スケールインしやすい」ということでもあります。

コンテナのライフサイクル

コンテナは、Docker Hubなどで配布されているイメージから基本的に作成します。

使用したい機能をもつイメージが配布されていない場合も、既存のイメージを修正してコンテナを作成することもできます。

イメージが既にあれば、イメージからコンテナを作るのに時間はほとんどかかりません。

コンテナはイメージから作り直す方が便利であるため、「イメージから作成」→「起動」→「停止」→「廃棄」がライフサイクルとなっており、コンテナを使い捨てるのが基本的な使い方です。

具体的な例を考えてみましょう。サーバーを運用している場合には、ソフトのアップデートを行うことがありますが、サーバーが大量にある場合には、一つ一つ手動でアップデートしていくのは大変です。

この場合、コンテナを1つずつ修正するよりも、今のコンテナを廃棄して、ソフトをアップデートしたイメージを作成し、そのイメージをもとにコンテナを作り直せば、複数のサーバーがある場合にも時間がかかりません。

コンテナを廃棄すると、コンテナの中にあるデータも一緒に削除されます。消してはいけないデータはコンテナの外に保存しておき、コンテナからは外部のデータをマウントして使います。

まとめると、コンテナの基本的な使い方は、次の通りです。

  • コンテナは「使い捨て」
    長期間同じものを保守するのではなく、必要になったら「新しいコンテナを立ち上げます」。
  • 状態を持たせない(ステートレス)
    コンテナ内で直接データを更新したり保存したりするのは推奨されません。
    データはボリュームや外部データベースに保存し、コンテナは純粋に「アプリを実行する箱」として扱います。
  • アップデートも再作成で対応
    新しいバージョンを入れたい場合は、イメージを更新して、そのイメージから新しいコンテナを起動します。

イメージは修正したコンテナから作ることもできます。

イメージの配布場所

イメージは、Docker公式の公開レジストリであるDocker Hubからダウンロードできます。

https://hub.docker.com

世界中で最も使われているイメージ配布サイトで、Ubuntu、Nginx、PostgreSQLなどの公式イメージが提供されています。

誰でもアップロードすることができるため、中には「脆弱性を含んだイメージ」も存在します。このため、公式イメージを優先し、提供元を確認することが大事です。

また、更新頻度やセキュリティアップデートを確認し、古いまま放置されているイメージでないかを確認することも重要です。

不要に大きいイメージはビルドや配布が遅くなるため、軽量版を検討するのも有効です。

Docker Desktopのインストール方法

WindowsにDockerを導入する方法を説明します。最も簡単なのはDocker Desktopを使用する方法です。

Windows 10以上最新のWindows Updateを適用しているものとします。

Docker Desktopは、WindowsやMacでDockerを簡単に使えるようにするための公式アプリケーションです。WSL2を使うため、それを有効化します。

PowerShellを開き、次のコマンドを実行します。

wsl.exe --install

管理者権限を求められますので「OK」ボタンを押します。これにより、WSLが使用できるようになります。

古いOSの場合で上記のコマンドを使用できない場合(クリックすると開きます)

古いOSのバージョンを使用している場合

Windows 10 バージョン 2004 以降 (ビルド 19041 以降) または Windows 11 でない場合には、wsl.exe --installwsl.exe --updateによるWSLのインストールができません。この場合には、手動でインストールを行います。

まず、「コントールパネル」の「プログラム」を選択し、その中の「Windowsの機能の有効化と無効化」を選択します。そして、開いたウィンドウの中の「Linux用Windowsサブシステム」と「仮想マシンプラットフォーム」にチェックを入れて、OKボタンを押します。再起動が求められた場合はPCの再起動を行います。

次に、Linuxカーネルアップデートを行います。以下のホームページにアクセスして、手順4に記載された「***マシン用WSL2 Linux カーネル更新プログラムパッケージ」をダウンロードして、実行します。x64マシン用とARM64マシン用がありますので、お使いのPCに対応したものを使用します。

https://learn.microsoft.com/ja-jp/windows/wsl/install-manual

WSLを有効化した後は、以下のアドレスからDocker Desktopをダウンロードします。

https://www.docker.com/ja-jp/products/docker-desktop

AMD64版とARM64版がありますが、コマンドプロンプトを開いて次のコマンドを打ち込むことで確認することができます(PowerShellではなくcmdでのコマンドです)。

echo %PROCESSOR_ARCHITECTURE%

ダウンロードしたインストーラを実行し、ウィンドウの指示に従って進めれば、インストールできます。

Docker Desktopを実行すると、「Docker Subscription Service Agreement」が開かれます。これは有料サブスクリプションサービスに関する承認を求めるものです。

Docker Subscription Service Agreement

Docker Desktop is free for small businesses (fewer than 250 employees AND less than $10 million in annual revenue), personal use, education, and non-commercial open source projects. Otherwise, it requires a paid subscription for professional use. Paid subscriptions are also required for government entities.

Docker Desktop は以下の条件を満たす場合に無料で利用できます:

  • 従業員数が 250 人未満
  • 年間売上が 1,000 万ドル未満

また、個人利用・教育目的・非営利のオープンソースプロジェクトでも無料です。
それ以外の場合(商用利用など)は有料のプロフェッショナルプランが必要です。
政府機関も有料サブスクリプションが必要です。

内容を確認して同意できる場合は「Agree」を実行します。

記事執筆時点における同意書です。インストールする際には、よく読んでお使いください。

アカウントの作成を求められますが、Skipすることも可能です。

右下にTermialという文字がありますので、それをクリックするとターミナルが開き、そこでDockerのコマンドを使用することができます。

Docker Desktopは常駐アプリで、タスクバーに表示されます(クジラのようなマークです)。軽いので常駐させていてもPCの動作にはほとんど影響はありません。

コンテナの起動、停止、削除

Docker Desktop のターミナルを用いて、コンテナの起動、停止、削除を実施してみます。ここでは、Webサーバーを提供するApacheを動かして、ブラウザからアクセスしてみます。

コンテナの作成と起動

コンテナに対して外部からアクセスするためには、ポートの設定が必要になります。ポートの設定はホスト側とコンテナ側のポート番号を次のようにして与えます。

-p [ホストのポート番号]:[コンテナのポート番号]

コンテナのポート番号にはソフトウェアで決められたポート番号を与えます。Apacheは、ポート80でユーザーがアクセスしてくるのを待っていますので、コンテナのポート番号を80にします。一方、ホストのポート番号は使用していないポート番号であれば、何でも任意の数字で構いません。

まず、コンテナを作成、起動するコマンドdocker runを使用します。

docker run --name apache_server -d -p 8000:80 httpd
パーツ役割詳細
docker runコンテナの作成と実行イメージを元に、新しいコンテナ(仮想的なサーバー環境)
--name apache_serverコンテナに名前を付けるこのコンテナにapache_serverという独自の管理名を付けます。指定しない場合はランダムな名前が自動で振られます。
-dデタッチモード「Detached」の略。コンテナをバックグラウンドで実行します。これを使わないと、ターミナルがApacheのログ表示で占有されてしまいます。
-p 8000:80ポートマッピングホスト側の8000番ポートへのアクセスを、コンテナ内の80番ポートへ転送します。
httpdイメージ名使用するベースイメージです。httpdはApache HTTP Serverの公式イメージを指しています。

コマンドを実行するとイメージがあるかどうかを確認し、なければ自動的にダウンロードしてからコンテナを作成して起動します。

chrome等のブラウザのアドレスバーに、以下のアドレス入力します。

http://localhost:8000/

ブラウザに「It works!」と表示されていれば成功です。コンテナの一覧を表示するにはdocker psコマンドを使用します。

docker ps

CONTAINER ID   IMAGE     COMMAND              CREATED         STATUS         PORTS                                     NAMES
ad30b3f098ea   httpd     "httpd-foreground"   3 minutes ago   Up 3 minutes   0.0.0.0:8000->80/tcp, [::]:8000->80/tcp   apache_server

これにより、動作しているコンテナの一覧が表示されます。STATUSの欄に「Up」と書かれているのが起動していることを意味しています。停止しているコンテナも表示したい場合には-aオプションを付けます。停止している場合には、STATUSの欄に「Exited」と表示されます。

ポート番号8000でエラーが出た場合には、8001番にするなど開いているポートに変更してください。

コンテナの停止と再開

コンテナの停止する場合には、以下のコマンドを実行します。

docker stop apache_server

また、停止したコンテナを再開する場合には、以下のコマンドを実行します。

docker start apache_server

コンテナを停止した場合にdocker psを使用すると、以下のようになります。

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

コンテナの削除

コンテナの削除には以下のコマンドを使用します。

docker rm apache_server

docker ps -aコマンドを実行しても当該コンテナが表示されないことにより、削除できたことを確認できます。

イメージの削除

イメージが増えると、ディスクの容量をそれだけ使用するため、使わなくなった不要なイメージは削除します。イメージを削除するには、そのイメージが作成したコンテナが削除されている必要があります。

まず、イメージを作成する前に、イメージ一覧を以下のコマンドにより確認します。

docker image ls

この結果、次のような結果が表示されます。

REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
httpd        latest    bdba5c86022f   4 days ago   175MB
項目説明
REPOSITORYイメージの名前(例:httpd, mysql, nginx
TAGバージョン番号や識別子です。指定しない場合は最新版を示すlatestになります。
IMAGE ID各イメージに割り振られた固有のIDです(最初の数文字で識別可能)
CREATEDそのイメージがビルド(作成)された時期
SIZEイメージのファイルサイズ

中間イメージも含めたすべてのイメージを表示したい場合は-aオプション、IDだけを表示したい場合は-qオプションを付けます。

docker image ls -a
docker image ls -q

イメージを削除する場合には、イメージの名前(例:httpd)またはイメージIDを指定して、次のコマンドを実行します。

docker image rm httpd

削除した後にもう一度docker image lsコマンドを実行することで、実際に削除されていることを確認できます。

REPOSITORY   TAG       IMAGE ID   CREATED   SIZE

ボリュームマウント

ボリュームマウントは、ホストPC(ユーザーのパソコン)にあるフォルダやファイルを、コンテナの中につなげるための機能です。ボリュームをマウントする場合には、docker runを実行する際に-vオプションを使用します。

-v [ホスト側のパス]:[コンテナ側のパス]

ホスト側のパスには、ユーザーのPC上のフォルダの場所(例:C:\Test\my-site)を設定し、コンテナ側のパスには、コンテナ内のどこに繋げるか(例:Apacheの公開フォルダ /usr/local/apache2/htdocs)を設定します。

コンテナ側のパスは、以下のような方法で確認します。
・ Docker Hubの「How to use this image」などのドキュメントに記述されています。
・ docker exec -it コンテナ名 bash で中に入り、Linuxコマンドでフォルダ構成を確認します。

実際に、ローカルのファイルを読み込んでホームページを表示してみましょう。自分で作成したHTMLファイルindex.htmlを作成して、それをC:\Test\my-site\に置きます。

<!DOCTYPE html>
<html>
<body>
    <h1>Docker Volume Success !</h1>
    <p>This file is saved in your PC.</p>
</body>
</html>

そして、このHTMLファイルを置いたディレクトリをマウントします。

docker run --name apache_server -d -p 8000:80 -v C:\Test\my-site\:/usr/local/apache2/htdocs/ httpd 

ブラウザでhttp://localhost:8000/にアクセスすると、「Docker Volume Success ! This file is saved in your PC.」と表示され、ドライブ上のファイルにアクセスできていることを確認できます。

以下のコマンドを実行することで、コンテナの停止と削除、イメージの削除が可能です。

docker stop apache_server
docker rm apache_server
docker image rm httpd

実行した後にC:\Test\my-site\を確認すると、コンテナとイメージを削除してもHTMLファイルが残っています。

Dockerの-vは相対パスが使えない場合があるため、絶対パスで指定します。また、Windowsのパスはバックスラッシュ\を使用しますが、Docker側はスラッシュ/を使用するのが一般的です。

Windows側のパスはカレントディレクトリを指定する場合、次のようにすることもできます。
Powershell: -v ${PWD}:/usr/local/apache2/htdocs/
cmd: -v %cd%:/usr/local/apache2/htdocs/

まとめ

本記事では、Dockerの概要とWindowsで使用するためのDocker desktopのインストール方法、コンテナの起動、停止および削除を行う基本的な操作を解説しました。

Dockerの特徴には以下のものがありました。

  • プログラムや環境をコンテナという単位に隔離する。
  • コンテナどうしは互いに影響しないため、ライブラリ競合が発生しない。
  • 隔離しているため、イメージにすることで配布しやすい。
  • イメージからコンテナを簡単に作成できるため、ステートレスにすることでスケーラビリティを確保できる。
  • コンテナからイメージを作成できるので、修正した後に配布することが簡単。
  • 環境ごとパッケージングできるので、開発環境を共有したり、テスト環境から本番環境に移行するのが簡単。

Dockerのコンテナを扱うためのコマンドには以下がありました。

コマンド説明
docker runコンテナの生成と起動
docker startコンテナの起動(再起動)
docker stopコンテナの停止
docker rmコンテナの削除
docker psコンテナ一覧の表示
docker image rmイメージの削除
docker image lsイメージ一覧の表示

最後に、自分で作成したHTMLファイルを表示することを通して、オプション-vを用いてボリュームマウントができることを示しました。

-TECHNOLOGY
-