Webアプリ用にDockerを設定する方法

Webアプリケーション向けのDocker設定ガイド。環境定義のためのDockerfileの作成、イメージのビルド、コンテナの実行、およびマルチサービスアプリケーション向けのDocker Composeの使用方法について解説します。

Beginner

Webアプリケーション向けにDockerを設定するには、アプリケーションとその依存関係をコンテナ化し、開発、テスト、本番環境全体で一貫した環境を確保する必要があります。ここでは、必要な要素を網羅した一般的なガイドを紹介します:

1. Dockerのインストール

まず、システムにDockerがインストールされていることを確認してください。Dockerの公式ウェブサイトから、お使いのOSに対応したDocker Desktopをダウンロードできます。Linuxでコマンドラインツールを使用する場合は、お使いのディストリビューションのパッケージマネージャー(例: sudo apt install docker.io Ubuntuの場合)。

2. コンテナを作成する Dockerfile

Dockerfile Dockerfile は、Dockerがイメージをビルドするための指示を含むテキストファイルです。これには、環境、依存関係、およびアプリケーションの実行方法が定義されます。

Node.js アプリケーション用のDockerfileの例:

# Use an official Node.js runtime as a parent image
FROM node:18-alpine

# Set the working directory in the container
WORKDIR /app

# Copy package.json and package-lock.json (or yarn.lock)
COPY package*.json ./

# Install app dependencies
RUN npm install

# Copy the rest of your application code
COPY . .

# Expose the port your application listens on
EXPOSE 3000

# Define the command to run your app
CMD [ "npm", "start" ]

一般的な Dockerfile コマンドの説明: * FROM <image>: ビルドのベースとなるベースイメージを指定します。 * WORKDIR /app: コンテナ内の現在の作業ディレクトリを設定します。 * COPY <src> <dest>: ホストマシンからコンテナへファイルやディレクトリをコピーします。 * RUN <command>: イメージのビルドプロセス中にコマンドを実行します(例:依存関係のインストール)。 * EXPOSE <port>: 実行時にコンテナがこのポートでリスニングすることをDockerに通知します。 * CMD ["executable", "param1", "param2"]: コンテナの起動時に実行するデフォルトのコマンドを指定します。

3. Docker イメージのビルド

プロジェクトのルートディレクトリ( Dockerfile がある場所)に移動し、ビルドコマンドを実行します:

docker build -t your-app-name .
  • docker build: Dockerイメージを作成するコマンド。
  • -t your-app-name: イメージに名前をタグ付けします(例: my-nodejs-app).
  • .: ビルドコンテキスト(現在のディレクトリ)を指定し、Dockerに Dockerfile およびアプリケーションファイルの場所を指定します。

4. Docker コンテナの実行

イメージのビルドが完了したら、それを基にコンテナを作成して実行できます。

docker run -p 80:3000 your-app-name
  • docker run: コンテナを起動するコマンド。
  • -p 80:3000: ポートをマッピングします 3000 (アプリケーションがリッスンしているポート)をホストマシンのポート 80 にマッピングします。これにより、 http://localhost.
  • your-app-name: 実行したいDockerイメージの名前。

これで、WebアプリケーションがDockerコンテナ内で実行され、ブラウザからアクセスできるようになります。

5. マルチサービスアプリケーションにおける Docker Compose の活用

複数のサービス(Web アプリとデータベースなど)を含むアプリケーションの場合、Docker Compose は非常に有用です。Docker Compose は docker-compose.yml ファイルを使用して、すべてのサービスを定義および管理します。

PostgreSQLデータベースを使用するNode.jsアプリ用のdocker-compose.ymlの例:

version: '3.8' # Specifies the Compose file format version

services:
  web:
    build: . # Build the image from Dockerfile in the current directory
    ports:
      - "3000:3000"
    volumes:
      - .:/app # Mount local code for live updates (development)
    environment:
      DATABASE_URL: postgresql://user:password@db:5432/mydatabase
    depends_on:
      - db # Ensure database starts before web service
    networks:
      - app-network

  db:
    image: postgres:14-alpine # Use a pre-built PostgreSQL image
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - db_data:/var/lib/postgresql/data # Persist database data
    networks:
      - app-network

volumes:
  db_data: # Define the named volume

networks:
  app-network: # Define a custom network

Docker Composeを使用するには、プロジェクトのルートディレクトリに docker-compose.yml ファイルをプロジェクトのルートディレクトリに配置し、以下を実行します:

docker compose up -d --build
  • docker compose up: イメージをビルドし( --build が使用されている場合)イメージをビルドし、サービスを開始します。
  • -d: コンテナをデタッチモード(バックグラウンド)で実行します。

コンテナ、ネットワーク、およびボリュームを停止および削除するには:

docker compose down

この設定により、Webアプリケーション向けに再現性のある隔離された環境が提供され、開発とデプロイが大幅にスムーズになります。