目次

Docker コンテナ実行入門:docker run で最初のコンテナを起動する

この節では nginx ウェブサーバーを実行し、コンテナの確認、内部への接続、停止、削除の方法を学びます。各手順には実際の実行結果を示します。

nginx を起動する

docker run -d -p 8080:80 --name web nginx:1.30
$ docker run -d -p 8080:80 --name web nginx:1.30
Unable to find image 'nginx:1.30' locally
1.30: Pulling from library/nginx
ecc510c1e359: Pull complete
f4616bb1be1c: Pull complete
f1a6a629b824: Pull complete
3d774efa34e3: Pull complete
cb44c3fe542b: Pull complete
121907e00c1c: Pull complete
220a6ac36368: Pull complete
Digest: sha256:9bf97bd7714f5e24c1ccd545ecb9eb5435cb6d109c97cebb15e7e455e0239edb
Status: Downloaded newer image for nginx:1.30
b470f4d4563701824e59040cdfcd2154b4bbcca581e6d2d75cae5f2c23dbcfda

次の順に処理が行われます。

  1. ローカルに nginx:1.30 イメージがないため(Unable to find image ... locally)、Docker Hub からダウンロードします。
  2. イメージはいくつものレイヤーで構成されています。Pull complete の各行は、1 つのレイヤーのダウンロード完了を示します。
  3. ダウンロードが完了すると、Docker はこのイメージから新しいコンテナを作成し、web という名前を付けます。
  4. -d を指定するとコンテナはバックグラウンドで実行されるため、コマンドはすぐに終了し、コンテナ ID(長い 16 進数の文字列)だけが表示されます。

オプションの説明

オプション意味
-ddetached。バックグラウンドで実行
-p 8080:80ホストの 8080 ポートをコンテナの 80 ポートに割り当てる
--name webコンテナに web という名前を付け、以降はこの名前で操作する
nginx:1.30イメージ名とバージョン(タグ)

ブラウザーで開く

ブラウザーを開き、http://localhost:8080 を入力します。

nginx のデフォルトのウェルカムページ
ブラウザーで http://localhost:8080 を開くと、nginx のウェルカムページが表示されます

通信の経路は、ブラウザー → ホストの 8080 → Docker がコンテナの 80 に転送 → コンテナ内の nginx です。

ターミナルで curl を使ってテストすることもできます。

$ curl -s http://localhost:8080 | head -n 4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

実行中のコンテナを確認する:docker ps

$ docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED         STATUS         PORTS                                     NAMES
b470f4d45637   nginx:1.30   "/docker-entrypoint.…"   7 seconds ago   Up 7 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   web
項目意味
CONTAINER IDコンテナ ID の先頭 12 文字。コマンドでは名前の代わりに使えます
IMAGE使用しているイメージ
COMMANDコンテナの起動時に実行されるコマンド
CREATED / STATUS作成時刻と現在の状態(Up は実行中を表します)
PORTSポートの割り当て。0.0.0.0:8080->80/tcp は先ほどの -p 8080:80 を表します
NAMESコンテナ名

ログを確認する:docker logs

nginx は各リクエストをログに記録します。先ほどブラウザーと curl で 1 回ずつ接続しました。

$ docker logs web
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2026/10/12 14:38:25 [notice] 1#1: using the "epoll" event method
2026/10/12 14:38:25 [notice] 1#1: nginx/1.30.5
2026/10/12 14:38:25 [notice] 1#1: built by gcc 14.2.0 (Debian 14.2.0-19)
2026/10/12 14:38:25 [notice] 1#1: OS: Linux 5.4.0-216-generic
2026/10/12 14:38:25 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2026/10/12 14:38:25 [notice] 1#1: start worker processes
2026/10/12 14:38:25 [notice] 1#1: start worker process 28
172.17.0.1 - - [12/Oct/2026:14:38:29 +0000] "GET / HTTP/1.1" 200 896 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/130.0.6723.31 Safari/537.36" "-"
172.18.0.1 - - [12/Oct/2026:14:38:31 +0000] "GET / HTTP/1.1" 200 896 "-" "curl/8.22.0" "-"

前半は nginx の起動時のメッセージで、バージョンが nginx/1.30.5 と分かります。最後の 2 行は先ほどのリクエストの記録です。1 行はブラウザー(User-Agent がブラウザー)、もう 1 行は curl からのものです。-f を付けると、新しいログを継続して追跡できます(終了するには Ctrl + C を押します)。

docker logs -f web

コンテナに入る:docker exec

docker exec は実行中のコンテナ内でコマンドを実行します:

$ docker exec web nginx -v
nginx version: nginx/1.30.5

$ docker exec web ls /usr/share/nginx/html
50x.html
index.html

-it を付けると、対話型シェルを起動して中を自由に確認できます:

$ docker exec -it web bash
root@b470f4d45637:/# cat /etc/os-release | head -n 2
PRETTY_NAME="Debian GNU/Linux 13 (trixie)"
NAME="Debian GNU/Linux"
root@b470f4d45637:/# ls /etc/nginx
conf.d
fastcgi_params
mime.types
modules
nginx.conf
scgi_params
uwsgi_params
root@b470f4d45637:/# ps aux
bash: line 1: ps: command not found
root@b470f4d45637:/# exit
exit

出力から、次のことがわかります:

  • nginx 公式イメージは Debian 13(trixie) をベースにしています。
  • プロンプトの b470f4d45637 はコンテナのホスト名で、デフォルトではコンテナ ID です。
  • コンテナ内に**ps コマンドはありません**。公式イメージには nginx の実行に必要なものだけが含まれ、よく使われるツールの多くは取り除かれています。これは正常です。デバッグツールが必要な場合は、一時的にインストールする(apt-get update && apt-get install -y procps)か、docker top を使って外から確認できます。

exit と入力して終了しても、コンテナは実行し続けます。

Webページの内容を変更する

コンテナ内でホームページを書き換え、ブラウザーを再読み込みします:

$ docker exec web sh -c 'echo "<h1>Hello from my first container</h1>" > /usr/share/nginx/html/index.html'

$ curl -s http://localhost:8080
<h1>Hello from my first container</h1>
変更後の nginx ホームページ
コンテナ内の index.html を変更すると、ブラウザーにすぐ新しい内容が表示されます

コンテナ内のファイルを直接変更するのは、一時的なテストに限ります。コンテナを削除すると、変更も消えます。正しい方法は、Webページのファイルをコンテナにマウントする(Volume を参照)か、Dockerfile に記述することです。

停止、起動、削除

$ docker stop web
web

$ docker ps -a
CONTAINER ID   IMAGE         COMMAND                  CREATED              STATUS                              PORTS     NAMES
b470f4d45637   nginx:1.30    "/docker-entrypoint.…"   12 seconds ago       Exited (0) Less than a second ago             web
786dd898c04b   hello-world   "/hello"                 About a minute ago   Exited (0) About a minute ago                 frosty_shirley

$ docker start web
web

$ curl -s http://localhost:8080
<h1>Hello from my first container</h1>

$ docker rm web
Error response from daemon: cannot remove container "web": container is running: stop the container before removing or force remove

$ docker rm -f web
web

$ docker ps -a
CONTAINER ID   IMAGE         COMMAND    CREATED              STATUS                          PORTS     NAMES
786dd898c04b   hello-world   "/hello"   About a minute ago   Exited (0) About a minute ago             frosty_shirley
  • docker stop:コンテナを停止します。コンテナは残り、docker ps -a に表示され、状態は Exited になります。
  • docker start:既存のコンテナを再起動します。先ほど変更したホームページも残っています。
  • docker rm:停止したコンテナを削除します。実行中のコンテナに使うと、上記の container is running エラーが表示されます。先に docker stop を実行するか、-f を付けて強制削除してください。

docker ps -a の一覧には、前の節で実行した hello-world コンテナも表示されています。実行後に終了しました(Exited (0))が、削除されていません。--name を指定しなかったコンテナには、frosty_shirley のようなランダムな名前が付けられます。

コンテナを削除すると、先ほど変更したホームページも一緒に消えます。同じイメージから新しいコンテナを起動すると、元の nginx のウェルカムページが表示されます。

単発のコマンドを実行する

すべてのコンテナを長時間実行する必要はありません。次のコンテナは、コマンドを1つ実行して終了します。--rm を付けると、終了後に自動で削除されます:

$ docker run --rm ubuntu:26.04 cat /etc/os-release
Unable to find image 'ubuntu:26.04' locally
26.04: Pulling from library/ubuntu
06ad70e463aa: Pull complete
4e07a0f12b2c: Pull complete
Digest: sha256:f144425ff09be612d6d9ad965196e9cdc23dae1f42110a8a11a3e9a8198759f7
Status: Downloaded newer image for ubuntu:26.04
PRETTY_NAME="Ubuntu 26.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="26.04"
VERSION="26.04.1 LTS (Resolute Raccoon)"
VERSION_CODENAME=resolute
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=resolute
LOGO=ubuntu-logo

この Ubuntu コンテナには Ubuntu のユーザー空間ファイルだけがあり、起動プロセスもデスクトップもありません。起動から終了まで、ほんの一瞬です。

Docker Desktop のグラフィカルインターフェースを使う

Windows と macOS では、上記の各手順を Docker Desktop でマウスを使って実行することもできます。

イメージを検索してダウンロードする

上部の検索ボックスにイメージ名を入力し、使いたいバージョン(Tag)を選んで Pull をクリックしてダウンロードするか、そのまま Run をクリックします:

Docker Desktop でイメージを検索
Docker Desktop でイメージを検索し、右側で Tag を選んで Pull または Run をクリックします。画像出典:Docker 公式ドキュメント(Apache-2.0)

コンテナを設定して実行する

Run をクリックしてから Optional settings を展開すると、コンテナ名、ポート、Volume、環境変数を設定できます。これは docker run の --name、-p、-v、-e に対応します:

Docker Desktop で新しいコンテナを実行する設定ウィンドウ
Host port に 8080 を入力します。これは docker run -p 8080:80 と同じです。画像出典:Docker 公式ドキュメント(Apache-2.0)

コンテナの確認と管理

左側のメニューにある Containers には、すべてのコンテナが表示されます。これは docker ps -a と同じです。Port(s) 列のリンクをクリックするとブラウザーで直接開けます。右側のボタンから停止、再起動、削除ができます。

Docker Desktop のコンテナ一覧
Containers 画面:状態、ポート、操作ボタン。画像出典:Docker 公式ドキュメント(Apache-2.0)

コンテナを選択すると、Logs(docker logs と同じ)、Exec(docker exec と同じ)、Files(コンテナ内のファイルを閲覧)などのタブが表示されます。

Docker Desktop のコンテナの Files タブ
Files タブでは、コンテナ内のファイルを直接閲覧、編集できます。画像出典:Docker 公式ドキュメント(Apache-2.0)

グラフィカルインターフェースは状態の確認に便利ですが、実際の運用ではコマンドを使うのが基本です。コマンドはドキュメントやスクリプトに記述でき、Linux サーバーでもコマンドで操作する必要があります。

Windows ユーザー:コマンドの書き方の違い

このチュートリアルのコマンドは Linux/macOS の bash を基準にしています。Windows でも Docker コマンド自体はまったく同じですが、ターミナル(shell)の構文が異なります。

書き方Linux / macOS(bash)Windows PowerShellWindows CMD
現在のディレクトリ$(pwd)${PWD}%cd%
コマンドの改行行末に \行末に `行末に ^
環境変数$HOME$env:USERPROFILE%USERPROFILE%
ファイルからの入力 <可能非対応可能

このチュートリアルでは、書き方が異なるコマンドに Linux / macOS、Windows PowerShell、Windows CMD の3つのタブがあります。タブを選択すると、ページ全体が同じ書き方に切り替わります。たとえば、現在のディレクトリにある site を nginx にマウントする場合は次のようにします。

docker run -d -p 8080:80 -v "$(pwd)/site:/usr/share/nginx/html:ro" nginx:1.30
docker run -d -p 8080:80 -v "${PWD}/site:/usr/share/nginx/html:ro" nginx:1.30
docker run -d -p 8080:80 -v "%cd%/site:/usr/share/nginx/html:ro" nginx:1.30

よくある落とし穴をいくつか紹介します(実際のエラーメッセージはよくあるエラーメッセージを参照してください)。

  • PowerShell で "$PWD:/app" と書くとエラーになります。必ず "${PWD}:/app" と書いてください。
  • PowerShell は < に対応していません。データベースの復元では docker cp を使ってください。各データベースの章に書き方を掲載しています。
  • Windows で編集した shell スクリプトの改行コードが CRLF の場合、コンテナ内で実行すると no such file or directory が発生します。

WSL(Ubuntu など)のターミナルから Docker Desktop を使うこともできます。その場合は、このチュートリアルの Linux 用の書き方をそのまま使えます。

まとめ

  • docker run -d -p ホストポート:コンテナポート --name 名前 イメージ は、コンテナをバックグラウンドで起動し、ポートを割り当てます。
  • docker ps で実行中のコンテナを確認できます。-a を付けると停止済みのコンテナも含まれます。
  • docker logs で出力を確認し、docker exec -it コンテナ sh でコンテナに入ります。
  • docker stop / start / rm -f でコンテナを制御、削除できます。コンテナ内のファイルを直接変更する方法は、一時的なテストに限って使ってください。

練習問題

  1. nginx をもう1つ起動し、ホストの 8081 に割り当てます:docker run -d -p 8081:80 --name web2 nginx:1.30。http://localhost:8081 を開いて確認してください。
  2. docker ps で2つのコンテナが同時に実行され、それぞれ異なるホストポートに割り当てられていることを確認してください。
  3. これら2つのコンテナを削除します:docker rm -f web web2。

次の節では、イメージについてさらに詳しく説明します。名前とタグのルール、ダウンロード、確認、削除の方法を学びます。

よくある質問

http://localhost:8080 にアクセスできない場合は?

まず docker ps でコンテナが実行中で、PORTS 欄に 0.0.0.0:8080->80/tcp があることを確認します。8080 が別のプログラムに使われていると、docker run は port is already allocated と表示します。その場合は -p 8081:80 に変更してください。

コンテナ内に ps や vim などのコマンドがないのはなぜですか?

公式イメージにはサービスの実行に必要なものだけが含まれているため、イメージを小さく保ち、脆弱性を減らせます。デバッグ時は docker exec でイメージに含まれるツールを実行するか、ツールを備えた別のコンテナを起動できます。

コンテナ ID と名前は相互に置き換えて使えますか?

はい。コマンドでは名前のほか、他のコンテナと重複しない範囲で ID の先頭部分も使えます。

更新日 2026年10月14日