TECHNOLOGY

Dockerの基礎とコンテナの起動・バインドマウント(Docker入門)

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

目次

Dockerの特徴

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

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

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

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

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

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

メリット

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

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

【セキュリティに関する注意】
コンテナ内のプロセスは、デフォルトではroot(管理者)権限で実行されます。コンテナはホストOSから隔離されていますが、この隔離はカーネルの機能に依存しており、仮想マシンほどの完全な分離ではありません。万が一コンテナから脱出した場合、root権限のままホストOSに影響を及ぼす可能性があります。本番環境では、Dockerイメージを作成する設計図であるDockerfileでUSER命令を使って非rootユーザーでプロセスを実行することが推奨されます。

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

コンテナは、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は、デフォルトでWindowsの起動時に自動で立ち上がる設定になっています。便利な反面、PCの起動が遅くなったり、使っていないときもメモリを消費したりする原因になります。

たまにしかDockerを使わない場合は、以下の手順で自動起動をオフにしておくのがおすすめです。

1. Docker Desktop 画面右上の歯車アイコン(Settings)をクリック。
2. 左メニューの General を選択。
3. 「Start Docker Desktop when you sign in to your computer」のチェックを外す。
4. 右下の Apply をクリック。

これで、必要なときだけDocker Desktopを起動して使うことができるようになります。

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

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」と表示されます。

「It works!」と表示されない場合は、アドレスが間違っていないかを確認しましょう。
原因がコンテナ側にある場合には、後述のdocker logs apache_serverを使用してログを確認することで解決する場合もあります。
ポート番号でエラーが出た場合には、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

溜まったゴミを一括で削除する

Dockerを使っていると、停止したコンテナや使われていないイメージ、ネットワークなどが積み重なり、ディスク容量を圧迫することがあります。これらをまとめて削除して、ディスクをスッキリさせるには以下のコマンドが便利です。

docker system prune

実行すると確認のメッセージがでます。

WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - unused build cache

Are you sure you want to continue? [y/N]

yを押すと実行されます。削除されるのは以下の項目です。

項目削除されるものの定義
コンテナdocker ps -aを実行した際のステータス(STATUS)がExited(停止中)またはCreated(作成済み)のすべてのコンテナ。
ネットワーク「実行中のコンテナ」(ステータスがUp)が一つも繋がっていないすべてのカスタムネットワーク(docker network createで作ったもの)。
イメージタグが付いておらず、どのコンテナ(停止中含む)からも参照されていない状態のイメージ。
docker image lsを実行した際、REPOSITORYとTAGの両方が<none>と表示されているイメージ。
キャッシュイメージ作成(ビルド)時に一時保存された全てのデータ。

以下のものは、オプションなしでは削除されません。

  • 起動中のコンテナ:STATUSがUpになっているものは無視されます。
  • 名前のあるイメージ:REPOSITORY名に具体的な名前(httpdなど)がついているイメージは、コンテナに使われていなくても削除されません。
  • ボリューム(データの実体):コンテナの外に保存されているデータ本体は、このコマンド(オプションなし)では削除されません。

このコマンドは非常に強力です。後からもとに戻すことができないため、実行前に必ず確認してください。

バインドマウント

バインドマウントは、ホスト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公式ドキュメントでは、-vに加えてより明示的な構文である--mountオプションも紹介されています。--mountはキーと値のペアで指定するため、ホスト側パス・コンテナ側パス・読み取り専用設定などが視覚的に区別しやすく、ご指定を防ぎやすいという利点があります。さらに、-v--mountの主な違いとして、-vは存在しないホスト側のパスを指定すると自動的にディレクトリを作成しますが、--mountはエラーを返します。これにより、--mountでは意図しないディレクトリが作られてしまう事故を防げるため安定性は高いです。-vの代わりに--mountを使う場合のコマンドを以下に示します。

docker run --name apache_server -d -p 8000:80 --mount type=bind,source=C:\Test\my-site,target=/usr/local/apache2/htdocs/ httpd

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

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/

バイントマウンド使用時の注意点として、バインドマウントでは、コンテナ内のプロセスがマウントされたホスト側のファイルを自由に読み書きできます。これは、コンテナ内のプロセスがデフォルトでroot権限で動作するためであり、ホスト側の重要なファイルを誤って上書き、削除してしまうリスクがあります。このため、マウント対象は専用のフォルダに限定し、OS全体のディレクトリ(C:\C:\Windowsなど)をマウントしないように注意が必要です。

また、コンテナ側からの書き込みを失せぎたい場合は、読み取り専用オプションを付けることで安全性を高められます。-vの場合は、コンテナ側のパスの末尾に:roを付けます。

-v C:\Test\my-site:/usr/local/apache2/htdocs/:ro

--mountの場合は、readonlyを追加します。

--mount type=bind,source=C:\Test\my-site,target=/usr/local/apache2/htdocs/,readonly

ログの確認

Dockerコンテナはバックグラウンドで動作させることが多いため、エラーが起きても画面に何も表示されないことがあります。その際、コンテナ内部で何が起きているかを確認するために使用するのがdocker logsコマンドです。

このコマンドを使用する際は、「どのコンテナのログを見たいか」という引数(コンテナ名またはID)を必ず一つ指定する必要があります。

docker logs コンテナ名

主な用途は、起動しない原因の調査とアクセスログのリアルタイム確認です。-fをつけると、ログをリアルタイムで継続的に見ることができます。

コンテナを削除(rm)しない限り、停止中のコンテナでも確認できます。

まとめ

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

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

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

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

コマンド説明
docker runコンテナの生成と起動
docker startコンテナの起動(再起動)
docker stopコンテナの停止
docker rmコンテナの削除
docker psコンテナ一覧の表示
docker image rmイメージの削除
docker image lsイメージ一覧の表示
docker system pruneゴミの一括削除
docker logsログの確認

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

次の記事

次の記事はこちらです。Dockerfileの基本とイメージのビルド、マルチステージビルドについて解説します。

関連記事

Dockerfileの書き方入門:独自イメージのビルドとマルチステージビルド(Docker入門)

2026/4/25    

Dockerfileの基本コマンドと役割、効率的なビルドのためのキャッシュの仕組みを解説します。Next.jsの実行を例に、ビルドオプションの使い方から.dockerignoreによる除外設定、マルチステージビルドによるイメージ作成の手順まで、一連の流れを解説した入門記事です。

名前付きボリュームとコンテナ間ネットワーク(Docker入門)

2026/4/29    

Dockerコンテナの「使い捨て」の強みを活かしつつ、データの永続化とコンテナ間通信を実現する方法を解説。名前付きボリュームとバインドマウントの使い分け、ユーザー定義ネットワークによる名前解決の仕組みを、Adminerを使った実践ハンズオン形式で学べます。

-TECHNOLOGY
-