カスタム Dockerfile を使用した Docker コンテナの構築

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

はじめに

このチュートリアルでは、Dockerfile を使用したカスタム Docker イメージの作成、Docker アプリケーションのデプロイと管理の手順を説明します。カスタム Dockerfile から Docker イメージをビルドするコマンドを学習し、コンテナ化ワークフローを効率化し、アプリケーションをより効率的にデプロイできるようになります。

Docker コンテナの概要

Docker は、開発者がコンテナ化された環境でアプリケーションを構築、デプロイ、実行するための、人気のオープンソースプラットフォームです。コンテナは、アプリケーションの実行に必要なコード、ランタイム、システムツール、ライブラリなど、すべてを含んだ軽量で独立した実行可能なソフトウェアパッケージです。

Docker とは何か?

Docker は、コンテナを使用してアプリケーションの作成、デプロイ、実行を容易にするツールです。コンテナを使用すると、開発者はアプリケーションに必要なライブラリやその他の依存関係など、すべての構成要素をパッケージ化し、単一のソフトウェアパッケージとして配布できます。

Docker コンテナの利点

  1. 移植性: Docker コンテナは、開発者のローカルマシンから本番サーバーまで、あらゆる環境で一貫して動作します。これにより、アプリケーションは基盤となるインフラストラクチャに関係なく同じように動作します。
  2. スケーラビリティ: Docker は、必要に応じてアプリケーションをスケールアップまたはスケールダウンを容易にします。コンテナを追加または削除することで実現します。
  3. 効率性: Docker コンテナは軽量でホストオペレーティングシステムを共有するため、従来の仮想マシンよりも効率的です。
  4. 一貫性: Docker は、開発から本番までアプリケーションが同じように動作することを保証します。「私のマシンでは動作する」という問題を解消します。

Docker アーキテクチャ

Docker はクライアント・サーバーアーキテクチャを採用しており、Docker クライアントは Docker デーモンと通信します。Docker デーモンは、Docker コンテナの構築、実行、配布を担当します。

graph LD
    subgraph Docker アーキテクチャ
        client[Docker クライアント]
        daemon[Docker デーモン]
        client -- API --> daemon
        daemon -- イメージ --> registry[Docker レジストリ]
    end

Docker コンテナと仮想マシン

コンテナと仮想マシン (VM) はどちらも、アプリケーションを隔離された環境で実行するという目的を果たしますが、いくつかの重要な違いがあります。

機能 Docker コンテナ 仮想マシン
隔離 コンテナはホストのオペレーティングシステムカーネルを共有するため、より軽量な隔離を提供します。 VM は独自の完全なオペレーティングシステムを持つため、より強力な隔離を提供します。
リソース使用量 コンテナはホストのリソースを共有し、完全なオペレーティングシステムを実行する必要がないため、より効率的です。 VM は独自のオペレーティングシステムを持つため、より多くのリソースを必要とします。
起動時間 コンテナは、完全なオペレーティングシステムを起動する必要がないため、数秒で起動できます。 VM は、完全なオペレーティングシステムを起動する必要があるため、数分かかります。

Docker の開始

Docker を開始するには、システムに Docker エンジンをインストールする必要があります。Docker は公式 Docker ウェブサイト (https://www.docker.com/get-started) からダウンロードしてインストールできます。インストール後、Docker を使用してアプリケーションを構築、デプロイ、実行できます。

カスタム Docker イメージの作成

カスタム Docker イメージの作成は、既存のベースイメージに基づいて新しいイメージを構築し、アプリケーションコード、依存関係、設定などの独自の変更を加えるプロセスです。

Dockerfile

Dockerfile は、Docker イメージを構築するために必要なすべての指示を含むテキストファイルです。ベースイメージ、ビルドプロセス中に実行される手順、イメージの最終的な構成を指定します。

以下の Dockerfile が例です。

## 公式の Ubuntu 22.04 ベースイメージを使用
FROM ubuntu:22.04

## パッケージインデックスを更新し、必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
  git \
  python3 \
  python3-pip \
  && rm -rf /var/lib/apt/lists/*

## 作業ディレクトリを設定
WORKDIR /app

## アプリケーションコードをコピー
COPY . /app

## Python 依存関係をインストール
RUN pip3 install --no-cache-dir -r requirements.txt

## アプリケーションが動作するポートを公開
EXPOSE 8080

## アプリケーションを実行するコマンドを設定
CMD ["python3", "app.py"]

カスタムイメージの構築

Dockerfile を使用してカスタム Docker イメージを構築するには、以下の手順に従います。

  1. プロジェクトディレクトリに Dockerfile を作成します。

  2. ターミナルを開き、プロジェクトディレクトリに移動します。

  3. 次のコマンドを実行してイメージを構築します。

    docker build -t my-custom-image .
    

    このコマンドは、Dockerfile の指示を使用して、名前が "my-custom-image" の新しい Docker イメージを構築します。

レジストリへのイメージのプッシュ

カスタム Docker イメージを構築したら、Docker Hub やプライベートレジストリなどの Docker レジストリにプッシュできます。これにより、他のシステムで共有およびデプロイできます。

  1. Docker レジストリにログインします。

    docker login
    
  2. レジストリの URL とユーザー名を使用してイメージにタグを付けます。

    docker tag my-custom-image username/my-custom-image:latest
    
  3. レジストリにイメージをプッシュします。

    docker push username/my-custom-image:latest
    

これで、カスタム Docker イメージはレジストリで使用可能になり、他の開発者によってプルされ、本番環境にデプロイできます。

Docker アプリケーションのデプロイと管理

カスタム Docker イメージを作成したら、Docker ベースのアプリケーションをデプロイおよび管理できます。このセクションでは、Docker アプリケーションのデプロイと管理に関わる主要な概念と手順について説明します。

Docker コンテナのデプロイ

Docker コンテナをデプロイするには、docker run コマンドを使用します。このコマンドは、指定されたイメージに基づいて新しいコンテナを起動し、ポートマッピング、環境変数、ボリュームマウントなどのさまざまなオプションを構成できます。

"my-custom-image" イメージに基づいてコンテナを実行する例を次に示します。

docker run -d -p 8080:8080 -e DB_HOST=192.168.1.100 -v /data:/app/data my-custom-image

このコマンドは次のことを行います。

  • デタッチモード (-d) でコンテナを実行
  • コンテナのポート 8080 をホストのポート 8080 にマッピング (-p 8080:8080)
  • 環境変数 DB_HOST を値 192.168.1.100 で設定 (-e DB_HOST=192.168.1.100)
  • ホストディレクトリ /data をコンテナの /app/data ディレクトリにマウント (-v /data:/app/data)
  • "my-custom-image" イメージを使用してコンテナを起動

Docker コンテナの管理

Docker は、実行中のコンテナを管理するためのいくつかのコマンドを提供します。

  • docker ps: 実行中のすべてのコンテナをリスト
  • docker stop <container_id>: 実行中のコンテナを停止
  • docker start <container_id>: 停止したコンテナを起動
  • docker logs <container_id>: コンテナのログを表示
  • docker exec -it <container_id> /bin/bash: 実行中のコンテナのシェルにアクセス

Docker Compose

Docker Compose は、マルチコンテナ Docker アプリケーションを定義および管理するためのツールです。YAML ファイルを使用して、アプリケーションのサービス、ネットワーク、ボリュームを構成します。

docker-compose.yml ファイルの例を次に示します。

version: "3"
services:
  web:
    build: .
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=database
    depends_on:
      - database
  database:
    image: mysql:5.7
    environment:
      - MYSQL_DATABASE=myapp
      - MYSQL_ROOT_PASSWORD=secret
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

この Compose ファイルは、Web サービスとデータベースサービスの 2 つのサービスを定義しています。Web サービスは現在のディレクトリから構築され、データベースサービスは公式の MySQL 5.7 イメージを使用します。サービスはネットワークを介して接続され、データベースサービスのデータは名前付きボリュームに永続化されます。

このアプリケーションをデプロイするには、docker-compose.yml ファイルと同じディレクトリで docker-compose up -d を実行します。

Docker アプリケーションのスケーリング

Docker は、コンテナを追加または削除することで、アプリケーションを簡単にスケーリングできます。Docker Compose を使用してサービスをスケーリングできます。

docker-compose up -d --scale web=3

このコマンドは、"web" サービスのインスタンスを 3 つ起動します。

モニタリングとロギング

Docker は、コンテナのモニタリングとロギングのための組み込みツールを提供します。docker stats コマンドを使用してリアルタイムのリソース使用量を表示し、docker logs コマンドを使用してコンテナのログにアクセスできます。

さらに、Prometheus、Grafana、Elasticsearch などの外部モニタリングおよびロギングツールと Docker アプリケーションを統合して、より高度な洞察と機能を得ることができます。

まとめ

このチュートリアルでは、Dockerfile を使用してカスタム Docker イメージを作成する方法、および Docker アプリケーションをデプロイおよび管理する方法を学びました。これで、カスタム Dockerfile から Docker イメージをビルドするためのコマンドがわかり、コンテナ化プロセスを効率化し、アプリケーションをより効果的にデプロイできるようになりました。