1. Dockerとは?
Dockerは、アプリケーションを軽量でポータブルなコンテナに隔離することで、アプリケーションのデプロイ、スケーリング、管理を自動化するオープンソースプラットフォームです。コンテナは、アプリケーションがさまざまな環境で一貫して実行されるために必要なすべての依存関係、ライブラリ、設定ファイルをカプセル化したスタンドアロンの実行可能なユニットです。
- 公式 Docker
- 公式 Docker Docs
◇コンテナとは?
コンテナは、軽量でポータブルかつ隔離されたソフトウェア環境であり、開発者がアプリケーションとその依存関係を異なるプラットフォーム間で一貫して実行およびパッケージ化することを可能にします。これにより、アプリケーションの開発、デプロイ、管理プロセスが効率化され、基盤となるインフラストラクチャに関係なくアプリケーションが一貫して実行されることが保証されます。
- コース コンテナ入門 - AWS Skill Builder
- 公式 コンテナとは?
- フィード コンテナに関するトップ投稿を探る
◇コンテナの必要性
コンテナは、大規模なチームで作業する際の環境の不一致の問題を解決します。コンテナや仮想環境が登場する前は、同僚や友人と共有するプロジェクトをビルドするためにローカル環境をインストールおよび設定する必要があり、多くの問題や時間の損失が発生していました。
- 記事 コンテナの必要性
◇ベアメタル vs VM vs コンテナ
ベアメタルとは、仮想化なしでハードウェア上で直接実行されるコンピュータを指す用語です。これはアプリケーションを実行する最もパフォーマンスの高い方法ですが、最も柔軟性が低い方法でもあります。1台のサーバーで1つのアプリケーションしか実行できず、アプリケーションを別のサーバーに簡単に移動することはできません。仮想マシン(VM)は、1台のサーバーで複数のアプリケーションを実行する方法です。各VMはハイパーバイザーの上で実行されます。ハイパーバイザーは、コンピュータのハードウェアをエミュレートするソフトウェアで、1台のサーバー上で複数のオペレーティングシステムを実行できるようにし、異なるVM上で実行されるアプリケーション間の分離も提供します。コンテナは、ハイパーバイザーのオーバーヘッドなしで1台のサーバー上で複数のアプリケーションを実行する方法です。各コンテナはコンテナエンジン(コンテナのライフサイクルを管理するソフトウェア)の上で実行され、ホストオペレーティングシステムのカーネル機能を使用してプロセスを監視および隔離します。
◇DockerとOCI
Open Container Initiative(OCI)は、コンテナフォーマットとランタイムの業界標準を作成することを目的としたLinux Foundationのプロジェクトです。その主な目標は、定義された技術仕様を通じてコンテナ環境の互換性と相互運用性を確保することです。
2. 基盤技術
Dockerを支えるコアテクノロジーを理解することで、Dockerがどのように動作するかについてより深い洞察を得ることができ、プラットフォームをより効果的に使用するのに役立ちます。
-
Linuxコンテナ (LXC)
Linuxコンテナ (LXC) は、1台のコンピュータ上で複数の独立したLinuxシステムを実行できるようにします。LXCコンテナは隔離された空間として機能し、メモリや処理能力などのホストリソースを共有しますが、独自の完全なオペレーティングシステムのコピーを必要としないため、軽量で高速な起動が可能です。
-
コントロールグループ (cgroups)
コントロールグループ (cgroups) は、CPU、メモリ、I/Oなどのリソースを一連のプロセスに割り当てて管理するためのLinuxカーネル機能です。
-
ユニオンファイルシステム (UnionFS)
UnionFSは、複数のファイルシステムを単一の統合されたビューで重ね合わせることができるファイルシステムサービスです。
-
名前空間 (Namespaces)
名前空間 (Namespaces) は、プロセスの隔離を提供するもう一つのLinuxカーネル機能です。
-
公式 基盤技術
◇名前空間 (Namespaces) とは?
Dockerの名前空間 (Namespaces) は、Dockerがコンテナ用に隔離された環境を作成するために使用するLinuxの基本的な機能です。名前空間は、グローバルシステムリソースの別々のインスタンスを作成することで隔離層を提供し、各コンテナが独自のリソースセットを持っていると信じ込ませます。Dockerは、PID(プロセスID)、NET(ネットワーク)、MNT(マウント)、UTS(Unixタイムシェアリングシステム)、IPC(プロセス間通信)、およびUSER名前空間など、いくつかのタイプの名前空間を利用しています。これらの名前空間を活用することで、Dockerは軽量でポータブル、かつ安全なコンテナを作成し、異なる環境間で一貫して実行できるようにします。
- 公式 Docker名前空間
- 記事 Linux名前空間
◇コントロールグループ (cgroups)
cgroups(コントロールグループ)は、CPU、メモリ、ネットワーク帯域幅、I/Oなどのリソースを、システム上で実行されているプロセスのグループに割り当てて管理するためのLinuxカーネル機能です。これは、リソースの隔離を提供し、実行中のコンテナが使用できるリソースを制限する上で重要な役割を果たします。Dockerはcgroupsを利用してコンテナにリソース制約を課し、一貫した予測可能な動作を実現します。以下に、Dockerコンテナにおけるcgroupsの主な機能と利点をいくつか挙げます:
◇ユニオンファイルシステム (Union Filesystems)
ユニオンファイルシステム(UnionFSとも呼ばれる)は、Dockerの全体的な機能において重要な役割を果たします。これは、複数のディレクトリを重ね合わせることで仮想的な階層化されたファイル構造を作成する特殊なタイプのファイルシステムです。UnionFSは、元のファイルシステムを変更したりディレクトリをマージしたりする代わりに、複数のディレクトリを単一のマウントポイントに同時にマウントし、その内容を別々に保持します。この機能は、Dockerのコンテキストにおいて特に有益であり、重複を最小限に抑え、コンテナイメージのサイズを削減することでストレージのパフォーマンスを管理および最適化することができます。
- 記事 AUFS (Advanced Multi-Layered Unification Filesystem)
- 記事 OverlayFS (Overlay Filesystem)
- 記事 Btrfs (B-Tree Filesystem)
- 記事 ZFS (Z File System)
3. インストール設定
Dockerは、インストールと設定プロセスを簡素化するDocker Desktopというデスクトップアプリケーションを提供しています。また、Docker Engineを使用してインストールするオプションもありますが、Docker EngineのみをインストールするとGUI機能は提供されません。
◇Docker Desktop(Win / Mac / Linux)
Docker Desktopは、デスクトップマシン上でDocker環境を迅速にセットアップできるようにする簡単にインストールできるアプリケーションです。Windows、macOS、Linuxオペレーティングシステムで利用可能です。グラフィカルインターフェースを備えており、Dockerコンテナの管理と実行を簡素化し、ユーザーフレンドリーな体験とホストオペレーティングシステムとのシームレスな統合を提供します。
- 公式 Docker Desktopドキュメント
- 公式 Docker入門ガイド
- 公式 Docker Hub
- フィード Dockerに関するトップ投稿を探索
◇Docker Engine(Linux)
「Docker Desktop」と「Docker Engine」の間にはしばしば混乱が生じます。Docker Engineは、Docker Desktopコンポーネントの一部で、無料かつオープンソースであり、Linuxのみにインストールできます。Docker Engineはコンテナイメージをビルドし、それらからコンテナを実行し、一般的にDocker Desktopができるほとんどのことを行えますが、Linuxのみで動作し、Docker Desktopが提供するすべての開発者体験の洗練さは提供しません。
4. Dockerの基礎
Dockerは、軽量でポータブルなコンテナ内でアプリケーションを構築、パッケージ化、デプロイするプロセスを簡素化するプラットフォームです。このセクションでは、Dockerの基本、そのコンポーネント、および始めるために必要な主要なコマンドについて説明します。
-
コンテナとは何か?
コンテナは、アプリケーションを実行するために必要なすべての依存関係(ライブラリ、バイナリ、設定ファイル)を含む軽量でスタンドアロンの実行可能なソフトウェアパッケージです。コンテナはアプリケーションを環境から隔離し、異なるシステム間で一貫して動作することを保証します。
-
Dockerのコンポーネント
Dockerエコシステムには3つの主要なコンポーネントがあります:
- Dockerfile: Dockerイメージをビルドするための指示(コマンド)を含むテキストファイル。
- Dockerイメージ: Dockerfileから作成されたコンテナのスナップショット。イメージはDocker Hubなどのレジストリに保存され、レジストリからプルまたはプッシュできます。
- Dockerコンテナ: Dockerイメージの実行インスタンス。
-
Dockerコマンド
以下は頻繁に使用する基本的なDockerコマンドです:
docker pull <image>
: Docker Hubなどのレジストリからイメージをダウンロードします。docker build -t <image_name> <path>
: Dockerfileからイメージをビルドします。はDockerfileを含むディレクトリです。 docker image ls
: ローカルマシン上のすべてのイメージをリストします。docker run -d -p <host_port>:<container_port> --name <container_name> <image>
: イメージからコンテナを実行し、ホストポートをコンテナポートにマッピングします。docker container ls
: 実行中のすべてのコンテナをリストします。docker container stop <container>
: 実行中のコンテナを停止します。docker container rm <container>
: 停止したコンテナを削除します。docker image rm <image>
: ローカルマシンからイメージを削除します。
5. Dockerでのデータ永続化
Dockerを使用すると、ホストオペレーティングシステムから分離されたアプリケーションとその依存関係を含むコンテナを実行できます。コンテナはデフォルトで一時的なものであり、コンテナ内に保存されたデータはコンテナが終了すると失われます。この問題を克服し、コンテナのライフサイクルを超えてデータを保持するために、Dockerはさまざまなデータ永続化方法を提供しています。
◇一時的なコンテナファイルシステム
デフォルトでは、Dockerコンテナ内のストレージは一時的なものであり、コンテナ内で行われたデータの変更や修正は、コンテナが停止して削除されるまでしか保持されません。コンテナが停止して削除されると、関連するすべてのデータが失われます。これは、Dockerコンテナが本質的にステートレスであるように設計されているためです。この一時的または短命のストレージは「一時的なコンテナファイルシステム」と呼ばれます。これはDockerの重要な機能であり、コンテナの状態を気にすることなく、さまざまな環境でアプリケーションを迅速かつ一貫してデプロイできるようにします。
◇ボリュームマウント
ボリュームマウントは、ホストシステム上のフォルダまたはファイルをコンテナ内のフォルダまたはファイルにマッピングする方法です。これにより、コンテナが削除されてもデータがコンテナ外に永続化されます。さらに、複数のコンテナが同じボリュームを共有できるため、コンテナ間でのデータ共有が容易になります。
- 公式 Dockerボリューム
- 公式 Dockerボリュームフラグ
- 動画 6分でわかるDockerボリューム
◇バインドマウント
バインドマウントは、ボリュームと比べて機能が限られています。バインドマウントを使用すると、ホストマシン上のファイルまたはディレクトリがコンテナ内にマウントされます。ファイルまたはディレクトリは、ホストマシン上の絶対パスで参照されます。一方、ボリュームを使用すると、ホストマシン上のDockerのストレージディレクトリ内に新しいディレクトリが作成され、Dockerがそのディレクトリの内容を管理します。
6. サードパーティイメージの使用
サードパーティイメージは、Docker Hubや他のコンテナレジストリで利用可能な事前に構築されたDockerコンテナイメージです。これらのイメージは個人や組織によって作成および維持されており、コンテナ化されたアプリケーションの出発点として使用できます。
◇データベースの使用
データベースをDockerコンテナで実行することで、開発プロセスを効率化し、デプロイを容易にすることができます。Docker Hubには、MySQL、PostgreSQL、MongoDBなどの人気のあるデータベース用の多数の事前作成されたイメージが提供されています。
◇Dockerを使用したインタラクティブなテスト環境
Dockerを使用すると、テストが終了したら削除できる隔離された使い捨て環境を作成できます。これにより、サードパーティソフトウェアの操作、異なる依存関係やバージョンのテスト、ローカル設定を損なうリスクなく迅速に実験することがはるかに簡単になります。
- 公式 開発環境の起動
- 記事 テスト環境 - Medium
◇コマンドラインユーティリティ
Dockerイメージには、コンテナ内で実行できるコマンドラインユーティリティやスタンドアロンアプリケーションを含めることができます。
- 公式 Dockerイメージ
- 公式 Docker Run
- 公式 Docker Pull
7. コンテナイメージの構築
コンテナイメージは、アプリケーションを実行するために必要なすべての要素を含む実行可能なパッケージです。これには、コード、ランタイム、システムツール、ライブラリ、設定などが含まれます。カスタムイメージを構築することで、アプリケーションをその依存関係とともに、Dockerがサポートするプラットフォーム上でシームレスにデプロイできます。コンテナイメージを構築する際の主要なコンポーネントはDockerfile
です。これは、Dockerイメージをどのように組み立てるかに関する指示を含むスクリプトです。Dockerfile内の各指示は、イメージに新しいレイヤーを作成し、変更を追跡しやすくし、イメージサイズを最小化します。以下はDockerfileの簡単な例です:
- 公式 Docker Image Builder
- 公式 Dockerfile Reference
- オープンソース Dockerfileの例
◇Dockerfile
Dockerfileは、Dockerエンジンがイメージを構築するために使用する指示のリストを含むテキストドキュメントです。Dockerfile内の各指示は、イメージに新しいレイヤーを追加します。Dockerはこれらの指示に基づいてイメージを構築し、その後、そのイメージからコンテナを実行できます。
- 公式 Dockerfile Reference
- 公式 Dockerfileのベストプラクティス
- オープンソース Dockerfileの例
◇効率的なレイヤーキャッシング
コンテナイメージを構築する際、Dockerは新しく作成されたレイヤーをキャッシュします。これらのレイヤーは、後で他のイメージを構築する際に再利用され、ビルド時間を短縮し、帯域幅の使用を最小限に抑えます。ただし、このキャッシュメカニズムを最大限に活用するためには、レイヤーキャッシングを効率的に使用する方法を理解する必要があります。Dockerは、Dockerfile内の各指示(例:RUN
、COPY
、ADD
など)に対して新しいレイヤーを作成します。前回のビルド以降に指示が変更されていない場合、Dockerは既存のレイヤーを再利用します。
- 公式 Dockerレイヤーキャッシング
- 動画 レイヤーキャッシング
◇イメージサイズの削減
Dockerイメージのサイズを削減することは、ストレージの最適化、転送速度の向上、デプロイ時間の短縮にとって重要です。主要な戦略としては、Alpine Linuxのような最小限のベースイメージを使用すること、不要なビルドツールを除外するためにマルチステージビルドを活用すること、不要なファイルやパッケージを削除すること、コマンドを結合してレイヤーの数を最小限に抑えることなどが挙げられます。
- 公式 マルチステージビルド
- 公式 Dockerのベストプラクティス
- フィード セキュリティに関するトップ投稿を探索
8. コンテナレジストリ
コンテナレジストリは、Dockerコンテナイメージの集中型ストレージおよび配信システムです。これにより、開発者はこれらのイメージの形式でアプリケーションを簡単に共有およびデプロイできます。コンテナレジストリは、コンテナ化されたアプリケーションのデプロイにおいて重要な役割を果たします。なぜなら、さまざまな本番環境にわたってコンテナイメージを迅速かつ安全に配信する方法を提供するからです。
- 公式 Docker Registry
- 公式 Docker Hub
- 公式 Artifact Registry
- 公式 Amazon ECR
- 公式 Azure Container Registry
◇イメージタグのベストプラクティス
Dockerイメージのタグ付けに関するベストプラクティスは、明確で一貫性があり、情報量の多いラベルを作成することに焦点を当てています。リリースにはセマンティックバージョニングを採用し、本番環境では曖昧な「latest」タグを避け、ビルド日やGitコミットハッシュなどの関連メタデータを含めます。環境を区別する戦略を実施し、バリアントに対して説明的なタグを使用し、CI/CDパイプラインでタグ付けを自動化します。古いタグを定期的にクリーンアップし、規則を文書化して、明確さを維持し、チーム全体での採用を容易にします。これらのプラクティスにより、イメージ管理が効率化され、組織全体でのコラボレーションが向上します。
◇DockerHubの代替
コンテナイメージは、Dockerhubだけでなく、多くの異なるレジストリに保存できます。ほとんどの主要なクラウドプラットフォームは、Google Cloud Platformの「Artifact Registry」、AWSのElastic Container Registry、Microsoft AzureのAzure Container Registryなどのコンテナレジストリを提供しています。GitHubも独自のレジストリを提供しており、GitHub Actionsワークフローにコンテナビルドが含まれている場合に便利です。
- 公式 DockerHub
- 公式 Artifact Registry
- 公式 Amazon ECR
- 公式 Azure Container Registry
- 公式 GitHub Container Registry
◇DockerHub
Docker Hubは、Dockerコンテナイメージの主要な公開リポジトリとして機能するクラウドベースのレジストリサービスです。ユーザーはDockerイメージを保存、共有、配布でき、無料の公開リポジトリと有料のプライベートリポジトリの両方を提供します。また、Docker CLIとシームレスに統合され、イメージのプッシュやプルを簡単に行えます。Docker Hubには、ソフトウェアベンダーによってメンテナンスされる公式イメージ、ソースコードリポジトリにリンクされた自動ビルド、リポジトリイベントに基づいてアクションをトリガーするウェブフックなどの機能があります。
- 公式 DockerHub
- 公式 DockerHubリポジトリ
- 公式 DockerHubウェブフック
9. コンテナの実行
Dockerコンテナの実行は、通常、docker run
コマンドを使用して行われます。このコマンドは、docker create
とdocker start
コマンドを組み合わせたものです。
- 公式 Docker Run
- 公式 Docker Containers
- 公式 Docker Exec
- 公式 Docker Stop
◇コンテナの実行
docker run
コマンドは、指定されたイメージから新しいコンテナを作成し、起動します。これはdocker create
とdocker start
の操作を組み合わせたもので、コンテナの実行環境をカスタマイズするためのさまざまなオプションを提供します。ユーザーは環境変数を設定し、ポートやボリュームをマッピングし、ネットワーク接続を定義し、リソース制限を指定することができます。このコマンドは、バックグラウンド実行のためのデタッチモード、シェルアクセスのためのインタラクティブモード、およびイメージで定義されたデフォルトコマンドを上書きする機能をサポートしています。一般的なフラグには、デタッチモードの-d
、ポートマッピングの-p
、ボリュームマウントの-v
、カスタムコンテナ名を割り当てるための--name
があります。docker run
を理解することは、Dockerコンテナを効果的に展開および管理するための基本です。
- 公式 Docker Run
◇Docker Compose
Docker Composeは、複数コンテナのDockerアプリケーションを定義および実行するためのツールです。docker-compose.yml
というシンプルなYAMLファイルを使用して、アプリケーションのサービス、ネットワーク、ボリュームを記述し、たった1つのコマンドでコンテナを簡単に実行および管理することができます。
ランタイム設定オプション
Dockerのランタイム設定オプションは、コンテナの環境を強力に制御することができます。リソース制限、ネットワーク設定、セキュリティプロファイル、ロギングドライバを調整することで、パフォーマンスを最適化し、セキュリティを強化することができます。また、環境変数の設定、ボリュームのマウント、デフォルトの動作の上書きなど、コンテナを特定のニーズに合わせてカスタマイズするためのオプションも提供されています。より高度なユーザー向けには、カーネル機能を調整したり、再起動ポリシーを設定するツールもあります。コマンドラインフラグやDocker Composeファイルを使用する場合でも、これらのオプションは、コンテナがどこに展開されてもスムーズかつ一貫して実行されることを保証します。
- 公式 Docker ドキュメント
- 記事 Docker ランタイム引数
10. コンテナセキュリティ
コンテナセキュリティは、開発から展開、ランタイムまでのコンテナ化されたアプリケーションを保護するための幅広いプラクティスとツールを包含しています。これには、コンテナイメージのセキュリティ確保、信頼されていて脆弱性のないコードのみを使用すること、コンテナ環境に対する強力なアクセス制御の実装、および最小権限の原則に従うようにコンテナを設定することが含まれます。さらに、予期しない動作の監視、コンテナ間の通信の保護、ホスト環境のセキュリティの維持も含まれます。効果的なコンテナセキュリティは、DevSecOpsワークフローにシームレスに統合され、開発速度や敏捷性を損なうことなく、コンテナライフサイクル全体にわたって継続的な可視性と保護を提供します。
◇イメージセキュリティ
イメージセキュリティは、環境内でDockerコンテナを展開する上で重要な側面です。使用するイメージが安全で、最新であり、脆弱性がないことを確認することが不可欠です。このセクションでは、Dockerイメージを保護および管理するためのベストプラクティスとツールを確認します。パブリックリポジトリからイメージをプルする際は、常に信頼できる公式イメージをコンテナ化アプリケーションの出発点として使用してください。公式イメージはDockerによって審査され、定期的にセキュリティ修正が適用されます。これらのイメージはDocker Hubやその他の信頼できるレジストリで見つけることができます。
◇ランタイムセキュリティ
Dockerにおけるランタイムセキュリティは、コンテナが実行されている間の安全性と整合性を確保することに焦点を当てています。これにより、コンテナ化されたアプリケーションが実行中に発生する可能性のある脆弱性や悪意のある活動から保護されます。これには、コンテナの動作を監視して異常を検出し、アクセス制御を実装して権限を制限し、リアルタイムで不審な活動を検出して対応するツールを使用することが含まれます。効果的なランタイムセキュリティは、検証済みのイメージのみが展開されることを保証し、システムを継続的に監査してコンプライアンスを維持し、コンテナライフサイクル全体にわたって望ましいセキュリティ態勢を維持するための堅牢な防御層を提供します。
11. Docker CLI
Dockerコマンドラインインターフェース(CLI)は、Dockerエンジンと対話するための強力なツールであり、開発者やオペレーターがコンテナや関連リソースを構築、管理、トラブルシューティングすることを可能にします。Docker CLIは、コンテナの作成や管理(docker run
、docker stop
)、イメージのビルド(docker build
)、ネットワークの管理(docker network
)、ストレージの扱い(docker volume
)、システムステータスの確認(docker ps
、docker info
)など、Dockerのあらゆる側面を制御するための幅広いコマンドを提供します。その直感的な構文と柔軟性により、ユーザーは複雑なワークフローを自動化し、開発プロセスを効率化し、コンテナ化されたアプリケーションを簡単に維持できるため、Dockerの管理とオーケストレーションにおける基本的なユーティリティとなっています。
- 公式 Docker CLI
- 公式 Docker Compose
◇Dockerイメージ
Dockerイメージは、アプリケーションコード、ランタイム、ライブラリ、システムツールなど、ソフトウェアを実行するために必要なすべてを含む軽量でスタンドアロンの実行可能なソフトウェアパッケージです。これらはコンテナを作成するための設計図として機能し、レイヤーごとに構築されます。各レイヤーはファイルシステムの変更を表し、効率的なストレージと配布を可能にします。DockerイメージはDocker Hubなどのコンテナレジストリに保存され、そこからプルすることができるため、開発者は異なる環境間でアプリケーションを一貫して共有、デプロイ、バージョン管理することができ、再現性を確保し、依存関係の管理プロセスを簡素化します。
◇コンテナ
コンテナは、共有されたオペレーティングシステムカーネルを使用してアプリケーションを実行するための隔離された軽量な環境であり、異なるコンピューティング環境間での一貫性と移植性を確保します。コンテナは、コード、依存関係、設定など、アプリケーションを実行するために必要なすべてをカプセル化しているため、コンテナ化されたアプリケーションを簡単に移動してどこでも実行できます。Docker CLIを使用すると、docker run
、実行中のコンテナをリストするdocker ps
、コンテナを停止するdocker stop
、リアルタイムでコンテナと対話するdocker exec
などのコマンドでコンテナを作成、開始、停止、管理できます。CLIは、開発者がコンテナを簡単に構築、制御、デバッグするための強力なインターフェースを提供し、開発と運用のワークフローを効率化します。
◇Dockerボリューム
Dockerボリュームは、コンテナのファイルシステム外でデータを管理および保存するための永続的なストレージソリューションであり、コンテナが削除または再作成されてもデータが残るようにします。これらは、アプリケーションデータ、ログ、設定ファイルなど、コンテナの再起動や更新後も永続化する必要があるデータを保存するのに理想的です。Docker CLIを使用すると、docker volume create
で新しいボリュームを定義し、docker volume ls
で全てのボリュームをリストし、docker run -v
で特定のコンテナにボリュームをマウントすることができます。このアプローチは、データの整合性を維持し、バックアッププロセスを簡素化し、コンテナ間でのデータ共有をサポートするため、ステートフルなコンテナ化アプリケーションの核心部分となっています。
- 公式 Dockerボリューム
- 公式 Dockerボリュームコマンド
◇Dockerネットワーク
Dockerネットワークは、コンテナが互いに通信し、外部システムと通信することを可能にし、マイクロサービスアーキテクチャに必要な接続性を提供します。デフォルトで、Dockerはブリッジ、ホスト、オーバーレイなど、いくつかのネットワークタイプを提供しており、それぞれ隔離された環境、高性能シナリオ、マルチホスト通信などの異なるユースケースに適しています。Docker CLIを使用すると、docker network create
でカスタムネットワークを定義し、docker network ls
で既存のネットワークをリストし、docker network connect
でコンテナをネットワークに接続することができます。この柔軟性により、開発者はコンテナがどのように相互作用するかを制御し、分散アプリケーション全体での安全で効率的な通信を確保できます。
- 公式 Dockerネットワーク
- 公式 Dockerネットワークコマンド
- 動画 Dockerネットワーキング
12. 開発者エクスペリエンス
Dockerは、アプリケーションを構築、テスト、実行するための一貫した隔離された環境を提供することで、開発者エクスペリエンスを大幅に向上させ、「私のマシンでは動く」問題を解消します。Dockerを使用すると、開発者はアプリケーションとその依存関係をポータブルなコンテナにパッケージ化し、ローカル開発からステージング、本番環境まで異なる環境間での一貫性を確保できます。環境の簡素化と再現性により、オンボーディングが加速され、競合が最小化され、開発者は設定のトラブルシューティングではなくコーディングに集中できます。さらに、Docker Composeなどのツールを使用すると、複雑なマルチコンテナアプリケーションの迅速なオーケストレーションが可能になり、プロトタイピング、反復、コラボレーションが容易になり、開発ライフサイクル全体が効率化されます。
◇Dockerでのホットリロード
レイヤーキャッシュを有効にすることでイメージのビルドを高速化できますが、コードが変更されるたびにコンテナイメージを再ビルドする必要はありません。代わりに、コンテナ内のアプリケーションの状態が変更を即座に反映するようにしたいです。これは、バインドマウントとホットリロードユーティリティの組み合わせで実現できます!
◇Dockerでのデバッガー
コンテナを使用した開発をローカル開発と競争力のあるものにするためには、コンテナ内でデバッガーを実行し、アタッチする機能が必要です。
◇テスト
本番環境にできるだけ近い環境でテストを実行したいので、コンテナ内でテストを実行することは理にかなっています!これには、ユニットテスト、統合テスト、エンドツーエンドテストが含まれ、すべてDockerコンテナ内で実行され、外部依存関係からの干渉を避けながら実際のシナリオをシミュレートします。Docker CLIやDocker Composeなどのツールを使用すると、隔離されたテスト環境を作成し、テストを並列実行し、必要なインフラストラクチャを自動的に立ち上げて削除することができます。
- 記事 テストの実行 - Docker
- フィード テストに関するトップ投稿を探索
◇継続的インテグレーション(CI)
継続的インテグレーションは、コードをバージョン管理システムにプッシュする際に、自動的にいくつかのアクション(ビルド、テストなど)を実行するという考え方です。
コンテナに関しては、以下のようなことを行いたい場合があります:
-
コンテナイメージをビルドする
-
テストを実行する
-
コンテナイメージの脆弱性をスキャンする
-
有用なメタデータでイメージにタグを付ける
-
コンテナレジストリにプッシュする
-
フィード CI/CDに関するトップ投稿を探索
13. コンテナのデプロイ
コンテナのデプロイは、Dockerとコンテナ化を使用してアプリケーションをより効率的に管理し、簡単にスケールし、環境間で一貫したパフォーマンスを確保するための重要なステップです。このトピックでは、Dockerコンテナをデプロイしてアプリケーションを作成し、実行する方法の概要を説明します。
- 公式 Dockerデプロイメント
- 公式 Docker Compose
- 公式 Docker Swarm
◇コンテナをデプロイするためのPaaSオプション
コンテナをデプロイするためのプラットフォームとしてのサービス(PaaS)オプションは、開発者が基盤となるインフラストラクチャを気にすることなく、コンテナ化されたアプリケーションを構築、デプロイ、スケールできる簡素化された管理環境を提供します。人気のあるPaaSオファリングには、Google Cloud Run、Azure App Service、AWS Elastic Beanstalk、Herokuなどがあり、これらはコンテナオーケストレーションの複雑さを抽象化し、自動スケーリング、CI/CDパイプラインとの簡単な統合、監視機能を提供します。これらのプラットフォームは、サーバー管理ではなくアプリケーションロジックに集中できるようにすることで、迅速な開発とデプロイをサポートし、最小限の運用オーバーヘッドで本番環境でコンテナを実行するためのシームレスな方法を提供します。
- 公式 コンテナをデプロイするためのPaaSオプション
- 公式 Azure Container Instances
- 公式 Google Cloud Run
- 公式 IBM Cloud Code Engine
- 公式 Amazon Elastic Container Service
◇Kubernetes
Kubernetesは、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのオープンソースのコンテナオーケストレーションプラットフォームです。Kubernetesは、コンテナをポッドと呼ばれる論理単位に編成し、サービスディスカバリ、ロードバランシング、宣言型設定によるスケーリングを管理することで、複雑なコンテナワークロードを処理するための堅牢なフレームワークを提供します。Kubernetesは、コンテナをマシンのクラスター全体にデプロイし、自動再起動、置換、ロールバックメカニズムなどの自己修復機能を通じて高可用性とフォールトトレランスを確保します。その広範なエコシステムと柔軟性により、Kubernetesは大規模な分散アプリケーションを実行するためのデファクトスタンダードとなり、運用を簡素化し、コンテナ化されたワークロードの信頼性を向上させます。
- 公式 Kubernetes
- 公式 Docker Swarm
◇Docker Swarm
Docker Swarmは、Dockerのネイティブなコンテナオーケストレーションツールであり、ユーザーがDockerホストのクラスター全体にコンテナをデプロイ、管理、スケールすることを可能にします。Dockerノードのグループを単一の統一されたクラスターに変換することで、Swarmは高可用性、ロードバランシング、シンプルな宣言型コマンドを使用した自動コンテナスケジューリングを提供します。サービスディスカバリ、ローリングアップデート、TLS暗号化による統合セキュリティなどの機能を備えたDocker Swarmは、Kubernetesのようなより複雑なオーケストレーターに対するアプローチ可能な代替手段を提供します。Docker CLIとの緊密な統合と簡単なセットアップにより、シンプルさと直感的な管理が優先される小規模から中規模のデプロイメントに適した選択肢となっています。
- 公式 Docker Swarm
◇Nomad: コンテナのデプロイ
Nomadは、クラスターマネージャーおよびスケジューラーであり、コンテナ化されたアプリケーションをデプロイ、管理、スケールすることを可能にします。Nomadは、ノードの障害、リソース割り当て、コンテナオーケストレーションを自動的に処理します。Nomadは、Dockerコンテナだけでなく、他のコンテナランタイムや非コンテナ化アプリケーションの実行もサポートします。
- 公式 Nomadドキュメント