2016-10-29 8 views
6

Dockerfiledocker-compose.ymlのファイルの関係は何ですか?私はFROMRUNapt-getなどとCMDコマンドを使用してDockerfileを使用して、任意のLinuxのセットアップを構築することができるようにDockerfileとdocker-compose.yml

が見える。しかし、それはそうです、これは非常に再利用可能な(私は全体の画像を再利用することができませんが、サービスはhardcdodedとされていません。?他のプロジェクトによって、再利用可能)

私は新しいプロジェクト上のファイルの両方を使用しなければならない

はのは、私は定期的なLAMPスタックを持つようにしたいとしましょう:

  • LinuxのO S(debian:wheezy
  • Apache Webサーバ(httpd:2.2
  • PHP(php:5.6)1、通常のマシン上で実行されているとして一緒に

のMySQL(mariadb

  • そして、私のホストシステム上のディレクトリ内:アプリのソースファイルの

    • ボリューム
    • のバーチャルホストの設定ファイル
    • ApacheのログDB
    • 永続データ

    私は好みますあらかじめ設定されたオールインワンではなく、公式のベースレポと画像を使用しています。

    この場合、設定ファイルはどのように見えますか?

    私はdocker-compose v.1.8.1とdocker v。1.12.3をUbuntuで使用しています。

  • 答えて

    7

    ドッカーは、分離されたマシン(コンテナ)を作成します。各コンテナには1つのプロセス(ApacheまたはMysqlなど)のみが含まれています。そして、Dockerfileはイメージを構築する方法を定義します。

    ドッカーの構成は、コンテナの束の を実行、リンク、構成することができます。

    あなたのケースでは、Apacheは「どこで」mysqlを知る必要があります。そして、あなたがApacheのコンテナを実行する前に、mysqlを起動する必要があります。

    Dockerfileは、アプリイメージの作成方法を定義します。アプリケーションイメージには、アプリケーションとWebブラウザが含まれています。

    FROM apache:php5.6 
    
    ADD /src /var/www/awesome_project #add a project src code 
    ADD /config/apache/awesome_project.conf /etc/apache2/sites-available/ # add a configuration 
    # make any things 
    

    次に、あなたは、あなたがこれを行うには、2つの方法がありますが、イメージを作成している、とあなたがアプリケーションを実行する必要があります。この時点で、画像docker build my_app:latest .

    を構築する必要があると

    をDBにリンク

    1)ネイティブドッカーのアプローチ。あなたは、DBコンテナ

    docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest

    、あなたは私たちがアプリケーションを働いているこの時点でアプリのコンテナ(イメージが前に作成された)

    docker run --name my_app --link some-mysql:mysql -P -d my_app

    を実行する必要が後を実行します。この単純なことは、私たちが2つの長いコマンドを作り出す原因となります。別のマシンにアプリケーションをコピーする必要がある場合は、このコマンドを正確に繰り返す必要があります。

    2)ドッカー作成方法では、コンテナを実行するための設定を作成できます。コンテナの正確な実行方法について説明しました。

    シンプルdocker-compose.yml設定この設定を使用すると、一緒に2コンテナを実行し、リンクし、それらを設定することができます。このアプローチ

    db: 
        image: mysql 
        environment: 
        - MYSQL_USER=root 
        - MYSQL_PASSWORD=root 
    
    app: 
        image: my_app:latest 
        ports: 
        - 80:80 
        depends_on: 
        - db 
        environment: 
        # Database 
        - DB_USER_NAME=root 
        - DB_USER_PASSWORD=root 
    

    を説明します。

    これは非常に簡単な例です。ドッカーを使用することの賛否両論は明らかではありませんが、5つ以上のコンテナがある場合は、作成せずに一緒に実行するのは難しいです。

    +0

    したがって、 'Dockerfile'は全く必要ありませんか?私の質問に記載されているスタック全体を 'docker-compose.yml'だけでどのように定義すればよいですか? DockerfileはDocker設定の古い方法ですか、ディストリビューションのような低レベルの画像を作成するのに適した方法ですか? – Sfisioza

    +1

    Dockerfileが必要です。 Dockerfileは特定のドッカーイメージを(低レベルで)作成する方法を定義します。 Docker composeは、コンテナを(画像から)一緒に実行、リンク、設定する方法を定義します –

    +0

    私の質問からのセットアップに関して、両方のファイルの完全な例を提供してください。 – Sfisioza

    6

    Dockerfile

    • 唯一のポータブルオプションは

    docker-compose.yaml(他のオプションは、コンテナの実行時に指定する必要があります)をサポートドッカーイメージのためのレシピです:

    • は、実行中のサービスグル​​ープのレシピです
    • は非ポータブルオプション
    • 支援を作成し、ネットワークとボリュームの設定をサポートしていDockerfile
    • で定義されたオーバーライドポータブルオプションをサポートしてい
    • build:

    を用いて画像のビルドを設定することができます両方を一緒に使用するのが一般的です。

    ほとんどの場合、カスタムイメージの作成にはDockerfileが使用されます。いくつかの画像はサービスを実行するために使用されることがあります(長時間実行中のプロセス)が、短期間のインタラクティブなプロセス(ユニットテストの実行など)を実行するために使用されるイメージもあります。

    docker-compose.yamlは、1つ以上のサービスを実行する場合に便利です。

    +0

    携帯用のオプションとは何ですか? – Sfisioza

    +1

    移植可能なオプションは、すべてのホストで同じように動作するオプションです。 'ENV'を使って環境変数を設定することを公開します。ポータブルではないオプションは、ホストバインドマウントのようなものです。ここで、ディレクトリはホスト上に存在しなければ動作しません。 – dnephin

    +0

    ありがとうございます。私は、特定のオプション(ポートマッピングとボリューム)を持つnginxコンテナなどを実行したい場合は、Dockerfile、docker-compose.ymlなどを使用して指定するかどうかを理解しようとしています。 bashスクリプト)。私がこの答えを正しく理解していれば、そのようなタスクのためにDockerfileを除外することができます。 –