アプリケーション構築のための主要な Docker コマンド

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

はじめに

この包括的なチュートリアルでは、アプリケーションの構築と管理のための主要な Docker コマンドについて解説します。Docker のインストールと設定、必須の Docker コマンドとコンテナのライフサイクル、カスタマイズされたアプリケーション環境の作成、アプリケーションのデプロイとスケーリング、およびマルチコンテナ アプリケーションのオーケストレーションのための Docker Compose の活用方法を学習します。このチュートリアルを完了するまでに、Docker を使用した構築に役立つ強力な Docker コマンドに関する確かな理解を得られるでしょう。

Docker の概要:コンテナとその利点について

Docker は、アプリケーションの開発、パッケージ化、デプロイ方法を革新した強力なプラットフォームです。その核となるのは、コンテナ化技術を用いて、アプリケーションとその依存関係を自己完結的な単位であるコンテナにカプセル化する仕組みです。このアプローチは、ソフトウェア開発およびデプロイ環境において、Docker を広く採用されるソリューションたらしめた数々の利点を提供します。

コンテナについて

コンテナは、アプリケーションを実行するために必要なコード、ランタイム、システムツール、ライブラリなど、すべてのコンポーネントを含む軽量で移植性があり、自己完結的なソフトウェアパッケージです。従来の仮想マシンとは異なり、コンテナは完全なオペレーティングシステムを必要としません。代わりに、ホストシステムのカーネルを共有するため、より効率的でリソースフレンドリーです。

コンテナ化の利点

  1. 一貫性と再現性: コンテナは、基盤となるインフラストラクチャに関係なく、アプリケーションが同じ方法で実行されることを保証し、一貫性があり予測可能な環境を提供します。
  2. スケーラビリティと柔軟性: コンテナは、簡単にスケールアップまたはスケールダウンでき、効率的なリソース利用とアプリケーションの動的なスケーリングを可能にします。
  3. 分離とセキュリティ: コンテナは、アプリケーション間の競合を防ぎ、アプリケーションが独立して実行されることを保証する、安全で隔離された環境を提供します。
  4. 開発者の生産性向上: コンテナ化は、開発、テスト、デプロイプロセスを簡素化し、開発者がインフラストラクチャの管理ではなくアプリケーションの構築に集中できるよう支援します。
  5. 移植性とデプロイの簡素化: コンテナは、さまざまなプラットフォームや環境に簡単にパッケージ化、共有、デプロイでき、アプリケーションの配信プロセスを効率化します。

Docker のコンテナ化における役割

Docker は、コンテナの構築、デプロイ、管理のための包括的なエコシステムを提供する、リーディングなコンテナ化プラットフォームです。コンテナ化プロセスを簡素化する幅広いツールと機能を提供しており、以下のようなものがあります。

  1. Docker エンジン: コンテナの作成と実行を管理する Docker のコアコンポーネントです。
  2. Docker イメージ: アプリケーションコード、依存関係、設定を含む標準化されたテンプレートで、コンテナの一貫した作成を可能にします。
  3. Docker コンテナ: Docker イメージの実行インスタンスで、アプリケーションとその依存関係をカプセル化します。
  4. Docker レジストリ: Docker イメージを格納および配布するための中央リポジトリで、アプリケーションの共有とデプロイを促進します。

Docker を活用することで、開発者と運用チームは、アプリケーションの開発、テスト、デプロイライフサイクルを効率化し、効率性、スケーラビリティ、信頼性を向上させることができます。

graph TD
  A[Docker エンジン] --> B[Docker イメージ]
  B --> C[Docker コンテナ]
  C --> D[Docker レジストリ]

Docker のインストールと設定:プラットフォームでの開始

Docker を使用するには、まずプラットフォームにインストールおよび設定する必要があります。このセクションでは、Ubuntu 22.04 でのインストール手順を説明します。

Ubuntu 22.04 での Docker インストール

  1. パッケージインデックスを更新し、必要な依存関係をインストールします。
sudo apt-get update
sudo apt-get install -y \
  ca-certificates \
  curl \
  gnupg \
  lsb-release
  1. 公式 Docker GPG キーを追加し、Docker リポジトリを設定します。
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
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
  1. Docker エンジン、Docker CLI、Docker Compose をインストールします。
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

Docker インストールの確認

インストール後、Docker が正しくインストールされ、実行されていることを確認します。

  1. Docker のバージョンを確認します。
docker version
  1. 簡単な "Hello, World!" コンテナを実行します。
docker run hello-world

インストールが成功すると、「Hello from Docker!」というメッセージが表示されます。

Docker の設定

デフォルトでは、Docker デーモンは root ユーザーとして実行されますが、すべての環境でこれが望ましいとは限りません。非 root ユーザーが Docker を管理できるようにするには、docker グループに追加できます。

sudo usermod -aG docker your-username

変更が有効になるには、ログアウトしてログインし直してください。

これで Docker がインストールおよび設定されましたので、Docker の基本を学び、最初の Docker ベースのアプリケーションを構築できます。

Docker の基礎:必須コマンドとコンテナのライフサイクル

Docker を効果的に扱うためには、基本的なコマンドと Docker コンテナのライフサイクルを理解することが不可欠です。このセクションでは、最も一般的に使用される Docker コマンドと、コンテナのさまざまなライフサイクル段階について説明します。

必須 Docker コマンド

  1. docker run: 指定されたイメージから新しいコンテナを作成し、起動します。
  2. docker image ls: システム上のすべての Docker イメージを一覧表示します。
  3. docker container ls: すべての稼働中のコンテナを一覧表示します。
  4. docker container stop: 稼働中のコンテナを停止します。
  5. docker container rm: コンテナを削除します。
  6. docker image build: Dockerfile から新しい Docker イメージをビルドします。
  7. docker image push: Docker Hub などのレジストリに Docker イメージをプッシュします。
  8. docker network create: 新しい Docker ネットワークを作成します。
  9. docker volume create: 新しい Docker ボリュームを作成します。
  10. docker-compose up: Docker Compose ファイルで定義されたマルチコンテナアプリケーションを起動します。

Docker コンテナのライフサイクル

Docker コンテナのライフサイクルは、以下の段階に分けられます。

  1. 作成: docker run コマンドを使用して、Docker イメージからコンテナが作成されます。
  2. 実行: コンテナが起動し、そのアプリケーションが実行されます。
  3. 一時停止: コンテナのプロセスが一時停止されますが、コンテナ自体はメモリ内に残ります。
  4. 停止: コンテナのアプリケーションが停止しますが、コンテナ自体は存在し続けます。
  5. 再起動: 停止したコンテナは再起動でき、その実行を再開します。
  6. 削除: docker container rm コマンドを使用して、コンテナをシステムから削除できます。
graph TD
  A[コンテナ作成] --> B[コンテナ実行]
  B --> C[コンテナ一時停止]
  B --> D[コンテナ停止]
  D --> E[コンテナ再起動]
  E --> B
  D --> F[コンテナ削除]

これらの必須コマンドとコンテナのライフサイクルを理解することで、Docker コンテナを効果的に管理し、アプリケーションの構築とデプロイのための基盤を築くことができます。

Docker イメージの構築:カスタマイズされたアプリケーション環境の作成

Docker の機能の中核は、カスタム Docker イメージを構築する能力です。これらのイメージは、コンテナ化されたアプリケーションを実行するための基盤となり、独自の要件を満たすように調整された環境を作成できます。

Docker イメージの理解

Docker イメージは、アプリケーションコード、依存関係、その他の必要なコンポーネントを含むレイヤードファイルシステムです。Docker コンテナを作成するためのテンプレートとして機能し、一貫した再現可能な環境を保証します。

Docker イメージの作成

Docker イメージを作成するには、Dockerfile を使用します。Dockerfile は、イメージを構築するための手順を定義するテキストベースのスクリプトです。シンプルな Node.js アプリケーションのための Dockerfile の例を次に示します。

## 公式の Node.js イメージをベースとして使用
FROM node:14

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

## package.json と package-lock.json ファイルをコピー
COPY package*.json ./

## アプリケーションの依存関係をインストール
RUN npm ci

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

## アプリケーションをビルド
RUN npm run build

## アプリケーションポートを公開
EXPOSE 3000

## アプリケーションを起動
CMD ["npm", "start"]

この Dockerfile を使用して Docker イメージを構築するには、次のコマンドを実行します。

docker build -t my-node-app .

このコマンドは、タグ my-node-app を持つ新しい Docker イメージを作成します。

Docker イメージの最適化

効率的で安全な Docker イメージを確保するために、以下のベストプラクティスを適用できます。

  1. 適切なベースイメージの使用: alpinedebian-slim などの、軽量で安全なベースイメージを選択してください。
  2. イメージレイヤの最小化: Dockerfile の指示を統合して、イメージ内のレイヤ数を減らします。
  3. マルチステージビルドの活用: ビルド環境と実行環境を分離するマルチステージビルドを使用することで、最終的なイメージサイズを削減します。
  4. 脆弱性のスキャン: Trivy や Snyk などのツールを使用して、Docker イメージに既知の脆弱性がないかスキャンします。
  5. キャッシュ戦略の実装: Docker のキャッシュ機構を活用して、ビルドプロセスを高速化します。

Docker イメージの構築の技術を習得することで、アプリケーションに合わせたカスタマイズされた最適化された環境を作成し、シームレスなデプロイとスケーラビリティを実現できます。

Docker コンテナの実行と管理:アプリケーションのデプロイとスケーリング

Docker イメージを構築したら、次に、そのイメージに基づいてコンテナを実行および管理するステップです。このセクションでは、コンテナ化されたアプリケーションをデプロイおよびスケーリングするための必須コマンドとテクニックについて説明します。

Docker コンテナの実行

Docker コンテナを実行するには、docker run コマンドを使用します。Nginx Web サーバーコンテナを実行する例を次に示します。

docker run -d -p 80:80 --name my-nginx nginx

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

  • -d: デタッチモード (バックグラウンド) でコンテナを実行
  • -p 80:80: ホストのポート 80 をコンテナのポート 80 にマッピング
  • --name my-nginx: コンテナに名前 "my-nginx" を割り当てる
  • nginx: "nginx" Docker イメージを使用してコンテナを作成

Docker コンテナの管理

コンテナが実行されたら、さまざまなコマンドを使用して管理できます。

  • docker container ls: すべての稼働中のコンテナをリスト表示
  • docker container stop <container_name>: 実行中のコンテナを停止
  • docker container start <container_name>: 停止したコンテナを起動
  • docker container rm <container_name>: コンテナを削除
  • docker container logs <container_name>: コンテナのログを表示
  • docker container exec -it <container_name> <command>: 実行中のコンテナ内でコマンドを実行

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

コンテナ化されたアプリケーションをスケーリングするには、Docker の組み込み機能を使用するか、Docker Swarm や Kubernetes などのオーケストレーションツールを活用できます。Docker Swarm を使用した Web アプリケーションのスケーリング例を次に示します。

  1. Docker Swarm クラスタを作成する:
docker swarm init
  1. Docker Swarm サービスとしてアプリケーションをデプロイする:
docker service create --name my-web-app -p 80:80 my-web-app:latest
  1. サービスを複数のレプリカにスケーリングする:
docker service scale my-web-app=3

これにより、my-web-app サービスのレプリカが 3 つ作成され、アプリケーションを水平方向にスケーリングできます。

Docker コンテナの実行、管理、スケーリング方法を理解することで、コンテナ化されたアプリケーションを効果的にデプロイおよび保守し、高い可用性とスケーラビリティを確保できます。

Docker のネットワークとボリューム:コンテナ間の接続とデータの永続化

コンテナ化された環境では、複雑なアプリケーションを構築および管理するために、ネットワークとデータの永続化が不可欠です。Docker は、これらの要件に対応するための強力なネットワークとボリューム機能を提供します。

Docker ネットワーク

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

  1. ブリッジネットワーク: 同じホスト上のコンテナを接続するデフォルトのネットワークモード。
  2. ホストネットワーク: コンテナは、ホストマシンの同じネットワークスタックを共有します。
  3. オーバーレイネットワーク: 複数の Docker ホスト間のコンテナ間の通信を可能にします。
  4. Macvlan ネットワーク: コンテナに MAC アドレスを割り当て、物理的なネットワークデバイスのように動作させます。

カスタムブリッジネットワークを作成し、コンテナをそれに接続するには、次のコマンドを使用できます。

## 新しいブリッジネットワークを作成
docker network create my-network

## コンテナを実行し、ネットワークに接続
docker run -d --name my-app --network my-network my-app:latest

Docker ボリューム

Docker ボリュームは、コンテナによって生成されたデータを永続的に保存する方法を提供し、コンテナが停止または削除された場合でもデータが失われないようにします。いくつかの種類のボリュームがあります。

  1. 名前付きボリューム: Docker によって管理される、一意の名前を持つボリューム。
  2. バインドマウント: ホストマシンのディレクトリをコンテナにマッピングします。
  3. tmpfs マウント: ホスト上のデータが永続化されない、メモリ上のファイルシステム。

名前付きボリュームを作成し、コンテナで使用する方法の例を次に示します。

## 名前付きボリュームを作成
docker volume create my-volume

## コンテナを実行し、ボリュームをマウント
docker run -d --name my-db -v my-volume:/data my-db:latest

Docker のネットワークとボリューム機能を理解することで、互いに通信し、コンテナのライフサイクル全体でデータを永続化できる、高度にスケーラブルで堅牢なアプリケーションを構築できます。

Docker Compose:マルチコンテナアプリケーションのオーケストレーション

Docker は個々のコンテナを実行するための強力なプラットフォームを提供しますが、複雑で複数のサービスを持つアプリケーションを管理することは煩雑になる可能性があります。Docker Compose が登場する場所です。Docker Compose を使用すると、アプリケーション全体のスタックのデプロイを定義およびオーケストレーションできます。

Docker Compose の概要

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

Docker Compose ファイルの定義

データベースを備えたシンプルな Web アプリケーションの Docker Compose ファイルの例を次に示します。

version: "3"

services:
  web:
    build: .
    ports:
      - "80:8080"
    depends_on:
      - db
  db:
    image: postgres:12
    volumes:
      - db-data:/var/lib/postgresql/data

volumes:
  db-data:

この構成は、webdb の 2 つのサービスを定義しています。web サービスは、現在のディレクトリからイメージをビルドし、ホストのポート 80 をコンテナのポート 8080 にマッピングします。db サービスは、公式の Postgres 12 イメージを使用し、データ永続化のために名前付きボリュームをマウントします。

Docker Compose の使用

Docker Compose を使用する手順を次に示します。

  1. プロジェクトディレクトリに Docker Compose ファイルを作成します。
  2. アプリケーションを管理するために、次のコマンドを実行します。
    • docker-compose up -d:デタッチモードでアプリケーションを開始します。
    • docker-compose down:アプリケーションを停止および削除します。
    • docker-compose ps:実行中のサービスをリストします。
    • docker-compose logs:アプリケーションのログを表示します。

Docker Compose は、マルチコンテナアプリケーションのデプロイと管理を簡素化し、サービスのライフサイクルを調整し、開発およびデプロイプロセスにおけるさまざまな段階で一貫した環境を確保しやすくなります。

Docker 開発のためのベストプラクティス:ワークフローの最適化

Docker を使いこなすにつれて、開発ワークフローを最適化し、Docker ベースのアプリケーションの長期的な保守性を確保するためのベストプラクティスを採用することが重要です。このセクションでは、考慮すべき重要なベストプラクティスについて説明します。

一貫した命名規則を採用する

Docker イメージ、コンテナ、ネットワーク、ボリュームの命名規則を確立します。これにより、環境を整理し、リソースを管理しやすくなります。たとえば、<アプリケーション>-<サービス>-<環境> などの命名スキームを使用できます。

マルチステージビルドを活用する

マルチステージビルドを使用すると、ビルド環境と実行環境を分離し、より小さく、より安全な Docker イメージを作成できます。このアプローチは、ビルドプロセスがリソース集約的で、最終的な実行時イメージが大幅に小さくなるコンパイル言語に特に役立ちます。

CI/CD を実装する

Docker を継続的インテグレーション (CI) および継続的デリバリー (CD) パイプラインに統合します。これにより、Docker ベースのアプリケーションを自動的にビルド、テスト、デプロイでき、一貫性を確保し、手動作業を削減できます。

Docker 環境を監視および保護する

Prometheus、Grafana、Sysdig などのツールを使用して、Docker 環境の健康状態とパフォーマンスを監視します。さらに、イメージの脆弱性スキャン、アクセス制御の適用、Docker デーモンとエンジンを最新の状態に保つなどのセキュリティのベストプラクティスを採用します。

Docker イメージレイヤーを最適化する

Dockerfile を慎重に構成して、Docker イメージ内のレイヤー数を最小限に抑えます。これは、指示を統合し、キャッシュ戦略を活用してビルドプロセスを高速化することで実現できます。

ローカル開発に Docker Compose を利用する

Docker Compose を使用して、ローカル開発環境を定義および管理します。これにより、アプリケーションスタックの設定と取り外しが容易になり、さまざまな開発マシン間で一貫性を確保できます。

Docker エコシステムを最新の状態に保つ

Docker エコシステムの最新動向、新しい機能、ベストプラクティス、セキュリティアップデートなどについて常に最新の情報を入手します。Docker のドキュメントを定期的に確認し、Docker コミュニティに参加して、常に最新の状況を把握します。

これらのベストプラクティスに従うことで、Docker 開発ワークフローを最適化し、Docker ベースのアプリケーションの品質と保守性を向上させ、スムーズで効率的な開発体験を確保できます。

まとめ

このチュートリアルでは、アプリケーションの構築と管理に必要な基本的な Docker コマンドを学習しました。Docker のインストールと設定から、カスタムイメージの作成、コンテナの実行と管理、マルチコンテナアプリケーションのオーケストレーションまで、効率的でスケーラブルなアプリケーション開発のために Docker の機能を活用するための知識とツールを習得しました。これらの Docker コマンドをマスターすることで、アプリケーションの構築、デプロイ、管理を容易に行えるようになります。