Docker を読んで学び、使用するDjangoの設定を正しく選択しようとしています。これまでのところどちらかがあります:
Dockerfiles
がDocker Compose
で使用されていることは理解できますが、さまざまなイメージに対して複数のFROM
コマンドを使用して、すべてを1つの大きなDockerfileに入れるのが良い方法であるかどうかわかりませんか。
私はいくつかの異なる画像を使用したいと思います。
uwsgi
nginx
postgres
redis
rabbitmq
celery with cron
Docker を使用して、このタイプの環境を設定する際のベストプラクティスについて教えてください。
それが助けになるなら、私はMacを使っているので、 boot2docker を使います。
私が持っていたいくつかの問題:
答えはどちらでもありません。
プロジェクトのdocker-compose.yml
にbuildコマンドを追加すると、Docker Compose(以下、「作成」と呼びます)はDockerfileを使用します。
Dockerのワークフローでは、作成したいそれぞれの画像に適したDockerfile
を作成してから、build
コマンドを使用してcomposeを使用して画像を組み立てます。
build /path/to/dockerfiles/blah
を使用して個々のDockerファイルへのパスを指定できます。ここで、/path/to/dockerfiles/blah
はblahのDockerfile
が存在する場所です。
Dockerfileは、ユーザーが画像を組み立てるために呼び出すことができるコマンドを含む単純なテキストファイルです。
例、 Dockerfile
FROM ubuntu:latest
MAINTAINER john doe
RUN apt-get update
RUN apt-get install -y python python-pip wget
RUN pip install Flask
ADD hello.py /home/hello.py
WORKDIR /home
Docker Compose
マルチコンテナDockerアプリケーションを定義して実行するためのツールです。
アプリを構成するサービスをdocker-compose.yml
で定義して、それらを分離した環境で一緒に実行できるようにします。
docker-compose up
を実行するだけで、1つのコマンドでアプリを実行できます。
例: docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Composeファイルは実行状態のコンテナを記述し、コンテナを構築するの詳細はDockerfilesに残します。 http://deninet.com/blog/1587/docker-scratch-part-4-compose-and-volumes
開発中にアプリケーションComposeを使用を定義すると、この定義を使用してCI、ステージング、プロダクションなどのさまざまな環境を実行できます。 https://docs.docker.com/compose/production/
https://docs.docker.com/v1.11/compose/production/ ではなくなったため、Composeは1.11の時点で生産的に安全と見なされているようです。 https://docs.docker.com/v1.10/compose/production/ のように、本番環境で使用しないように警告があります。
私のワークフローでは、システムの各部分にDockerfileを追加し、各部分を個別に実行できるように構成しました。それから、それらをまとめてリンクするためにdocker-compose.ymlを追加します。
最大の利点(私の意見では): コンテナをリンクする 、あなたは名前を定義し、この名前であなたのコンテナにpingを実行することができます。そのため、データベースはdb
という名前でアクセス可能になり、そのIPからはアクセスできなくなります。
「より良い」は相対的です。それはすべてあなたのニーズが何であるかに依存します。 Docker composeは複数のコンテナーを編成するためのものです。これらのイメージがdockerレジストリに既に存在する場合は、作成ファイルにそれらをリストすることをお勧めします。これらのイメージまたは他のイメージをコンピューター上のファイルから作成する必要がある場合は、それらのイメージをDockerfileに作成するプロセスを説明できます。
DockerファイルがDocker Composeで使用されていることは理解できますが、さまざまなイメージに対して複数のFROMコマンドを使用してすべてを1つの大きなDockerファイルにまとめるのが良い方法であるかどうかわかりません。
この機能を削除するという提案があるので、単一のdockerfileで複数のFROMを使用することはあまりお勧めできません。 13026
たとえば、データベースを使用するアプリケーションをドッキングし、そのアプリケーションファイルをコンピュータに格納する場合は、次のように作成ファイルをdockerfileと共に使用できます。
mysql:
image: mysql:5.7
volumes:
- ./db-data:/var/lib/mysql
environment:
- "MYSQL_ROOT_PASSWORD=secret"
- "MYSQL_DATABASE=Homestead"
- "MYSQL_USER=Homestead"
ports:
- "3307:3306"
app:
build:
context: ./path/to/Dockerfile
dockerfile: Dockerfile
volumes:
- ./:/app
working_dir: /app
FROM php:7.1-fpm
RUN apt-get update && apt-get install -y libmcrypt-dev \
mysql-client libmagickwand-dev --no-install-recommends \
&& pecl install imagick \
&& docker-php-ext-enable imagick \
&& docker-php-ext-install pdo_mysql \
&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
docker-composeは、docker-cliを使用して大量のコマンドを記述しなければならないようにするためのものです。
docker-composeを使用すると、複数のコンテナーを同時に起動し、それらを何らかの形態のネットワーキングで自動的に接続することも容易になります。
Docker-composeの目的は、docker cliとして機能することですが、より迅速に複数のコマンドを発行することです。
Docker-composeを利用するには、以前実行していたコマンドをdocker-compose.yml
ファイルにエンコードする必要があります。
あなたはそれらをyamlファイルにコピーペーストするだけではなく、特別な構文があります。
作成したら、それをdocker-compose cliにフィードする必要があります。ファイルを解析して、指定した正しい構成ですべての異なるコンテナを作成するのはcli次第です。
それで、あなたは別々のコンテナを持つことになるでしょう。例えば、一つはredis-server
で、もう一つはnode-app
で、あなたの現在のディレクトリのDockerfile
を使って作成したいとしましょう。
さらに、そのコンテナーを作成したら、コンテナーからローカルマシンにポートをマッピングして、その内部で実行されているすべてのものにアクセスします。
それであなたのdocker-compose.yml
ファイルのためにあなたはそのように最初の行を始めたいでしょう:
version: '3'
それはあなたが使いたいdocker-compose
のバージョンをDockerに伝えます。その後、追加する必要があります。
version: '3'
services:
redis-server:
image: 'redis'
node-app:
build: .
非常に重要な、インデントに注意してください。また、あるサービスではイメージを取得していますが、別のサービスでは現在のディレクトリ内を調べて2番目のコンテナに使用されるイメージを作成するようにdocker-compose
に指示しています。
次に、このコンテナーで開きたいすべての異なるポートを指定します。
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"
最初のポートはあなたのローカルマシンで、もう一方のポートはコンテナのポートです。混乱を避けるために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アプリを使って作業していて、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
の前は、docker build .
とdocker run myimage
の2つの別々のコマンドを扱わなければなりませんでしたが、docker-compose
の世界ではイメージを再構築したい場合はdocker-compose up --build
と書きます。それはDockerにコンテナを再起動するように伝えますが、最新の変更を得るためにそれを再構築するようにします。
それでdocker-compose
は複数のコンテナを扱うのをより簡単にします。次回このグループのコンテナをバックグラウンドで起動する必要があるときにはdocker-compose up -d
を実行し、それらを停止するにはdocker-compose down
を実行することができます。
あなたがソフトウェア会社のマネージャーであり、真新しいサーバーを購入したと想像してください。ハードウェアだけ。
Dockerfile
は、システム管理者に指示する一連の指示と考えてくださいインストールするものこの新しいサーバーに。例えば:
/var/www
)対照的に、docker-compose.yml
は、システム管理者に指示する一連の指示と考えてくださいサーバーがどのように相互作用できるか他の世界と。例えば、
(これは正確な説明ではありませんが、開始するには十分です。)
Dockerfilesは、例えば裸の骨Ubuntuから画像を構築するためのものです。1つの画像にmysql
と呼ばれるmySQL
を、mywordpress
と呼ばれる2番目の画像にmywordpress
を追加することができます。
Compose YAMLファイルは、これらの画像を取得してそれらをまとまりなく実行するためのものです。例えばdocker-compose.yml
ファイルにサービスコールdb
があるとします。
services:
db:
image: mySQL --- image that you built.
そして、そのようなworpressと呼ばれるサービス:
wordpress:
image: mywordpress
それからmywordpressコンテナの中であなたはあなたのmySQLコンテナに接続するためにdb
を使うことができます。あなたのdocker Hostがネットワークブリッジ(ネットワークオーバーレイ)を作成するので、この魔法は可能です。