Docker、Dockerfile、DockerComposeの違い
1. 序章
ますます多くのアプリケーションがクラウドコンピューティングに移行するにつれて、用語が混乱する場合があります。
この記事では、 Docker、Dockerfile、DockerComposeの違いについて説明します。
2. Docker
まず、クラウドコンピューティングプラットフォームのコアコンポーネントの1つであるDockerを見てみましょう。 Dockerは、アプリケーションを実行するインフラストラクチャから効率的かつ安全に分離できるようにするコンテナーエンジンです。
これは正確にはどういう意味ですか? Dockerを使用すると、仮想化環境で、必要なほぼすべてのハードウェアまたはオペレーティングシステムを使用して任意のアプリケーションを実行できます。 これは、開発、テスト、および本番環境のアプリケーションに同じ環境を使用できることを意味します。
Dockerを構成するいくつかの重要なコンポーネントがあります。
- デーモン:DockerデーモンはDocker APIリクエストをリッスンし、画像やコンテナなどのオブジェクトを管理します。
- クライアント:Dockerクライアントは、デーモンにコマンドを発行するためのメインインターフェイスです。
- デスクトップ:Dockerデスクトップは、デーモンとの対話を簡素化するMacおよびWindows用のDockerの特殊バージョンです。
さらに、よく知っておくべきDockerオブジェクトがいくつかあります。
- イメージ:イメージは、アプリケーションの実行に必要なすべてのファイル(オペレーティングシステムとアプリケーションコードを含む)を含む自己完結型のファイルです。 画像にはレイヤーがあり、各レイヤーは1つ以上のファイルとディレクトリのセットを提供します。
- コンテナ:コンテナは、イメージの実行可能なインスタンスです。 コンテナは通常、互いに分離されていますが、ボリュームとネットワークによってコンテナの相互作用が可能になります。
- レジストリ:レジストリは画像を保存します。 プライベートまたはパブリックにすることができ、オプションで認証が必要です。
- ボリューム:ボリュームは、1つ以上のコンテナーで使用できるようにすることができるファイルシステムです。 ボリュームは永続的または一時的である可能性があります(コンテナーがアクティブである間のみ持続します)。
- ネットワーク:ネットワークを使用すると、コンテナは標準のネットワークプロトコル(TCP / IP)を使用して通信できます。
Docker自体の基本的な概念を理解したので、直接関連する他の2つのテクノロジーを見てみましょう。
3. Dockerfile
Dockerfileは、Docker imagesをビルドするための手順を含むプレーンテキストファイルです。 それらが従うDockerfile標準があり、 Dockerデーモンは、Dockerfileの実行とイメージの生成を最終的に担当します。
通常のDockerfileは、通常、別の画像を含めることから始まります。 たとえば、特定のオペレーティングシステムまたはJavaディストリビューションに基づいて構築されている場合があります。
そこから、Dockerfileはさまざまな操作を実行してイメージを構築できます。
- ホストシステムからコンテナにファイルをコピーします。 たとえば、アプリケーションコードを含むJARファイルをコピーしたい場合があります。
- 画像に関連する任意のコマンドを実行します。 たとえば、一般的なUnixコマンドを実行して、ファイルのアクセス許可を変更したり、パッケージマネージャーを使用して新しいパッケージをインストールしたりできます。
- コンテナの作成時に実行するコマンドを定義します。 たとえば、JARファイルをロードして目的のmainメソッドを開始するjavaコマンド。
Dockerfileの例を見てみましょう。
FROM openjdk:17-alpine
ARG JAR_FILE=target/my-app.jar
COPY ${JAR_FILE} my-app.jar
ENTRYPOINT ["java","-jar","/my-app.jar"]
この例では、既存のOpenJDK17Alpineイメージに基づいてDockerイメージを作成します。 次に、コンパイルされたJARファイルをイメージにコピーし、起動コマンドを、コンパイルされたJARファイルとともに-jarオプションを指定したjavaコマンドとして定義します。
DockerfileはDockerイメージを作成する1つの方法にすぎないことに注意してください。 Buildpacks などの他のツールは、Dockerfilesを使用せずにコードをDockerイメージにコンパイルするプロセスを自動化するのに役立ちます。
4. DockerCompose
Docker Composeは、マルチコンテナーDockerアプリケーションを定義および実行するためのツールです。 YAML構成ファイルを使用すると、 Docker Compose を使用して、複数のコンテナーを1か所で構成できます。 その後、1つのコマンドを使用して、これらすべてのコンテナーを一度に開始および停止できます。
さらに、 Docker Composeを使用すると、containersによって共有される共通オブジェクトを定義できます。 たとえば、ボリュームを一度定義してすべてのコンテナ内にマウントし、それらが共通のファイルシステムを共有するようにすることができます。 または、1つ以上のコンテナが通信に使用するネットワークを定義できます。
簡単なDockerComposeファイルを書いてみましょう。
version: "3.9"
services:
database:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
web:
image: my-application:latest
ports:
- "80:5000"
volumes:
db_data: {}
これにより、MySQLデータベースサーバーとWebアプリケーションの2つのコンテナが起動します。 これは、データベースコンテナによって使用される1つのボリュームを定義します。 さらに、ネットワークトラフィックがコンテナに到達できるように、コンテナごとに公開するポートを定義します。
DockerfilesとDockerComposeは相互に排他的ではありません。 実際、それらは非常にうまく連携します。 Docker Composeは、コンテナーを開始する前にDockerfileをビルドするために使用できるbuildディレクティブを提供します。
最後に、 Docker Composeは、複数のコンテナーを調整するための1つのツールにすぎないことに注意してください。 その他のオプションには、Kubernetes、Openshift、およびApacheMesosが含まれます。
5. 結論
この記事では、Docker、Dockerfile、DockerComposeの違いについて説明しました。 これらのテクノロジーはすべて関連していますが、それぞれがより大きなテクノロジーエコシステムの別個の部分を参照しています。
これらの各要素とそれらが果たす役割を理解することで、クラウドコンピューティングプラットフォームで作業する際に、より多くの情報に基づいた意思決定を行うことができます。