このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。
【Docker入門】デタッチモードでコンテナを起動
ここでは、コンテナのでタッチモードでの起動について解説していきます。
コンテナのライフサイクルは、次のように遷移します。
①イメージのダウンロード(pull)
↓
②コンテナの作成
↓
③コンテナの実行
↓
④コンテナの停止
↓
⑤コンテナの削除
コンテナのライフサイクルの詳細な解説は「Dockerの処理の流れ(ライフサイクル)」で行うことにして、ここでは、簡単に①~④までを順に試していき、③コンテナの実行のところで、デタッチモードについて詳しく解説します。
①イメージのダウンロード(pull)
「nginx」イメージの最新バージョンをpull します。
「docker pull nginx」コマンドを実行します。タグを指定せずに実行するため、「latest」バージョン、つまり、最新がpull されます。
PS C:\Users\joeac> docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
e1caac4eb9d2: Pull complete
88f6f236f401: Pull complete
c3ea3344e711: Pull complete
cc1bb4345a3a: Pull complete
da8fa4352481: Pull complete
c7f80e9cdab2: Pull complete
18a869624cb6: Pull complete
Digest: sha256:c26ae7472d624ba1fafd296e73cecc4f93f853088e6a9c13c0d52f6ca5865107
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
What's Next?
View a summary of image vulnerabilities and recommendations → docker scout quickview nginx
ダウンロードしたイメージを確認します。
「docker image ls」コマンドを実行します。
PS C:\Users\joeac> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e4720093a3c1 3 weeks ago 187MB
②コンテナの作成と③コンテナの実行
「docker container run」コマンドを使って、コンテナの作成と実行を行います。
まず、「-d」オプションのデタッチモードを指定せずに、以下のコマンドを実行してみます。
docker container run --name webserver1 -p 8080:80 nginx
PS C:\Users\joeac> docker container run --name webserver1 -p 8080:80 nginx
/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
2024/03/08 05:11:22 [notice] 1#1: using the "epoll" event method
2024/03/08 05:11:22 [notice] 1#1: nginx/1.25.4
2024/03/08 05:11:22 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2024/03/08 05:11:22 [notice] 1#1: OS: Linux 5.15.146.1-microsoft-standard-WSL2
2024/03/08 05:11:22 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2024/03/08 05:11:22 [notice] 1#1: start worker processes
2024/03/08 05:11:22 [notice] 1#1: start worker process 29
2024/03/08 05:11:22 [notice] 1#1: start worker process 30
2024/03/08 05:11:22 [notice] 1#1: start worker process 31
2024/03/08 05:11:22 [notice] 1#1: start worker process 32
2024/03/08 05:11:22 [notice] 1#1: start worker process 33
2024/03/08 05:11:22 [notice] 1#1: start worker process 34
2024/03/08 05:11:22 [notice] 1#1: start worker process 35
2024/03/08 05:11:22 [notice] 1#1: start worker process 36
2024/03/08 05:11:22 [notice] 1#1: start worker process 37
2024/03/08 05:11:22 [notice] 1#1: start worker process 38
2024/03/08 05:11:22 [notice] 1#1: start worker process 39
2024/03/08 05:11:22 [notice] 1#1: start worker process 40
2024/03/08 05:11:22 [notice] 1#1: start worker process 41
2024/03/08 05:11:22 [notice] 1#1: start worker process 42
2024/03/08 05:11:22 [notice] 1#1: start worker process 43
2024/03/08 05:11:22 [notice] 1#1: start worker process 44
2024/03/08 05:11:22 [notice] 1#1: start worker process 45
2024/03/08 05:11:22 [notice] 1#1: start worker process 46
2024/03/08 05:11:22 [notice] 1#1: start worker process 47
2024/03/08 05:11:22 [notice] 1#1: start worker process 48
コマンドの意味は以下のとおりです。
docker container run | --name webserver1 | -p 8080:80 | nginx |
コマンド本体 | コンテナの名前:webserver1 (オプション) | ポート番号 (オプション) | イメージ名:nginx (パラメータ) |
コンテナの名前に「--name」オプション、「-p」オプションでポート番号を指定しています。また、パラメータを「nginx」としてイメージ名を指定しています。
「-p」オプションについて
「-p」オプションは、ポート番号を指定するためのものです。
ホストのポート番号とコンテナのポート番号を関連付けます。
「 8080:80 」の指定の意味ですが、
「 8080:80 」・・・ホストが 8080 番、コンテナが 80 番
となります。
デタッチモードについて
ところで、
「docker container run --name webserver1 -p 8080:80 nginx
」コマンドを実行したら、PowerShellのプロンプトが以下のようになって、プロンプトへのキー入力を受け付けないようになっています。
(省略)
2024/03/08 05:11:22 [notice] 1#1: start worker process 46
2024/03/08 05:11:22 [notice] 1#1: start worker process 47
2024/03/08 05:11:22 [notice] 1#1: start worker process 48
← キー入力ができなくなっている
デタッチモードで起動しない場合、フォアグラウンドで実行さるため、PowerShellで他のコマンドを実行できません。
動作確認
Webブラウザを起動します。
URLに「http://localhost:8080/」と入力します。
下図の画面が表示されたら成功です。
PowerShellのプロンプトを確認します。
HTTPの通信状況が出力されています。
(省略)
2024/03/08 05:11:22 [notice] 1#1: start worker process 48
172.17.0.1 - - [08/Mar/2024:05:16:42 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0" "-"
2024/03/08 05:16:42 [error] 29#29: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "localhost:8080", referrer: "http://localhost:8080/"
172.17.0.1 - - [08/Mar/2024:05:16:42 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "http://localhost:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0" "-"
「Ctrl」+「c」:④コンテナの停止
「Ctrl」+「c」キーを入力するとコンテナを停止させることができます。
「Ctrl」+「c」キーを入力します。すると、コンテナが停止して、PowerShell に、以下のように出力されます。
(省略)
2024/03/08 06:14:00 [notice] 1#1: signal 2 (SIGINT) received, exiting
2024/03/08 06:14:00 [notice] 33#33: exiting
(省略)
2024/03/08 06:14:00 [notice] 1#1: signal 29 (SIGIO) received
2024/03/08 06:14:00 [notice] 1#1: signal 29 (SIGIO) received
2024/03/08 06:14:00 [notice] 1#1: signal 17 (SIGCHLD) received from 35
2024/03/08 06:14:00 [notice] 1#1: worker process 35 exited with code 0
2024/03/08 06:14:00 [notice] 1#1: exit
・Webブラウザをリーロードします。
コンテナが停止しているため、Webserver1に接続できず、下図のように「Welcome to nginx!」と表示されなくなります。
デタッチモードでコンテナを起動する。
コンテナは「docker start webserver1」コマンドでも起動させることができますが、「docker container run」コマンドを使ってみます。
先ほどのコマンドに「-d」オプションを付け加えます。「webserver1」を「webserver2」と変更しているところも注意してください。
docker container run --name webserver1 -p 8080:80 nginx
↓
docker container run --name webserver2 -d -p 8080:80 nginx
「-d」オプション
「-d」オプションを指定するとデタッチモードでコンテナを起動させることができます。このモードを指定することでバックグラウンドでコンテナを起動させることができます。
バックグラウンドで起動させると、引き続き、PowerShellでコマンドを実行できるため、他のサービスを同時に実行させることができます。
それでは、
「docker container run --name webserver2 -d -p 8080:80 nginx
」コマンドを実行してみます。
PS C:\Users\joeac> docker container run --name webserver2 -d -p 8080:80 nginx
64391dfbf24acd57143bffcea1a09f53a78814156cd3fa4c84c43158b3f24a04
PS C:\Users\joeac> # コマンドの入力ができる
nginxのイメージが既にあるため、先ほどよりも出力される内容が少なくなっています。
・Webブラウザでリロードします。
webserver2に接続できるため、下図のように「Welcome to nginx!」が表示されます。
コンテナとイメージの確認
コンテナの一覧を確認します。
「docker container ls -a」コマンドを実行します。
出力内容から、webserver1が停止しており、webserver2が起動していることが分かります。
イメージの一覧を確認します。
「docker image ls」コマンドを実行します。
PS C:\Users\joeac> docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest e4720093a3c1 3 weeks ago 187MB
nginxイメージが1つだけあります。
webserver1コンテナとwebserver2コンテナがあり、コンテナが2つありますが、nginxイメージは1つだけです。それは、2つのコンテナが1つのイメージを使いまわしているからです。それは、コンテナの一覧のIMAGE列で確認できます。
④コンテナの停止
webserver2コンテナを停止させます。
「docker stop」コマンド
「docker stop webserver2」コマンドを実行します。
PS C:\Users\joeac> docker stop webserver2
webserver2
「docker container ls -a」コマンドでコンテナの一覧を確認します。
PS C:\Users\joeac> docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
facb8262f20f nginx "/docker-entrypoint.…" 6 hours ago Exited (0) 56 seconds ago webserver2
18cbe71fe4a8 nginx "/docker-entrypoint.…" 6 hours ago Exited (0) 6 hours ago webserver1
webserver2のSTATUSがExitedになっていることから、webserver2コンテナが停止していることが確認できます。