Docker を使用した Web サーバーのデプロイ方法

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

はじめに

Docker は、アプリケーションのデプロイと管理を簡素化する、広く採用されているコンテナ化プラットフォームです。このチュートリアルでは、Docker を使用してウェブサーバーをデプロイする方法を学び、コンテナ化の利点を理解し、Docker 開発環境をセットアップします。

Docker の理解

Docker とは何か?

Docker は、開発者がコンテナ化された環境でアプリケーションを構築、デプロイ、実行できるようにするオープンソースプラットフォームです。コンテナは、アプリケーションの実行に必要なコード、ランタイム、システムツール、ライブラリなど、すべてを含んだ軽量で独立した実行可能なパッケージです。Docker は、アプリケーションをパッケージ化および配布するための一貫性と信頼性を提供し、ソフトウェアの開発、テスト、デプロイを容易にします。

Docker を使用する利点

  1. 一貫した環境: Docker コンテナは、基盤となるインフラストラクチャに関係なく、アプリケーションが同じ方法で実行されることを保証し、一貫性と信頼性の高い開発およびデプロイ環境を提供します。
  2. 効率の向上: Docker コンテナは軽量で、迅速に起動および停止できます。これにより、従来の仮想マシンと比較して、システムリソースをより効率的に使用できます。
  3. スケーラビリティの向上: Docker は、必要に応じてアプリケーションをスケールアップまたはスケールダウンを容易にし、複数のコンテナを作成および管理できます。
  4. 移植性の向上: Docker コンテナは、さまざまなプラットフォームや環境間で簡単に共有およびデプロイでき、開発、テスト、本番環境間でのアプリケーションの移動を容易にします。

Docker アーキテクチャ

Docker アーキテクチャは、以下の主要なコンポーネントで構成されています。

  1. Docker クライアント: Docker デーモンと対話するためのユーザーインターフェースです。
  2. Docker デーモン: イメージ、コンテナ、ネットワーク、ボリュームなどの Docker オブジェクトを管理するバックグラウンドプロセスです。
  3. Docker イメージ: アプリケーションの実行に必要なコード、ランタイム、システムツール、ライブラリ、依存関係を含む不変ファイルです。
  4. Docker コンテナ: Docker イメージの実行可能なインスタンスで、それぞれが独自のファイルシステム、ネットワーク、プロセス空間を隔離しています。
  5. Docker レジストリ: Docker イメージを保存および配布するためのリポジトリです。
graph TD A[Docker クライアント] --> B[Docker デーモン] B --> C[Docker イメージ] B --> D[Docker コンテナ] B --> E[Docker レジストリ]

Docker の開始

Docker を開始するには、システムに Docker エンジンをインストールする必要があります。インストールプロセスはオペレーティングシステムによって異なりますが、通常、公式 Docker ウェブサイトで手順を見つけることができます。

Docker をインストールしたら、アプリケーションの構築と実行に使用できます。Docker を使用して Nginx ウェブサーバーを実行する簡単な例を次に示します。

## Docker レジストリから Nginx イメージをプルする
docker pull nginx

## Nginx コンテナを実行する
docker run -d -p 80:80 --name my-nginx nginx

このコマンドは、Docker レジストリから Nginx イメージをプルし、そのイメージに基づいて新しいコンテナを実行し、ホストのポート 80 をコンテナのポート 80 に公開します。

Docker 開発環境のセットアップ

Docker のインストール

Docker 開発環境をセットアップするには、まず Docker エンジンをシステムにインストールする必要があります。Ubuntu 22.04 でのインストール方法を以下に示します。

## パッケージインデックスを更新する
sudo apt-get update

## apt が HTTPS 経由のリポジトリを使用できるようにするパッケージをインストールする
sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

## Docker の公式 GPG キーを追加する
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

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

## Docker Engine、containerd、および Docker Compose をインストールする
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

開発環境向けの Docker の設定

Docker のインストール後、開発環境向けに設定できます。一般的な設定を以下に示します。

  1. ボリュームのマウント: ホストシステムのディレクトリを Docker コンテナにマウントして、ファイルやデータを共有します。
  2. ネットワーク: コンテナ同士やホストシステムとの通信を許可するために、Docker ネットワークを設定します。
  3. 環境変数: アプリケーションを設定するために、環境変数を Docker コンテナに渡します。
  4. ビルド引数: イメージをカスタマイズするために、ビルド時引数を Docker ビルドプロセスに渡します。

これらの設定を示す Docker Compose ファイルの例を次に示します。

version: "3"
services:
  web:
    build:
      context: .
      args:
        - ENV=development
    ports:
      - 8080:80
    volumes:
      - ./app:/var/www/html
    environment:
      - DB_HOST=database
  database:
    image: mysql:5.7
    volumes:
      - db-data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=secret
volumes:
  db-data:

この Docker Compose ファイルは、次の設定でウェブサービスとデータベースサービスをセットアップします。

  • ウェブサービスはローカルの Dockerfile からビルドされ、ビルド時引数 ENV=development が使用されます。
  • ウェブサービスは、ホストの ./app ディレクトリをコンテナの /var/www/html ディレクトリにマウントします。これにより、ホスト上でアプリケーションコードを直接編集できます。
  • ウェブサービスとデータベースサービスはネットワークを介して接続され、ウェブサービスは DB_HOST 環境変数を使用してデータベースにアクセスできます。
  • データベースサービスは、名前付きボリューム db-data を使用してデータベースデータを永続化します。

Docker コンテナの管理

開発環境がセットアップできたら、Docker コマンドを使用してコンテナを管理できます。一般的なコマンドを以下に示します。

  • docker run: 新しいコンテナを起動する
  • docker stop: 実行中のコンテナを停止する
  • docker rm: コンテナを削除する
  • docker logs: コンテナのログを表示する
  • docker exec: 実行中のコンテナ内でコマンドを実行する

たとえば、上記の Docker Compose ファイルからウェブサービスを起動するには、次のように実行できます。

docker-compose up -d web

これにより、ウェブサービスがデタッチモードで起動され、ターミナルを継続して使用できます。

Docker を用いた Web サーバーのデプロイ

Dockerfile の作成

Docker を用いて Web サーバーをデプロイするには、最初に Dockerfile を作成する必要があります。Dockerfile は、Docker イメージを構築するための指示を含むテキストファイルです。シンプルな Nginx Web サーバーのための Dockerfile の例を次に示します。

## 公式 Nginx イメージをベースイメージとして使用
FROM nginx:latest

## デフォルトの Nginx 設定ファイルをコピー
COPY default.conf /etc/nginx/conf.d/default.conf

## Web アプリケーションコードをコンテナにコピー
COPY app/ /usr/share/nginx/html/

## HTTP トラフィックのためにポート 80 を公開
EXPOSE 80

## Nginx サーバーを起動
CMD ["nginx", "-g", "daemon off;"]

この Dockerfile は以下の処理を行います。

  1. 公式 Nginx イメージをベースイメージとして使用します。
  2. デフォルトの Nginx 設定ファイルをコンテナにコピーします。
  3. Web アプリケーションコードをコンテナの Web ルートディレクトリにコピーします。
  4. HTTP トラフィックのためにポート 80 を公開します。
  5. Nginx サーバーを起動します。

Docker イメージの構築と実行

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

## Docker イメージを構築する
docker build -t my-nginx-server .

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

イメージが構築されたら、docker run コマンドを使用してイメージに基づいてコンテナを実行できます。

## Docker コンテナを実行する
docker run -d -p 80:80 --name my-nginx-server my-nginx-server

このコマンドは以下を行います。

  1. デタッチモード (-d) でコンテナを実行します。
  2. ホストのポート 80 をコンテナのポート 80 にマッピングします (-p 80:80)。
  3. コンテナに名前 my-nginx-server を割り当てます。
  4. my-nginx-server イメージを使用してコンテナを作成します。

スケーリングとロードバランシング

Web サーバーをスケーリングするには、Docker コンテナの複数のインスタンスを実行し、ロードバランサーを使用してトラフィックをインスタンス間で分散させることができます。Docker Compose を使用した例を次に示します。

version: "3"
services:
  web:
    build: .
    ports:
      - 80:80
    deploy:
      replicas: 3
  load-balancer:
    image: nginx:latest
    ports:
      - 8080:80
    depends_on:
      - web
    configs:
      - source: nginx-config
        target: /etc/nginx/conf.d/default.conf
configs:
  nginx-config:
    file: ./nginx.conf

この Docker Compose ファイルは以下を行います。

  1. 現在のディレクトリにある Dockerfile を使用して web サービスを構築します。
  2. web サービスの 3 つのレプリカをデプロイします。
  3. ポート 8080 でリスニングし、トラフィックを web サービスインスタンスに転送する Nginx ロードバランサーサービスを実行します。
  4. カスタムの Nginx 設定ファイルをロードバランサーコンテナにマウントします。

Docker Compose とロードバランシングを使用することで、Web サーバーを簡単にスケーリングし、高可用性とフォールトトレランスを確保できます。

まとめ

このチュートリアルを終了すると、Docker と、それを用いて Web サーバーをデプロイする方法についての確かな理解が得られます。Docker 開発環境のセットアップ、Web サーバー用の Docker コンテナの作成、デプロイ プロセスの管理を学びます。この知識は、Web アプリケーションの開発とデプロイに Docker の力を活用する上で役立ちます。