🐳

【Docker基本】コンテナ管理の基本とCLI操作

に公開

はじめに

この投稿では、Dockerを使用したコンテナ管理の基本から、CLIを用いた実践的な操作方法まで、ステップバイステップで解説します。
講座を参考にしながら、実際に手を動かして学んだ内容をまとめています。


1. コンテナの隔離技術とは?

DockerはLinuxの名前空間(namespace)機能を活用して、プロセス・ネットワーク・ファイルシステムなどをホストOSから分離し、軽量かつ安全な実行環境を提供します。

$ docker run -it --rm --name=mycontainer ubuntu:14.04 bash

このように起動されたコンテナは、以下のような分離を確認できます。

🔍 Namespaceと確認コマンド

Namespace 分離対象 確認コマンド例
Mount namespace ファイルシステム df -h
UTS namespace ホスト名 hostname
PID namespace プロセスID空間 ps -ef
Network namespace IP、ポートなど ifconfig
IPC namespace メッセージ通信空間 ipcs(任意)

2. コンテナの隔離技術一覧

分離技術 説明
chroot ルートディレクトリを変更して仮想的なルート環境を作成
pivot_root ルートファイルシステム全体を切り替え、chrootを補完
Mount namespace 名前空間内に独立したファイルシステムツリーを構成
UTS namespace ホスト名の分離を行い、コンテナ毎に独自の名前空間を提供
PID namespace プロセス空間を分離し、コンテナ内部でPID 1からプロセス開始
Network namespace ネットワーク(IP、ルーティング等)を完全に分離
IPC namespace セマフォやメッセージキューなど、プロセス間通信空間を分離

3. コンテナのファイル保存先

コンテナ内部で生成されたファイルは、Dockerのストレージドライバにより次のディレクトリに保存されます。

$ find /var/lib/docker -name mycontainer.txt

一般的に、/var/lib/docker/overlay2以下にオーバーレイファイルとして存在します。


4. Docker CLIによるコンテナ管理

4.1 Dockerfileの作成とビルド

FROM node:20-alpine3.17
RUN apk add --no-cache tini curl
WORKDIR /app
COPY runapp.js .
EXPOSE 6060
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "runapp.js"]
$ docker build -t noderun:1.0 .

4.2 コンテナの起動とポート確認

$ docker run -itd -p 6060:6060 --name=node-run noderun:1.0
$ docker port node-run
6060/tcp -> 0.0.0.0:6060

4.3 docker [container] run [option] docker_image [command] オプション一覧

オプション 説明
-i, --interactive 対話モードを有効にする
-t TTY(端末デバイス)を割り当てる
-d, --detach=true バックグラウンドでコンテナを実行し、コンテナ ID を登録する
--name 実行されるコンテナに名前を付ける(未指定時は自動でランダムに付与される)
--rm コンテナ終了時に自動でコンテナを削除する
--restart コンテナ終了時に適用する再起動ポリシーを指定(noon-failureon-failure:回数nalways
--env, -e コンテナの環境変数を指定(--env-file で複数の変数をファイルで指定可能)
-v, --volume=ホストパス:コンテナパス ホストとコンテナ間の共有ボリュームを設定(バインドマウント)
-h コンテナのホスト名を指定(未指定時はコンテナ ID がホスト名として使用される)
-p [ホストポート]:[コンテナポート], --publish ホストのポートとコンテナのポートを接続
-P, --publish-all=[true | false] コンテナ内の公開(expose)ポートをホストの任意のポートに公開
--workdir, -w コンテナ内の作業ディレクトリを指定

必要であれば、各オプションに対する使用例も追加可能です。希望があればお知らせください。


5. コンテナのリソース監視とログ管理

確認項目 コマンド例
実行中プロセス docker top
リソース状況 docker stats
ログの表示 docker logs -f コンテナ名
ログサイズ制限設定 /etc/docker/daemon.json に設定
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "30m",
    "max-file": "10"
  }
}

6. コンテナとホスト間のファイルコピー

# コンテナ → ホスト
$ docker cp my_container:/var/log/ /home/user/logs/

# ホスト → コンテナ
$ docker cp ./local.txt my_container:/tmp/local.txt

7. コンテナのライフサイクル操作

  • Docker コンテナは docker create コマンドによって、イメージのスナップショットとして /var/lib/docker 領域に作成される。
  • docker start コマンドを実行すると、読み書き可能なプロセス領域、すなわち container layer が作成され、動的なコンテナとして構成される。また、docker stop によって生成された container layer は削除される。
  • docker rm は作成されたスナップショットを削除するコマンドであり、これらのプロセスを通して Docker コンテナのライフサイクルを理解することができる。

必要に応じて図解やコマンド例も追加できます。ご希望あればお知らせください。

$ docker run -d --name myapp nginx
$ docker stop myapp
$ docker start myapp
$ docker restart myapp
$ docker rm myapp
$ docker ps -a
  • ライフサイクル図(Mermaid)

8. 応用編:イメージのバックアップとマイグレーション

# コンテナのエクスポート
$ docker export node-run > node-run.tar

# インポートとイメージ化
$ docker import --change 'CMD ["node", "/app/runapp.js"]' node-run.tar node-run:3.0

補足

状態制御

  • docker stop, start, pause, unpause, kill
  • docker events でイベント確認

呼び出し / 呼び込み

  • docker attach でストリーム接続
  • docker exec で呼び込み実行

変更管理

  • docker diff で変更点確認
  • docker commit で新イメージ生成

バックアップ & 移行

  • docker export, docker import
  • --change 'CMD [...]' で CMD を付加
  • 必要に応じて Dockerfile で再構築

まとめ

本記事では、Dockerを用いた以下の内容を体系的に解説しました:

  • コンテナの名前空間による分離メカニズム
  • CLIを用いた実践的な操作(ビルド、実行、ログ確認、ファイルコピー)
  • リソース制御やバックアップ戦略

これらの知識は、開発環境の整備だけでなく、本番運用におけるトラブルシューティングや自動化にも非常に有効です。

※ 参考用

Discussion