【Docker基礎】デーモンとして動くコンテナ

 Docker コンテナを起動する際、どのように動き続けるか(あるいは一度実行してすぐ終了するか)は、コンテナの種類や目的によって異なります。
 「デーモン」とは、UNIX や Linux 上で常に待ち受け動作を行うプログラムを指し、Webサーバーやデータベースサーバーなどがその代表例です。ここでは、コンテナを一度実行して終了するのか、デーモンとして動かすのかに応じて、どうオプションを指定すればよいかを解説します。

一度限り実行するコンテナとデーモンの違い

  • 一度限り実行するコンテナ
    ・実行してすぐに終了するコマンドやスクリプトをコンテナ化。
    ・例: 「1回だけバックアップを取る」や「ユーティリティプログラムを走らせて結果を取得後終了」。
    ・短時間で終了するため、-d(バックグラウンド)-i, -t(対話的モード) が不要なことも多い。
  • デーモンとして動くコンテナ
    ・UNIX / Linux のデーモンのように、常に待機して長時間稼働するプログラム。
    ・例: Webサーバー(Nginx, Apache)、DBサーバー(MySQL, PostgreSQL)など。
    ・コンテナを起動したら、そのまま動き続けてもらいたいので、-d(バックグラウンド実行) をよく使う。

よく登場するオプションの意味

オプション意味
-dデタッチド(detached)モード。コンテナをバックグラウンドで実行し、制御を戻す。デーモン運用に最適。
-iインタラクティブ(interactive)モード。標準入力を受け付け、コンテナ内でキーボード入力ができる。
-tTTY(擬似ターミナル)モード。コンテナに疑似ターミナルを割り当てる。-it と一緒に使う場合が多い。

なぜ -d-it は同時に使わないことが多い?

  • -d は「コンテナがバックグラウンドで動作する」
  • -it は「ターミナルを直接操作できる」
     同時に使うと、「バックグラウンドで動かしながら、しかもターミナル操作もしたい」という矛盾が生じやすいため、基本的には排他的に使われることが多いです。

使い分けの例

一度だけ処理するコンテナ(ユーティリティ用途など)

docker run ubuntu echo "Hello, Docker!"
  • イメージubuntu
  • 実行コマンドecho "Hello, Docker!"
  • 特徴
    ・一度出力したらコンテナは即終了するため、特に -d-it は不要
    ・短時間で終わるジョブ系の処理に向いている。

デーモンとして動かすコンテナ(Webサーバーなど)

docker run -d -p 8080:80 --name my-nginx nginx
  • オプション-d(バックグラウンド)、-p 8080:80(ポートマッピング)、--name(コンテナ名を指定)
  • 特徴
    ・nginx がデーモンとして常駐し、8080 番ポート経由でアクセスを受け付ける。
    -d を付けないと、コンテナがターミナルをブロックして、ホスト側の操作ができなくなってしまう。

3-3. コンテナ内を対話的に操作(-it)

docker run -it ubuntu /bin/bash
  • オプション-it → インタラクティブ + TTY
  • 意味
    ・Ubuntu イメージでコンテナを起動し、ターミナル(bash)に直接入る。
    ・コンテナ内でコマンドを色々実行したい場合に最適
  • 終了方法
    exit コマンドでコンテナ内のシェルを抜けるとコンテナも終了する(デフォルト設定の場合)。

まとめ

  • -d(バックグラウンド) はデーモンサービス向け
    ・Webサーバーや DB サーバーなど、長時間稼働が必要なコンテナで利用
  • -it(対話モード + TTY) はコンテナ内部を操作したい場合
    ・シェル操作やデバッグ、コマンドラインでの実験など
  • これらのオプションは必須ではない
    ・1回実行して終わるジョブ系コンテナなら、docker run のみで十分

 結局、コンテナがデーモンとして動き続けるのか単発作業で即終了するのか、あるいは対話的な操作が必要なのかによって、オプションの組み合わせが変わってきます。自分が動かしたいアプリケーションの性質を見極め、-d or -it or 何も付けない を適切に選択しましょう。