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;
nginx
が PID 1
になっているのが確認できます。
他のコンテナとの相互依存はない
- 異なるコンテナのプロセスは、相互に影響を与えない(異なるPID名前空間を持つ)。
- コンテナ内で
PID 1
が終了すると、そのコンテナ自体も終了する。 - プロセスレベルの直接的な相互依存はないが、ネットワークやボリュームを介して連携は可能。
Dockerの新旧コマンドについて
Dockerのバージョンが進むにつれ、一部のコマンドが変更されています。
ただし、現状新旧どちらのコマンドも利用可能です。
例えば、従来の docker ps
や docker images
というコマンドがdocker container
や docker image
に置き換わっています。
コマンド変更の背景には、docker ***
というdocker直下のコマンドが増えすぎたことが原因とされています。
新旧コマンドの比較
従来のコマンド | 新しいコマンド |
---|---|
docker ps | docker container ls |
docker images | docker image ls |
docker rm <ID> | docker container rm <ID> |
docker rmi <ID> | docker image rm <ID> |
業務として、個人で利用する場合は使いやすい従来コマンドで行う場合もありますが、手順書やwikiなどのドキュメントは新コマンドで記載しておきましょう。
Dockerのimageとレイヤ、ファイルシステムについて
Dockerイメージはレイヤの重ね合わせ
Dockerのイメージは、複数のレイヤ(階層)を重ねることで構築される 仕組みになっています。
例えば、以下のようなイメージを考えてみましょう。
- Ubuntu(ベースイメージ)
/home
/usr/local/etc
/bin
- PHP(アプリケーションレイヤ)
/usr/local/bin/php
- 設定ファイル(カスタム設定)
/usr/local/etc/php.ini
このように、ベースとなるOS(Ubuntu)の上に、PHPの実行環境を追加し、さらに php.ini
の設定を適用することで、カスタマイズされたイメージ を作ることができます。
Dockerのレイヤ構造では、下のレイヤ(Ubuntu)が変更されない限り、その上のレイヤ(PHPや設定ファイル)だけを変更することが可能 です。
Ubuntu + PHP の具体例
Dockerfileで Ubuntu + PHP + 設定ファイル
のイメージを作成する例を見てみましょう。
dockerfileFROM 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 は以下のようになります。
dockerfileFROM ubuntu:latest
RUN apt-get update && apt-get install -y ruby
このように、異なるソフトウェアや設定を追加しながら、自分の用途に合わせた環境を作成できます。