Docker コンテナを効率的に構築・管理する方法

DockerBeginner
オンラインで実践に進む

はじめに

この包括的な Docker チュートリアルは、開発者と IT 専門家を対象に、コンテナ化技術を深く理解するためのものです。Docker のコアコンセプト、アーキテクチャ、そして実践的な実装戦略を探求することで、学習者は、異なるコンピューティング環境全体でアプリケーションをパッケージ化、デプロイ、管理する実用的なスキルを習得します。

Docker の基礎

Docker とは何か?

Docker は、アプリケーションのデプロイと開発を革新する強力なコンテナ化プラットフォームです。オープンソース技術として、Docker は開発者が異なるコンピューティング環境間でアプリケーションを一貫してパッケージ化、配布、実行することを可能にします。

Docker のコアコンセプト

コンテナと仮想マシン

graph TD
    A[物理ハードウェア] --> B[Docker コンテナ]
    A --> C[仮想マシン]
    B --> D[軽量]
    B --> E[共有 OS カーネル]
    C --> F[重厚]
    C --> G[完全な OS オーバーヘッド]
機能 Docker コンテナ 仮想マシン
リソース使用量 軽量 リソース集約的
起動時間 数秒 数分
隔離レベル プロセスレベル システム全体

Docker アーキテクチャ

Docker は、クライアント - サーバーアーキテクチャを採用し、主要なコンポーネントを備えています。

  • Docker デーモン
  • Docker クライアント
  • Docker レジストリ
  • Docker イメージ
  • Docker コンテナ

基本的な Docker コマンド

Ubuntu 22.04 に Docker をインストールする手順:

## システムパッケージを更新する
sudo apt update

## Docker の依存関係をインストールする
sudo apt install apt-transport-https ca-certificates curl software-properties-common

## Docker の公式 GPG キーを追加する
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

## Docker リポジトリを設定する
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

## Docker エンジンをインストールする
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

## Docker のインストールを確認する
sudo docker --version

最初のコンテナの実行

## Ubuntu イメージをプルする
sudo docker pull ubuntu:latest

## 対話型のコンテナを実行する
sudo docker run -it ubuntu:latest /bin/bash

## 実行中のコンテナを表示する
sudo docker ps

## 全てのコンテナを表示する
sudo docker ps -a

イメージの管理

## イメージを検索する
sudo docker search nginx

## イメージをダウンロードする
sudo docker pull nginx

## ローカルイメージを表示する
sudo docker images

コンテナのネットワーク

Docker ネットワークの種類

graph TD
    A[Docker ネットワークの種類] --> B[ブリッジネットワーク]
    A --> C[ホストネットワーク]
    A --> D[なしネットワーク]
    A --> E[オーバーレイネットワーク]
ネットワークの種類 説明 使用例
ブリッジ デフォルトネットワーク コンテナ間の隔離された通信
ホスト 直接ホストネットワーク パフォーマンス重視のアプリケーション
なし ネットワークアクセスなし 完全なコンテナの隔離
オーバーレイ マルチホストネットワーク 分散型コンテナシステム

ポートマッピングの手法

基本的なポートマッピング

## コンテナポート 80 をホストポート 8080 にマッピングする
sudo docker run -p 8080:80 nginx

## 複数のポートをマッピングする
sudo docker run -p 8080:80 -p 3306:3306 myapp

ネットワーク管理コマンド

## Docker ネットワークの一覧を表示する
sudo docker network ls

## カスタムネットワークを作成する
sudo docker network create mynetwork

## コンテナをネットワークに接続する
sudo docker network connect mynetwork mycontainer

## ネットワークの詳細を表示する
sudo docker network inspect bridge

高度なネットワークシナリオ

## カスタムブリッジネットワークを作成する
sudo docker network create --driver bridge isolated_network

## カスタムネットワーク内でコンテナを実行する
sudo docker run -d --name web1 --network isolated_network nginx
sudo docker run -d --name web2 --network isolated_network httpd

ネットワーク隔離戦略

## 外部ネットワークアクセスを無効にする
sudo docker run --network none mycontainer

## ホストネットワークを直接使用する
sudo docker run --network host mycontainer

コンテナの DNS 解決

## コンテナ間の自動 DNS を有効にする
sudo docker run --name db-container mysql
sudo docker run --name app-container --link db-container:database myapp

Docker の高度なテクニック

コンテナのリソース管理

graph TD
    A[リソース管理] --> B[CPU 制限]
    A --> C[メモリ制約]
    A --> D[ストレージのクォータ]

リソース割り当ての例

## コンテナを 1 CPU コアと 512MB メモリに制限する
sudo docker run -it --cpus=1 --memory=512m ubuntu /bin/bash

## メモリとスワップの制限を設定する
sudo docker run -it --memory=1g --memory-swap=2g ubuntu /bin/bash

Docker Compose によるマルチコンテナデプロイ

version: "3"
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  database:
    image: postgres
    environment:
      POSTGRES_PASSWORD: mysecretpassword

セキュリティのベストプラクティス

セキュリティ手法 実装方法
ルート以外のコンテナ Dockerfile で USER 指令を使用
読み取り専用ファイルシステム ボリュームマウントに :ro フラグを追加
コンテナの機能制限 --cap-drop と --cap-add を使用

Docker Swarm によるコンテナオーケストレーション

## Swarm クラスタを初期化する
sudo docker swarm init

## リプリカ付きサービスを作成する
sudo docker service create --replicas 3 --name web nginx

## サービスを動的にスケールする
sudo docker service scale web=5

高度なネットワーク設定

## サブネット付きカスタムネットワークを作成する
sudo docker network create \
  --driver bridge \
  --subnet 192.168.0.0/24 \
  --gateway 192.168.0.1 \
  custom_network

コンテナの監視とログ

## リアルタイムコンテナログ
sudo docker logs -f container_name

## コンテナメトリクスを調べる
sudo docker stats container_name

## ログファイルのサイズ制限
sudo docker run --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx

Dockerfile の最適化テクニック

## マルチステージビルド
FROM maven:3.8.1-openjdk-11 AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package

FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/app.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

まとめ

Docker は、軽量で移植性が高く効率的なコンテナ化ソリューションを提供することで、ソフトウェアのデプロイ方法に革命をもたらします。Docker の基本的な概念、アーキテクチャ、およびコマンドラインテクニックを習得することで、開発者はアプリケーション開発を効率化し、システムの一貫性を向上させ、全体的なインフラストラクチャのスケーラビリティとパフォーマンスを強化できます。