aws

【A-22】Docker関連のコラム①

Dockerについてより深く理解するために、コンテナの内部構造や仕様について学びます。

コンテナのPIDについて

コンテナのPIDは常に1

通常のLinuxシステムでは、OSが起動するとinit(またはsystemd)が PID 1 となりますが、Dockerコンテナでは、コンテナ内の最初に実行されるプロセスが PID 1 となります

例えば、nginx のコンテナを起動し、PIDを確認すると:

docker run -d --name test-nginx nginx
docker exec -it test-nginx ps aux

出力例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root 1 0.0 0.0 12348 2024 ? Ss 10:00 0:00 nginx: master process nginx -g daemon off;

nginxPID 1 になっているのが確認できます。

他のコンテナとの相互依存はない

  • 異なるコンテナのプロセスは、相互に影響を与えない(異なるPID名前空間を持つ)。
  • コンテナ内で PID 1 が終了すると、そのコンテナ自体も終了する
  • プロセスレベルの直接的な相互依存はないが、ネットワークやボリュームを介して連携は可能

Dockerの新旧コマンドについて

Dockerのバージョンが進むにつれ、一部のコマンドが変更されています。
ただし、現状新旧どちらのコマンドも利用可能です。
例えば、従来の docker psdocker images というコマンドがdocker containerdocker image に置き換わっています。

コマンド変更の背景には、docker *** というdocker直下のコマンドが増えすぎたことが原因とされています。

新旧コマンドの比較

従来のコマンド新しいコマンド
docker psdocker container ls
docker imagesdocker image ls
docker rm <ID>docker container rm <ID>
docker rmi <ID>docker image rm <ID>

業務として、個人で利用する場合は使いやすい従来コマンドで行う場合もありますが、手順書やwikiなどのドキュメントは新コマンドで記載しておきましょう。

Dockerのimageとレイヤ、ファイルシステムについて

Dockerイメージはレイヤの重ね合わせ

Dockerのイメージは、複数のレイヤ(階層)を重ねることで構築される 仕組みになっています。
例えば、以下のようなイメージを考えてみましょう。

  1. Ubuntu(ベースイメージ)
    • /home
    • /usr/local/etc
    • /bin
  2. PHP(アプリケーションレイヤ)
    • /usr/local/bin/php
  3. 設定ファイル(カスタム設定)
    • /usr/local/etc/php.ini

このように、ベースとなるOS(Ubuntu)の上に、PHPの実行環境を追加し、さらに php.ini の設定を適用することで、カスタマイズされたイメージ を作ることができます。

Dockerのレイヤ構造では、下のレイヤ(Ubuntu)が変更されない限り、その上のレイヤ(PHPや設定ファイル)だけを変更することが可能 です。

Ubuntu + PHP の具体例

Dockerfileで Ubuntu + PHP + 設定ファイル のイメージを作成する例を見てみましょう。

dockerfile
FROM ubuntu:latest # ベースイメージ
RUN apt-get update && apt-get install -y php # PHPをインストール
COPY php.ini /usr/local/etc/php.ini # 設定ファイルをコピー

このように、Ubuntu(ベース)→ PHP(アプリケーション)→ 設定ファイル(カスタマイズ) というレイヤ構造になります。

これがDockerイメージの仕組み です。


Ubuntu + Ruby などの別の組み合わせも可能

このレイヤ構造を応用すれば、Ubuntu + PHP だけでなく、Ubuntu + Ruby のような組み合わせも作れます。

例えば、Ubuntuの上にRubyを追加する Dockerfile は以下のようになります。

dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y ruby

このように、異なるソフトウェアや設定を追加しながら、自分の用途に合わせた環境を作成できます。