はじめに
Dockerを初めて使う方向けに、コンテナとイメージの違いを押さえながら、実際にコンテナを起動する手順を解説します。
この記事では、まずhello-worldでDockerの動作を確認します。次にNginxのコンテナを起動し、ブラウザからアクセスします。最後に、実行中と終了済みのコンテナの確認方法、ポート公開の役割、コンテナの停止・削除まで試します。
手を動かしながら、次の流れを理解しましょう。
- イメージを取得する
- イメージからコンテナを作成・起動する
- コンテナの状態を確認する
- 必要に応じてポートを公開する
- コンテナを停止・削除する
Dockerとは
Dockerは、アプリケーションとその実行に必要なものをイメージとしてまとめ、コンテナとして実行するための仕組みです。
例えば、チームのメンバーごとに使っているソフトウェアのバージョンが異なると、「自分のPCでは動くのに、ほかの環境では動かない」という問題が起こります。Dockerを使えば、アプリケーションを動かすための設定をイメージや設定ファイルとして共有し、環境をそろえやすくなります。
仮想マシンとコンテナの違い
Dockerのコンテナは、仮想マシンと比較されることがあります。どちらもアプリケーションをほかの環境から分けて動かせますが、分け方が異なります。
仮想マシンでは、仮想マシンごとにゲストOSを起動し、その上でアプリケーションを動かします。一方、LinuxコンテナはコンテナごとにゲストOSを起動しません。同じLinuxカーネルを利用しながら、プロセスやファイルシステムなどを分けて動作します。
| 比較項目 | 仮想マシン | Linuxコンテナ |
|---|---|---|
| OSの扱い | 仮想マシンごとにゲストOSを起動する | コンテナごとにはゲストOSを起動せず、同じLinuxカーネルを利用する |
| アプリの動かし方 | ゲストOSの上で動かす | 隔離されたプロセスとして動かす |
| 起動や資源の使い方 | ゲストOSの起動や管理も必要 | 一般に起動が速く、必要な資源を抑えやすい |
例えば、Webサーバーを三つ動かす場合、仮想マシンではそれぞれにゲストOSを用意する構成が考えられます。コンテナなら、同じカーネルを利用しながら、Webサーバーごとに環境を分けられます。ただし、用途によって必要な隔離の程度は異なるため、コンテナが常に仮想マシンの代わりになるわけではありません。
なお、MacやWindowsのDocker Desktopでこの記事のようなLinuxコンテナを動かすときは、内部でLinux環境を利用します。LinuxコンテナがmacOSやWindowsのカーネルを直接共有するわけではありません。「コンテナは仮想マシンを一切使わない」ではなく、「各コンテナがそれぞれゲストOSを起動しない」と理解してください。
Dockerを使うメリット
- 環境を再現しやすい: 同じイメージを使って、別の環境にもアプリケーションを展開しやすくなります。
- 起動・停止が簡単: コマンドでコンテナを作成し、不要になったら停止・削除できます。
- アプリごとに環境を分けられる: 必要なソフトウェアや設定をコンテナごとに分けて管理できます。
ただし、Dockerを使えばどのPCでも必ず同じように動くわけではありません。CPUの種類、OS、ファイルの扱い、外部サービスの設定などによって、動作が変わる場合もあります。また、Dockerの用語やコマンドを覚える必要があります。
最初に覚えたい用語
イメージ
コンテナを作る元になるものです。アプリケーションの実行に必要なファイルや設定を含みます。公開されているイメージはDocker Hubなどから取得できます。
コンテナ
イメージを元に作成して実行する環境です。同じイメージから複数のコンテナを作れます。イメージとコンテナの関係は、「元になるもの」と「そこから作って動かすもの」と考えると分かりやすいでしょう。
ボリューム
コンテナで使うデータを、コンテナの削除後も残したいときに利用する保存領域です。データベースのデータを保存する場合などに使います。この記事では名前だけ覚えておけば大丈夫です。
Dockerを使う準備
この記事のコマンドを実行するには、Dockerが使える環境が必要です。WindowsやMacでDocker Desktopを利用している場合は、先にDocker Desktopを起動してください。以下のコマンドはターミナルで実行します。
まず、Dockerのコマンドが使えるか確認します。
docker -v
バージョン番号が表示されれば、Dockerのコマンドは利用できます。ただし、これだけではコンテナを動かすDocker本体が起動しているか分かりません。続けて確認しましょう。
docker info
Dockerの情報が表示されれば、Docker本体に接続できています。「Dockerデーモンに接続できない」といったエラーが出た場合は、Docker Desktopが起動しているか確認し、起動完了後にもう一度実行してください。
hello-worldコンテナを起動する
最初は、Dockerの動作確認用イメージであるhello-worldを使います。
docker pull hello-world
docker pullは、イメージを取得するコマンドです。取得したイメージを使い、次のコマンドでコンテナを起動します。
docker run hello-world
実行結果に次の文字が含まれていれば成功です。
Hello from Docker!
docker runは、指定したイメージからコンテナを作成して起動します。今回のhello-worldはメッセージを表示したら処理を終えるため、起動後すぐにコンテナも終了します。
なお、事前にdocker pullを実行しなくても、指定したイメージが手元にない場合はdocker runが取得を試みます。今回は「取得」と「起動」の操作を分けて確認するため、先にdocker pullを実行しました。
実行中と終了済みのコンテナを確認する
現在実行中のコンテナを確認します。
docker ps
hello-worldはすでに処理を終えているため、通常はこの一覧に表示されません。終了したコンテナも含めて確認するには、-aを付けます。
docker ps -a
一覧のIMAGE欄にhello-worldがあり、STATUS欄がExitedになっていれば、コンテナは正常に終了しています。hello-worldを何度か実行している場合は、複数の行が表示されることもあります。
ここで覚えておきたいのは、コンテナの停止と削除は別ということです。処理を終えたコンテナも、通常は削除されずdocker ps -aで確認できます。
Nginxコンテナを起動する
次は、起動したままWebページを配信するNginxを使います。NginxはWebサーバーのソフトウェアです。次のコマンドを実行してください。
docker run --name nginx -p 8080:80 -d nginx
最後のnginxは使うイメージの名前です。イメージが手元にない場合は、Dockerが取得してからコンテナを起動します。
このコマンドで指定したオプションを確認しましょう。
| オプション | 役割 |
|---|---|
--name nginx | コンテナにnginxという名前を付ける |
-p 8080:80 | PCの8080番ポートをコンテナの80番ポートに接続する |
-d | コンテナをバックグラウンドで実行する |
ブラウザで次のURLを開いてください。
http://localhost:8080/
Nginxの初期ページが表示されれば、コンテナ内のWebサーバーへアクセスできています。もし表示されない場合は、コンテナが起動しているかdocker psで確認してください。また、PCの8080番ポートを別のアプリが使っていると、コンテナを起動できない場合があります。
-pを付けた場合と付けない場合を比べる
先ほどの-p 8080:80では、左側の8080が自分のPC側、右側の80がコンテナ側のポート番号です。
まずは実行中のコンテナを確認します。
docker ps
nginxの行のPORTS欄に、PCの8080番ポートからコンテナの80番ポートへの対応が表示されます。表示の形式は環境によって異なります。
次に、Nginxコンテナを停止して削除します。
docker stop nginx
docker rm nginx
docker stopはコンテナを停止するコマンドです。停止したコンテナはdocker ps -aで確認できます。docker rmを実行するとコンテナが削除されますが、取得済みのNginxイメージは残ります。
今度は-pを指定せずに、別の名前でNginxを起動します。
docker run --name nginx-no-port -d nginx
docker ps
Nginxは起動しますが、PORTS欄にPCの8080番ポートへの対応は表示されません。この状態でhttp://localhost:8080/へアクセスしても、このコンテナのNginxには接続できません。ほかのアプリが8080番ポートを使っていなければ、接続エラーになります。
Webサーバーがコンテナ内で起動していることと、自分のPCからアクセスできることは別です。PCからアクセスするには、-p 8080:80のようにポートを公開します。
確認が終わったら、実験用のコンテナも停止して削除しましょう。
docker stop nginx-no-port
docker rm nginx-no-port
まとめ
この記事では、hello-worldでDockerの動作を確認し、Nginxのコンテナを起動してブラウザからアクセスしました。
docker pullでイメージを取得できるdocker runでイメージからコンテナを作成・起動できるdocker psで実行中、docker ps -aで終了済みを含むコンテナを確認できる-pでPCからコンテナへアクセスするためのポートを公開できるdocker stopで停止し、docker rmでコンテナを削除できる
次はDockerfileの書き方とビルド方法を学ぶと、自分でイメージを作れるようになります。複数のコンテナをまとめて起動したい場合は、Docker Compose入門へ進んでください。