1. 序章

Docker は、コンテナー化のための便利なツールです。 これは非常に便利なので、プロジェクトに複数のDockerfileが必要になる場合があります。 残念ながら、これは、すべてのDockerfileに「Dockerfile」という名前を付けるという単純な規則に反します。

このチュートリアルでは、それを回避し、クリーンなプロジェクト構造を維持する方法について説明します。

2. Dockerfile

Dockerfileは、Dockerイメージをアセンブルするために必要なすべての命令を含むファイルです。 Dockerは、追加のコマンドやパラメーターを必要とせずに、Dockerを使用してイメージを自動的に構築できます。 命名規則により、ファイルのパスを指定する必要はありません(バージョン1.8.0までは、実際には指定できませんでした)。

Dockerfileが配置されているディレクトリからDockerのbuildコマンドを呼び出すことができます。

$ docker build .

3. Dockerfile名の指定

バージョン1.8.0から、 Dockerfileの名前を変更し、「-f」パラメーターを使用してビルドコマンドに渡すことができます。 2つのDockerfileがあり、1つはバックエンドを構築するためのもので、もう1つはフロントエンドを構築するためのものであるとしましょう。

それらに適切な名前を付け、 build コマンドを2回呼び出すことができます。そのたびに、Dockerfileの1つの名前を渡します。

$ docker build -f Dockerfile.frontend .
...
$ docker build -f Dockerfile.backend .

このソリューションは正常に機能しますが、いくつかの不便な欠点があります。 1つ目は、ファイルごとにbuildコマンドを個別に呼び出す必要があることです。 これは2つのファイルにとっては恐ろしいことではありませんが、コンポーネントが多ければ、追加のビルドスクリプトがすぐに必要になる可能性があります。 2番目の欠点は、一部のIDEが規則から逸脱しているためにトラックから外れ、構文の強調表示の提供を停止する可能性があることです。

4. docker-composeを使用する

Dockerfileの名前を変更する代わりに、それらを別々のフォルダーに配置できます。次に、 docker-compose を使用して、すべてのファイルのビルドをトリガーできます。 次のようなディレクトリ構造があるとします。

docker-compose.yml
docker
├── frontend
│   └── Dockerfile
└── backend
    └── Dockerfile

docker-compose ファイルの最も基本的な使用法は、通常、リポジトリからのイメージを使用することを意味しますが、buildのディレクトリパスを提供することもできます。

version: '3'
services:
  frontend:
    build: ./docker/frontend
    ports:
     - "8081:8081"
  backend:
    build: ./docker/backend
    ports:
      - "8080:8080"

docker-compose を実行すると、Dockerfilesからイメージがビルドされます。

$ docker-compose up

さらに、1つの docker-compose ファイルに、イメージを作成するさまざまな方法でサービスを配置できます。 ソースからオンザフライで構築できるものもあれば、外部レジストリから提供できるものもあります。 たとえば、バックエンドイメージを構築したいが、データベースイメージをパブリックレジストリから取得したい場合があります。

services:
  backend:
    build: ./docker/backend
    ports:
      - "8080:8080"
  postgres:
    image: 'postgres:latest'

これで、 docker-compose はサービスを構築して実行するだけでなく、データベースも提供します。

5. 結論

このチュートリアルでは、1つのプロジェクトで複数のDockerfileを処理するための2つの異なる戦略を学びました。

1つ目は、さまざまなDockerfileの名前の変更に基づいており、問題に対する迅速で洗練されたソリューションを提供します。 2つ目は、 docker-compose に依存しており、構築プロセスを構造化および自動化するための追加オプションを提供します。