Dockerfile を使って Docker コンテナを構築し実行する方法

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

はじめに

このチュートリアルでは、Dockerfile を使用して Docker コンテナを構築し、実行するプロセスを案内します。Docker のアーキテクチャ、Docker イメージの作成方法、Docker コンテナの管理方法、およびスケーラブルな Docker アプリケーションのデプロイ方法について学びます。Docker の初心者であるか、既存のスキルを向上させたい場合でも、この包括的なガイドは、Docker を効果的に使用するために必要な知識を提供します。

Docker 入門

Docker は、開発者がコンテナ化された環境でアプリケーションを構築、デプロイ、実行できるようにする人気のオープンソースプラットフォームです。コンテナは、軽量で独立した自己完結型のユニットで、アプリケーションのコード、依存関係、およびランタイムを単一のポータブルなパッケージにまとめます。このアプローチにより、アプリケーションの開発、テスト、およびデプロイのプロセスが簡素化され、アプリケーションがさまざまなコンピューティング環境で一貫して実行されることが保証されます。

Docker とは何か?

Docker は、コンテナ内でアプリケーションを構築、デプロイ、実行できるソフトウェアプラットフォームです。コンテナは、アプリケーションとそのすべての依存関係を単一のユニットにパッケージ化する方法であり、どのコンピューティング環境でも一貫して実行できます。このアプローチにより、基盤となるインフラストラクチャに関係なく、アプリケーションが同じように実行されることが保証されます。

Docker を使用するメリット

  1. 一貫性:コンテナにより、基盤となるインフラストラクチャに関係なく、アプリケーションが同じように実行されます。
  2. スケーラビリティ:コンテナは、変化する需要に合わせて簡単にスケールアップまたはスケールダウンできます。
  3. 効率性:コンテナは軽量で、従来の仮想マシンよりも少ないリソースを使用します。
  4. ポータビリティ:コンテナは、開発、テスト、本番などのさまざまなコンピューティング環境間で簡単に移動できます。

Docker のアーキテクチャ

Docker はクライアント - サーバーアーキテクチャを使用しており、Docker クライアントが Docker デーモンと通信します。Docker デーモンは、コンテナの構築、実行、および管理を担当します。Docker デーモンはホストマシン上で実行され、Docker クライアントは同じマシンまたはリモートマシン上で実行できます。

graph TD
    A[Docker Client] -- Communicates with --> B[Docker Daemon]
    B -- Manages --> C[Docker Containers]
    B -- Builds --> D[Docker Images]
    B -- Stores --> E[Docker Registry]

Docker の始め方

Docker を始めるには、マシンに Docker ソフトウェアをインストールする必要があります。Docker のウェブサイトから、お使いのオペレーティングシステムに適したバージョンをダウンロードできます。Docker をインストールしたら、コンテナ内でアプリケーションを構築および実行するために使用を開始できます。

Docker のアーキテクチャの理解

Docker のアーキテクチャはクライアント - サーバーモデルに基づいており、Docker クライアントが Docker デーモンと通信して、コンテナの構築、実行、管理などのさまざまな操作を行います。

Docker のコンポーネント

Docker アーキテクチャの主なコンポーネントは以下の通りです。

  1. Docker クライアント:Docker クライアントは、ユーザーが Docker とやり取りするための主要なインターフェイスです。ユーザーはこれを使って、コンテナの構築、実行、管理などのコマンドを Docker デーモンに発行できます。

  2. Docker デーモン:Docker デーモンは Docker アーキテクチャのサーバー側のコンポーネントです。イメージ、コンテナ、ネットワーク、ボリュームなどの Docker オブジェクトの管理を担当します。

  3. Docker イメージ:Docker イメージはコンテナの基礎です。アプリケーションのコード、依存関係、およびアプリケーションを実行するために必要なその他のファイルを含む読み取り専用のテンプレートです。

  4. Docker コンテナ:Docker コンテナは Docker イメージの実行インスタンスです。アプリケーションとその依存関係をカプセル化し、さまざまな環境で一貫して実行されることを保証します。

  5. Docker レジストリ:Docker レジストリは Docker イメージのストレージおよび配布システムです。ユーザーが Docker イメージをアップロード、ダウンロード、共有できるようにします。

Docker アーキテクチャの図

次の図は、Docker アーキテクチャとそのコンポーネント間の相互作用を示しています。

graph TD
    A[Docker Client] -- Communicates with --> B[Docker Daemon]
    B -- Manages --> C[Docker Containers]
    B -- Builds --> D[Docker Images]
    B -- Pulls/Pushes --> E[Docker Registry]

Docker ネットワーキング

Docker は、コンテナ同士および外部と通信できるようにする組み込みのネットワーキング機能を提供します。Docker はいくつかのネットワークドライバをサポートしており、それには以下が含まれます。

  1. ブリッジネットワーク:同じホスト上で実行されるコンテナを接続するデフォルトのネットワークドライバです。
  2. ホストネットワーク:コンテナが Docker ネットワークをバイパスしてホストのネットワークスタックを使用できるようにします。
  3. オーバーレイネットワーク:異なる Docker ホスト上で実行されるコンテナ間の通信を可能にします。

Docker データ管理

Docker はコンテナ内のデータを管理するための 2 つの主要なメカニズムを提供します。

  1. ボリューム:Docker によって管理され、コンテナ間で共有できる永続的なストレージです。
  2. バインドマウント:ホストマシンのディレクトリをコンテナにマウントできるようにします。

Docker のアーキテクチャとそのさまざまなコンポーネントを理解することで、Docker を使用してアプリケーションを効果的に構築、デプロイ、管理することができます。

Dockerfile を使用した Docker イメージの構築

Dockerfile は Docker イメージを作成するための設計図です。ベースイメージ、依存関係のインストール、アプリケーションの構成など、Docker イメージを構築するために必要な手順を定義します。

Dockerfile とは何か?

Dockerfile は、Docker イメージを構築するために使用される一連の命令とコマンドが記述されたテキストファイルです。Docker イメージの作成プロセスを自動化する方法を提供し、イメージがさまざまな環境で一貫して信頼性高く構築できるようにします。

Dockerfile の構文

Dockerfile は、Docker イメージを構築する手順を定義するために特定の構文を使用します。最も一般的な Dockerfile の命令は以下の通りです。

命令 説明
FROM 構築に使用するベースイメージを指定します
COPY ホストからコンテナにファイルまたはディレクトリをコピーします
RUN 構築プロセス中にコンテナ内でコマンドを実行します
CMD コンテナが起動するときに実行するデフォルトのコマンドを指定します
EXPOSE コンテナが指定されたネットワークポートで待機していることを Docker に通知します
ENV コンテナ内で環境変数を設定します

これは、Python を使用して単純な Web アプリケーションを構築する Dockerfile の例です。

FROM python:3.9-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]

EXPOSE 5000

Docker イメージの構築

Dockerfile を使用して Docker イメージを構築するには、docker build コマンドを使用できます。

docker build -t my-app .

このコマンドは、現在のディレクトリにある Dockerfile を使用して、タグが my-app の Docker イメージを構築します。

Docker イメージをレジストリにプッシュする

Docker イメージを構築したら、Docker Hub やプライベートレジストリなどの Docker レジストリにプッシュして、他の人と共有したり、本番環境にデプロイしたりすることができます。

docker push my-app:latest

Dockerfile の作成と使用方法を理解することで、アプリケーションの Docker イメージを効果的に構築および管理することができます。

Docker コンテナの実行と管理

Docker イメージを構築したら、それを使用して Docker コンテナを実行および管理することができます。コンテナは Docker イメージの実行インスタンスであり、アプリケーションを一貫した分離された環境でパッケージ化して実行する方法を提供します。

Docker コンテナの実行

Docker コンテナを実行するには、docker run コマンドを使用できます。

docker run -d -p 8080:80 --name my-web-app my-app

このコマンドは、my-app イメージに基づいて新しいコンテナを起動し、コンテナの出力から切り離し (-d)、コンテナ内のポート 80 をホストのポート 8080 にマッピングし (-p 8080:80)、コンテナに my-web-app という名前を割り当てます。

Docker コンテナの管理

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

コマンド 説明
docker ps すべての実行中のコンテナを一覧表示します
docker stop <container_id> 実行中のコンテナを停止します
docker start <container_id> 停止しているコンテナを起動します
docker rm <container_id> コンテナを削除します
docker logs <container_id> コンテナのログを表示します
docker exec -it <container_id> <command> 実行中のコンテナ内でコマンドを実行します

たとえば、実行中のコンテナのログを表示するには、次のようにします。

docker logs my-web-app

また、実行中のコンテナ内でコマンドを実行するには、次のようにします。

docker exec -it my-web-app bash

コンテナのライフサイクル管理

Docker は、コンテナのライフサイクルを管理するためのいくつかのコマンドを提供しています。

  • docker create: 新しいコンテナを作成しますが、起動しません
  • docker start: 作成されたコンテナを起動します
  • docker stop: 実行中のコンテナを停止します
  • docker restart: コンテナを再起動します
  • docker kill: 実行中のコンテナに SIGKILL シグナルを送信します
  • docker pause: コンテナ内のすべてのプロセスを一時停止します
  • docker unpause: 一時停止しているコンテナの一時停止を解除します

Docker コンテナの実行と管理方法を理解することで、Docker を使用してアプリケーションを効果的にデプロイおよびスケールすることができます。

Docker のネットワーキングとデータ管理

Docker は、コンテナを接続し、データを永続化するための組み込みのネットワーキングとデータ管理機能を提供しています。

Docker ネットワーキング

Docker は、コンテナ同士および外部と通信できるようにするいくつかのネットワークドライバをサポートしています。

  1. ブリッジネットワーク:同じホスト上で実行されるコンテナを接続するデフォルトのネットワークドライバです。
  2. ホストネットワーク:コンテナが Docker ネットワークをバイパスしてホストのネットワークスタックを使用できるようにします。
  3. オーバーレイネットワーク:異なる Docker ホスト上で実行されるコンテナ間の通信を可能にします。

次のコマンドを使用して、Docker ネットワークを作成および管理できます。

## Create a new bridge network
docker network create my-network

## Connect a container to a network
docker run -d --name my-app --network my-network my-app

## Inspect a network
docker network inspect my-network

Docker データ管理

Docker は、コンテナ内のデータを管理するための 2 つの主要なメカニズムを提供しています。

  1. ボリューム:Docker によって管理され、コンテナ間で共有できる永続的なストレージです。
  2. バインドマウント:ホストマシンのディレクトリをコンテナにマウントできるようにします。

以下は、ボリュームを作成してコンテナにマウントする例です。

## Create a new volume
docker volume create my-volume

## Run a container and mount the volume
docker run -d --name my-app -v my-volume:/app my-app

この例では、my-volume ボリュームがコンテナ内の /app ディレクトリにマウントされます。

ネットワークとデータ管理のベストプラクティス

Docker のネットワーキングとデータ管理を行う際には、以下のベストプラクティスを考慮してください。

  1. 永続的なデータストレージには名前付きボリュームを使用します。
  2. コンテナやボリュームに機密データを保存しないようにします。
  3. マルチホスト通信にはオーバーレイネットワークを使用します。
  4. 別々のネットワークを使用して、異なるサービスやアプリケーションを分離します。
  5. 最適なパフォーマンスと信頼性を確保するために、ネットワークとストレージリソースを監視および管理します。

Docker のネットワーキングとデータ管理機能を理解することで、コンテナ化された環境でアプリケーションを効果的に構築、デプロイ、スケールすることができます。

Docker アプリケーションのデプロイとスケーリング

Docker は、プロセスを簡素化するツールとプラットフォームを提供することで、アプリケーションのデプロイとスケーリングを容易にします。このセクションでは、Docker ベースのアプリケーションをデプロイしてスケーリングする一般的なアプローチについて説明します。

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

インフラストラクチャと要件に応じて、Docker アプリケーションをデプロイする方法はいくつかあります。

  1. Docker Compose:Docker Compose は、マルチコンテナの Docker アプリケーションを定義して実行するためのツールです。YAML ファイルでアプリケーションのサービス、ネットワーク、ボリュームを定義し、1 つのコマンドでアプリケーション全体をデプロイできます。

    version: "3"
    services:
      web:
        image: my-web-app
        ports:
          - 8080:80
      db:
        image: mysql:5.7
        volumes:
          - db-data:/var/lib/mysql
    volumes:
      db-data:
    
  2. Docker Swarm:Docker Swarm は、Docker ホストのクラスタを管理し、複数のノードにアプリケーションをデプロイできる組み込みのオーケストレーションツールです。ロードバランシング、サービスディスカバリ、高可用性などの機能を提供します。

  3. Kubernetes:Kubernetes は、Docker ベースのアプリケーションをデプロイして管理するために使用できる人気のあるオープンソースのコンテナオーケストレーションプラットフォームです。自動スケーリング、自己修復、ローリングアップデートなどの高度な機能を提供します。

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

Docker アプリケーションのスケーリングは、いくつかの方法で実現できます。

  1. 水平スケーリング:増加した負荷を処理するために、より多くのコンテナインスタンスを追加します。これは、Docker Swarm や Kubernetes などのツールを使用して手動または自動で行うことができます。

  2. 垂直スケーリング:より多くの負荷を処理するために、コンテナインスタンスのリソース(CPU、メモリ、ストレージ)を増やします。

  3. ロードバランシング:パフォーマンスと可用性を向上させるために、複数のコンテナインスタンスに着信トラフィックを分散させます。

    graph LR
      A[Load Balancer] -- Distributes Traffic --> B[Container 1]
      A -- Distributes Traffic --> C[Container 2]
      A -- Distributes Traffic --> D[Container 3]
    
  4. 自動スケーリング:CPU 使用率やリクエスト量などの事前定義されたメトリックまたはルールに基づいて、コンテナインスタンスの数を自動的にスケーリングします。

Docker のデプロイとスケーリング機能を活用することで、変化する需要と要件に適応できる高いスケーラビリティと弾力性を持つアプリケーションを構築することができます。

まとめ

このチュートリアルでは、Dockerfile を使用して Docker コンテナを構築し実行する方法を学びました。Docker のアーキテクチャを調査し、Docker イメージの作成プロセスを理解し、Docker コンテナを管理し、Docker のネットワーキングとデータ管理について調査しました。最後に、Docker アプリケーションのデプロイとスケーリングについて学びました。この知識を持って、開発とデプロイのプロセスを合理化するために自信を持って Docker を使用することができます。