🐳
【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 |
コンテナ終了時に適用する再起動ポリシーを指定(no |on-failure |on-failure:回数n |always ) |
|
--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を用いた実践的な操作(ビルド、実行、ログ確認、ファイルコピー)
- リソース制御やバックアップ戦略
これらの知識は、開発環境の整備だけでなく、本番運用におけるトラブルシューティングや自動化にも非常に有効です。
※ 参考用
- docker cheat sheet
- docker cli document(24)
Discussion