docker-composeは、docker-cliを使用して大量のコマンドを作成する必要があるために存在します。
docker-composeを使用すると、同時に複数のコンテナーを簡単に起動して、何らかの形のネットワークでそれらを自動的に接続することもできます。
docker-composeの目的は、docker cliとして機能することですが、複数のコマンドをより迅速に発行することです。
docker-composeを使用するには、以前実行していたコマンドをdocker-compose.yml
ファイルにエンコードする必要があります。
コピーしてyamlファイルに貼り付けるだけではなく、特別な構文があります。
作成したら、それをdocker-compose cliにフィードする必要があります。ファイルを解析し、指定した正しい構成ですべての異なるコンテナーを作成するのはcliです。
したがって、別々のコンテナが作成されます。たとえば、1つredis-server
目は2つ目で、現在のディレクトリのnode-app
を使用して作成したいとDockerfile
します。
さらに、そのコンテナーを作成した後、コンテナーからローカルマシンにポートをマッピングして、コンテナー内で実行されているすべてにアクセスします。
したがって、docker-compose.yml
ファイルの場合、最初の行を次のように開始する必要があります。
version: '3'
これによりdocker-compose
、使用するバージョンがDockerに通知されます。その後、追加する必要があります:
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
非常に重要なインデントに注意してください。また、1つのサービスではイメージを取得していますが、別のサービスでdocker-compose
は現在のディレクトリ内を調べて、2番目のコンテナーで使用するイメージを構築するように指示しています。
次に、このコンテナーで開くすべての異なるポートを指定します。
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
-
ダッシュに注意してください。yamlファイル内のダッシュは、配列を指定する方法です。この例では8081
、ローカルマシンを次の8081
ようにコンテナにマッピングしています。
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "8081:8081"
したがって、最初のポートはローカルマシンで、もう1つはコンテナのポートです。次のように混乱を避けるために2つを区別することもできます。
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
ports:
- "4001:8081"
このdocker-compose.yml
ようにファイルを開発することで、これらのコンテナは基本的に同じネットワーク上に作成され、自由に相互に通信して、好きなだけ情報を交換できます。
2つのコンテナーを使用しdocker-compose
て作成する場合、ポート宣言は必要ありません。
ここでの例では、Nodejsアプリで次のようなコード構成を行う必要があります。
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server'
});
上記の例を使用docker-compose.yml
して、プロジェクトに固有のファイルに加えて、実行する必要がある特定の構成が存在する可能性があることを認識させます。
ここで、Nodejsアプリとredisを使用していることに気付いた場合は、Nodejsが使用するデフォルトのポートを知っていることを確認したいので、これを追加します。
const express = require('express');
const redis = require('redis');
const app = express();
const client = redis.createClient({
host: 'redis-server',
port: 6379
});
したがって、DockerはNodeアプリがredis-server
その接続を探し、この実行中のコンテナーにリダイレクトすることを確認します。
いつも、これDockerfile
だけが含まれています:
FROM node:alpine
WORKDIR '/app'
COPY /package.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]
そのdocker run myimage
ため、ファイル内のすべてのコンテナまたはサービスのインスタンスを作成するために実行する必要がある前に、代わりに実行できdocker-compose up
ます。Dockerは現在の作業ディレクトリを検索して、docker-compose.yml
そこにファイル。
前にdocker-compose.yml
、我々は2つの別々のコマンドで対処しなければならなかったdocker build .
とdocker run myimage
、しかしでdocker-compose
世界あなたが書くあなたのイメージを再構築したい場合docker-compose up --build
。これにより、Dockerはコンテナを再起動し、再構築して最新の変更を取得するように指示します。
そのdocker-compose
ため、複数のコンテナでの作業が簡単になります。次回、このコンテナのグループをバックグラウンドで開始する必要がある場合は、実行docker-compose up -d
して停止することができますdocker-compose down
。