目次
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
次の順に処理が行われます。
- ローカルに
nginx:1.30イメージがないため(Unable to find image ... locally)、Docker Hub からダウンロードします。 - イメージはいくつものレイヤーで構成されています。
Pull completeの各行は、1 つのレイヤーのダウンロード完了を示します。 - ダウンロードが完了すると、Docker はこのイメージから新しいコンテナを作成し、
webという名前を付けます。 -dを指定するとコンテナはバックグラウンドで実行されるため、コマンドはすぐに終了し、コンテナ ID(長い 16 進数の文字列)だけが表示されます。
オプションの説明
| オプション | 意味 |
|---|---|
-d | detached。バックグラウンドで実行 |
-p 8080:80 | ホストの 8080 ポートをコンテナの 80 ポートに割り当てる |
--name web | コンテナに web という名前を付け、以降はこの名前で操作する |
nginx:1.30 | イメージ名とバージョン(タグ) |
ブラウザーで開く
ブラウザーを開き、http://localhost:8080 を入力します。

通信の経路は、ブラウザー → ホストの 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>

コンテナ内のファイルを直接変更するのは、一時的なテストに限ります。コンテナを削除すると、変更も消えます。正しい方法は、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 をクリックします:

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

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

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

グラフィカルインターフェースは状態の確認に便利ですが、実際の運用ではコマンドを使うのが基本です。コマンドはドキュメントやスクリプトに記述でき、Linux サーバーでもコマンドで操作する必要があります。
Windows ユーザー:コマンドの書き方の違い
このチュートリアルのコマンドは Linux/macOS の bash を基準にしています。Windows でも Docker コマンド自体はまったく同じですが、ターミナル(shell)の構文が異なります。
| 書き方 | Linux / macOS(bash) | Windows PowerShell | Windows 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でコンテナを制御、削除できます。コンテナ内のファイルを直接変更する方法は、一時的なテストに限って使ってください。
練習問題
- nginx をもう1つ起動し、ホストの 8081 に割り当てます:
docker run -d -p 8081:80 --name web2 nginx:1.30。http://localhost:8081を開いて確認してください。 docker psで2つのコンテナが同時に実行され、それぞれ異なるホストポートに割り当てられていることを確認してください。- これら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日