Docker コンテナ化技術の標準化に関するメモ

一、Docker の基本概念

1. コンテナ化技術とは

アプリケーションと、その実行に必要なすべての依存環境を1つのイメージファイルにパッケージ化し、このイメージはDockerがインストールされている任意のシステム上で直接実行可能です。一度パッケージ化すれば、どこでも実行できます。

Dockerは、現在最も主流なコンテナ化技術の実装です。

2. コンテナ化と仮想マシン(VM)の比較

比較項目 仮想マシン(VM) Docker コンテナ
仮想化レベル ハードウェアレベルの仮想化、ハイパーバイザーに基づく システムレベルの仮想化、オペレーティングシステムに基づく
原理 ハードウェア一式を仮想化し、各仮想マシンは独立したカーネルシステムを持つ ホストマシンのカーネルを共有し、namespace と cgroup を用いて分離
リソース利用率 低い。仮想ハードウェアとシステムが大量のリソースを消費 高い。アプリケーション本体のみで、余分なシステムオーバーヘッドがない
起動速度 数分単位 数秒単位
セキュリティ/安定性 より高い、ハードウェアレベルの分離 やや低い、カーネル共有による分離

3. Dockerの2大中核基盤技術

ネームスペース:分離を実現

各コンテナが、自分専用の独立したシステム環境を持っているかのように認識し、互いに認識できないようにする:

  • PIDネームスペース:プロセスの分離。コンテナ内のプロセスとホストマシンとの競合を防ぐ
  • NET ネームスペース:ネットワーク分離。各コンテナは独立した IP、ポート、ネットワークインターフェースを持つ
  • MNT ネームスペース:ファイルシステム分離。コンテナは独自のルートディレクトリを持つ
  • UTS ネームスペース:ホスト名の分離。コンテナは独自のホスト名を設定可能
  • USER ネームスペース:ユーザーの分離。コンテナ内の root とホストマシンの root は別物
  • IPC ネームスペース:プロセス間通信の分離
cgroup(制御グループ):リソース制限を実現

各コンテナが使用できるハードウェアリソースを制御し、1つのコンテナがホストマシンのリソースを独占するのを防ぐ:

  • CPU使用量を制限
  • メモリ容量を制限
  • ディスクI/Oを制限
  • ネットワーク帯域幅を制限

補足:コンテナには優先順位があり、優先順位の高いコンテナは、ホストマシンのリソースが逼迫している際にもOOM(メモリ不足)によって強制終了されにくい。

4. Dockerの3要素

概念 解説 例え
イメージ Image アプリケーションと依存環境をパッケージ化した読み取り専用ファイル。テンプレート インストーラー / クラス class に相当
コンテナ Container イメージを実行したインスタンス。つまり、動作中のアプリケーション インストール済みで実行中のプログラム/インスタンスに相当
リポジトリ Repository イメージを格納する場所 アプリストア/ソフトウェアリポジトリに相当

リポジトリの分類:

  • パブリックリポジトリ:Docker Hub(公式)、Alibaba Cloudイメージリポジトリ、NetEase Cloudなど
  • プライベートリポジトリ:Harbor(企業が独自に構築するプライベートリポジトリとして最も一般的)

2. Docker 環境の構築(CentOS 7 専用)

1. まず、古いバージョンをアンインストールします(ある場合)

bash

以下のコマンドを実行します

# システムにプリインストールされている古い Docker をアンインストールします(ある場合)
yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

2. yum ツールセットのインストール

bash

以下のコマンドを実行

# yum-config-manager などのツールをインストール
yum install -y yum-utils device-mapper-persistent-data lvm2

3. Huawei Cloud Docker yum リポジトリを設定(中国国内からのダウンロードが高速)

bash

実行

# Huawei Cloudのミラーアドレスを使用して、docker-ceのyumリポジトリを追加
yum-config-manager --add-repo https://repo.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo

# リポジトリ内の公式アドレスをHuawei Cloudのアドレスに置き換え、ダウンロードを高速化
sed -i 『s+download.docker.com+repo.huaweicloud.com/docker-ce+』 /etc/yum.repos.d/docker-ce.repo

CentOS 7 では releasever を変更する必要はありません。システム変数が自動的に 7 と認識します。

4. 利用可能な Docker バージョンを確認する

bash

以下のコマンドを実行

# インストール可能なすべての docker-ce バージョンを、新しい順に表示
yum list docker-ce --showduplicates | sort -r

5. Docker のインストール

方法 1:最新の安定版をインストール

bash

実行

# Dockerエンジン、コマンドラインツール、コンテナランタイムをインストール
yum install -y docker-ce docker-ce-cli containerd.io
方法2:指定バージョンのインストール(本番環境推奨。固定バージョンのほうが安定しています)

bash

実行

# バージョン番号を指定してインストール(形式:docker-ce-バージョン番号)
yum install -y docker-ce-24.0.6-1.el7 docker-ce-cli-24.0.6-1.el7 containerd.io

バージョン番号の末尾には -1.el7 を付けることに注意してください。CentOS 7 のパッケージにはすべてこのサフィックスが付いています。

6. Docker を起動し、起動時の自動起動を設定する

bash

を実行

# Docker サービスの起動
systemctl start docker

# 起動時の自動起動を設定
systemctl enable docker

# インストール成功の確認、バージョンの確認
docker version

「Client」と「Server」の2つの情報が表示されていれば、インストールは成功しています。


三、イメージアクセラレータの設定

中国国内から Docker Hub の公式リポジトリにアクセスすると非常に遅いため、アクセラレータを設定して国内のミラーサイトから取得します。

1. dockerの設定ディレクトリを作成する(存在しない場合)

bash

実行

mkdir -p /etc/docker

2. アクセラレータの設定ファイルを作成する

bash

実行

# teeコマンドを使用して設定を書き込みます。daemon.jsonはDockerのメイン設定ファイルです
tee /etc/docker/daemon.json <<-『EOF』
{
    「registry-mirrors」: [
      「https://docker.m.daocloud.io」,
      
「https://noohub.ru」,
      「https://huecker.io」,
      「https://dockerhub.timeweb.cloud」
    ]
}
EOF

3. Dockerを再起動して設定を反映

bash

実行

# systemdの設定を再読み込みし、Dockerサービスを再起動
systemctl daemon-reload
systemctl restart docker

# アクセラレータが有効になっているか確認する。出力内の「Registry Mirrors」を確認
docker info

出力内の Registry Mirrors: というセクションを探し、設定したアクセラレータのアドレスが表示されていれば成功です。


4. Docker イメージの操作(事例+解説付き)

1. ローカルのすべてのイメージを確認する

bash

実行

docker images# または同等のコマンドdocker image ls

出力項目の説明:

  • REPOSITORY:イメージ名
  • TAG:バージョンタグ。「latest」は最新版を表します
  • IMAGE ID:イメージの一意のID
  • SIZE:イメージのサイズ

2. イメージの検索(Docker Hub からイメージを探す)

bash

実行

# nginx 関連のイメージを検索docker search nginx

出力結果の OFFICIAL 列が OK となっているものが公式イメージです。セキュリティが保証されているため、優先的に公式イメージを使用してください。

3. イメージのダウンロード(プル)

bash

実行

# 形式:docker pull イメージ名:バージョン番号# バージョン番号を指定しない場合は、デフォルトで最新版(latest)が取得されます# 例1:最新版のnginxを取得docker pull nginx# 例2:指定バージョンのnginxを取得docker pull nginx:1.24# 例3:CentOS 7イメージを取得docker pull centos:7

4. イメージの名前変更(タグ付け)

bash

実行

# 形式:docker tag 元のイメージ名:バージョン 新しいイメージ名:新しいバージョン# 用途:イメージに別名を付ける、またはプライベートリポジトリにプッシュする前にリポジトリアドレス形式に変更する必要がある# 事例1:ローカルのnginxイメージの名前を変更するdocker tag nginx:latest mynginx:v1# 例2:Alibaba Cloudリポジトリ形式に変更(プッシュ前に変更必須)docker tag nginx:latest registry.cn-beijing.aliyuncs.com/あなたのネームスペース/nginx:v1

注意:タグはイメージに別名を付けるだけであり、コピーではありません。2つの名前は同じイメージIDを指しており、一方を削除してももう一方は残ります。

5. イメージの削除

bash

実行

# 形式:docker rmi イメージ名:バージョン または イメージID# 事例1:名前で削除docker rmi mynginx:v1# 事例2:IDで削除(IDは先頭数桁で十分。一意に識別できればよい)
docker rmi 605c77

# 例3:強制削除(コンテナが使用中であっても強制的に削除)
docker rmi -f nginx:latest

注意:イメージがコンテナで使用されている場合、-f を指定しないと削除できません。まずコンテナを削除してから、イメージを削除してください。


5. Docker リポジトリの操作(Alibaba Cloud イメージリポジトリを例に)

1. プライベートリポジトリへのログイン

bash

実行

# 形式:docker login --username=ユーザー名 リポジトリアドレスdocker login --username=あなたのAlibaba Cloudアカウント registry.cn-beijing.aliyuncs.com

実行後、パスワード(Alibaba Cloudリポジトリへのアクセス用パスワード。ログインパスワードではありません)を入力し、Login Succeededと表示されればログイン成功です。

2. ログアウト

bash

実行

docker logout registry.cn-beijing.aliyuncs.com

3. イメージをプライベートリポジトリにプッシュ

2段階の手順:まずリポジトリの形式に合わせて名前を変更し、その後 push でプッシュします。

bash

以下のコマンドを実行

# 手順1:ローカルイメージにタグを付け、リポジトリの要件に沿った形式に変更する# 形式:docker tag ローカルイメージ リポジトリアドレス/ネームスペース/リポジトリ名:バージョンdocker tag nginx:latest registry.cn-beijing.aliyuncs.com/あなたのネームスペース/nginx:v1# 手順2:リポジトリへプッシュdocker push registry.cn-beijing.aliyuncs.com/あなたのネームスペース/nginx:v1

4. プライベートリポジトリからイメージをプル

bash

実行

docker pull registry.cn-beijing.aliyuncs.com/あなたのネームスペース/nginx:v1

六、Docker コンテナの操作(重点、事例+解説付き)

基本原則

コンテナ内には、フォアグラウンドで実行されるデーモンプロセスが必ず存在しなければなりません。フォアグラウンドプロセスが存在しない場合、コンテナは直ちに終了します。コンテナのライフサイクル = メインプロセスのライフサイクルであり、メインプロセスが停止するとコンテナも停止します。


1. コンテナの作成と起動(docker run が最も一般的)

コマンド形式

bash

実行

docker run [引数] イメージ名 [起動コマンド]
よく使われる引数

引数 役割
-d バックグラウンドで実行(デーモンモード)、コンテナIDを返す
-i 対話モード、標準入力を開いたままにする
-t 疑似ターミナルを割り当てる
-it 通常は組み合わせて使用し、対話モードでコンテナに入る
--name コンテナに名前を付ける。毎回 ID を使用する必要がない
-p ホストポート:コンテナポート ポートマッピング。コンテナのポートをホストにマッピングし、外部からアクセスできるようにする
-P 大文字の P。コンテナの公開ポートすべてをホストマシンにランダムにマッピングする
--rm 一時コンテナ。終了後に自動的に削除される。テスト用
-v ホストパス:コンテナパス データボリュームのマウント。コンテナのデータをホスト上に保存
-e 環境変数=値 コンテナに環境変数を渡す
実践例

bash

実行

# 例1:nginxコンテナをバックグラウンドで実行し、名前をmynginxとし、ポート80をホストマシンの8080にマッピングするdocker run -d --name mynginx -p 8080:80 nginx# -d バックグラウンドで実行# --name コンテナ名を mynginx に設定# -p 8080:80 ホストマシンの 8080 ポートをコンテナの 80 ポートにマッピング# 使用するイメージは nginx:latest# 確認:ブラウザでホストマシンのIP:8080にアクセスすると、nginxのデフォルトページが表示されます# 事例2:CentOSコンテナを対話モードで実行し、内部でコマンドを入力して終了すると自動的に削除されるdocker run -it --rm centos:7 /bin/bash# -it 対話モードのターミナル# --rm:終了時に削除# /bin/bash:起動後にbashコマンドを実行し、シェルに入る# 「exit」と入力して終了すると、コンテナは自動的に削除される# 事例3:ランダムなポートマッピングdocker run -d -P nginx# 大文字のP:ホストマシンのポートを自動的にランダムに選択し、コンテナの80番ポートにマッピングする# docker ps コマンドでどのポートにマッピングされたかを確認 

2. コンテナの確認

bash

実行

# 実行中のコンテナを確認docker ps# すべてのコンテナ(停止中のものも含む)を確認docker ps -a

出力される主要なフィールド:

  • CONTAINER ID:コンテナID
  • IMAGE:使用しているイメージ
  • COMMAND:コンテナ起動コマンド
  • STATUS:ステータス。「Up」は実行中、「Exited」は停止済み
  • PORTS:ポートマッピング情報
  • NAMES:コンテナ名

3. 実行中のコンテナにアクセスする

推奨方法:docker exec(本番環境ではこれを使用)

bash

実行

# 形式:docker exec -it コンテナ名/コンテナID /bin/bash
docker exec -it mynginx /bin/bash
# -it 対話型ターミナル
# mynginx コンテナ名
# /bin/bash bashコマンドを実行してシェルに入る

特徴:exit でコンテナから退出しても、コンテナは実行されたまま停止しません。これが attach との最大の違いであり、本番環境では exec を使用します。

推奨されない:docker attach

bash

実行

docker attach mynginx

特徴:exitで終了するとコンテナも停止します。基本的に使用されませんが、知っておくだけで十分です。


4. コンテナの起動・停止操作

bash

実行

# 停止中のコンテナを起動する
docker start コンテナ名/ID

# 実行中のコンテナを停止する(正常終了:プロセスにシグナルを送信して、データを保存した上で終了させる)
docker stop コンテナ名/ID

# コンテナを強制終了する(KILLシグナルを直接送信し、プロセスの終了を待たない)
docker kill コンテナ名/ID

# コンテナを再起動する
docker restart コンテナ名/ID

# コンテナを一時停止する(コンテナはメモリ上に残ったまま、動作を停止して凍結状態になる)
docker pause コンテナ名/ID

# 一時停止したコンテナを再開する
docker unpause コンテナ名/ID

区別:

  • stop:正常に停止し、コンテナが終了してリソースが解放される
  • pause:一時停止。メモリを占有したまま、いつでも再開可能

5. コンテナの削除

bash

実行

# 停止済みのコンテナを1つ削除
docker rm コンテナ名/ID

# 強制削除(実行中のコンテナも削除可能。その場合は先に強制終了してから削除)
docker rm -f コンテナ名/ID

# 停止済みのコンテナをすべて一括削除(クリーンアップ用)
docker rm $(docker ps -aq)

6. コンテナのログを確認

bash

実行

# コンテナの標準出力ログを確認
docker logs コンテナ名/ID

# ログを継続的に追跡(tail -fと同様)、リアルタイムで確認
docker logs -f コンテナ名/ID

# 最後の100行を表示
docker logs --tail 100 コンテナ名/ID

トラブルシューティングに必須。コンテナの起動に失敗した場合は、まずログを確認して原因を特定します。


7. コンテナ/イメージの詳細情報の確認

bash

実行

# コンテナのすべての詳細設定(IP、マウント、ネットワーク、環境変数など)を確認する
docker inspect コンテナ名/ID

# イメージの詳細情報を確認
docker inspect イメージ名

出力はJSON形式で、情報が非常に充実しています。トラブルシューティングやIPの確認にはこれを使用します。


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

bash

実行

# 形式:docker cp ソースパス ターゲットパス
# コンテナパスの記述方法:コンテナ名:コンテナ内のパス

# 例1:ホストマシンのファイルをコンテナ内にコピーする
docker cp /root/index.html mynginx:/usr/share/nginx/html/
# ホストマシンのindex.htmlをmynginxコンテナのWebサイトのルートディレクトリにコピー

# 例2:コンテナ内のファイルをホストマシンにコピー
docker cp mynginx:/etc/nginx/nginx.conf /root/
# コンテナ内のnginx設定ファイルをホストマシンの/root下にコピー

コンテナ内にはviもyumもないため、設定を変更する際はファイルをホストマシンにコピーし、変更後に元の場所へ戻す。


9. コンテナのファイルシステムの変更を確認する

bash

以下を実行

docker diff コンテナ名/ID

3種類のマークが出力されます:

  • A:Added、新規追加されたファイル/ディレクトリ
  • D:Deleted、削除されたファイル/ディレクトリ
  • C:Changed、変更されたファイル/ディレクトリ

これにより、コンテナの実行後にファイルシステムにどのような変更が加えられたかを確認できます。


七、CentOS 7 に関する注意事項の補足

  1. カーネルバージョンの要件:CentOS 7 のカーネル 3.10 以上はすべて Docker をサポートしており、デフォルトのカーネルで要件を満たしています
  2. ファイアウォール:CentOS 7 ではデフォルトで firewalld が使用されており、Docker が iptables ルールを自動的に管理するため、通常は手動で変更する必要はありません
  3. SELinux :SELinux が有効になっている場合、マウントディレクトリで権限の問題が発生する可能性があります。テストのために一時的に無効にするには:setenforce 0
  4. docker-compose:CentOS 7 では、docker-compose はプラグインではなく独立したバイナリファイルであるため、別途ダウンロードしてインストールする必要があります