2015-10-08 8 views
20

私は完全な開発スタックを構築するためにドッカ - コンを使用しています。docker-composeを使用してdockerコンテナを相互にリンクするときにIPアドレスを処理する方法は?

アプリケーションが動作するようにMySQLサーバを必要とします。

MySQLサーバは、ドッキングウィンドウ・コンによる外部コンテナの設定です:

mysql: 
    image: mysql:5.6 
    volumes: 
     - /data/mysql:/var/lib/mysql 
     - ./docker/mysql.d:/etc/mysql/conf.d 
    ports: 
     - "3306:3306" 
    environment: 
     MYSQL_ROOT_PASSWORD: password 

アプリケーションは、MySQLコンテナ独自のドッキングウィンドウ-compose.ymlと参照を持っている:

my-application: 
    build: . # the Dockerfile resides in the current folder 
    ports: 
     - "9180:80" 
     - "9543:443" 
    external_links: 
     - mysql_mysql_1:mysql 
environment: 
    DOCKER_ENVIRONMENT: dev 
    DB_NAME: local_db 
    DB_PASS: password 
    DB_USER: root 
    DB_HOST: # how to set the mysql's IP address? 

私は渡すことはできません彼らは動的であるので、ドッカーでそれらを作成します。

私は特定の変数が設定されているように、アプリケーションは、MySQLのIPアドレスを認識していることを知っている:

application-container$ env|grep ADDR 
    MYSQL_PORT_3306_TCP_ADDR=172.17.0.241 

しかし、これは私の必要DB_HOSTではありません。

は私がDB_HOSTに何とか変数をマッピングするか、別々にそれを設定することはできますか?

+1

MySQLサーバが外部のドッキングウィンドウ-composer.ymlファイル上にあるのはなぜ?これは本当に必要ですか? あなたが一緒に実行する必要があるコンテナアプリケーションがある場合は通常、あなたが唯一のドッキングウィンドウ-composer.ymlに設定する必要があります。 – nessuno

+0

@nessuno複数のプロジェクトにmysqlコンテナを使用したいと思います。私は12のmysqlサーバを飛ばす必要はありません。さらに、私はmysqlデータを '/ data/mysql'にある大きなHDDにマップしています。これはmysqlデータベースが非常に大量になる可能性があるためです。複数のmysqlインスタンスが同じフォルダにマップされていると、ファイルシステムのロックの問題が発生します。 – k0pernikus

+1

あなたのアプリケーションと共にmysqlコンテナの設定を行うことができます。ちょうど '--no-recreate'フラグをつけてdocker-composeを実行すればよいと思います。 その後、mysqlコンテナは1つしかありません。その名前を使用してdocker-compose.ymlファイルでそのコンテナを直接参照することができます。したがって、 'DB_HOST:mysql'を作成してください。 – nessuno

答えて

24

IPを設定する必要はありませんが、コンテナの仮想ホスト名を参照できます。これはリンクされたコンテナの名前と同じ値です。

これは、あなたが実際にどちらかlinks(推奨)またはexternal_linksで、docker-compose.yml内からDB_HOSTを設定することができることを意味:

your_application: 
    build: . 
    ports: 
     - "9180:80" 
     - "9543:443" 
    external_links: 
     - mysql_mysql_1:docker-mysql 
    environment: 
     DB_HOST: docker-mysql 

あなたのドッキングウィンドウのコンテナに接続するときのように、あなたはMySQLのコンテナに接続できます。

application-container $ mysql -h docker-mysql -uroot -ppassword -p 3360 

同じdocker-composer.ymlのコンテナをリンクする場合も同じです。

これもdocumentedです:別のサービス内のコンテナに

リンク。 、または(別名のために使用されます)だけでサービス名 :サービス 名とリンクエイリアス(ALIAS SERVICE)の両方を指定してください。

links: 
- db 
- db:database 
- redis 

別名名前のエントリは例えば、このサービスの コンテナ内の/ etc/hostsに作成されます。

172.17.2.186 db 
172.17.2.186 database 
172.17.2.187 redis 

環境変数も作成されます - 詳細についてはenvironment variable referenceを見ます。

+2

docker-composeファイルの現在のバージョン2では、環境変数リファレンスはもう作成されません。 https://docs.docker.com/compose/link-env-deprecated/ –

+0

@MartinGOYOTを参照してください。そうです。バージョン2では、変更されたネットワーキングのために、コンテナはボックスの外にお互いに接続できる必要があります。バージョン2の例を追加できるかどうかを確認します。今すぐ作成している場合は、バージョン2の新しい回答を投稿することもできます。 – k0pernikus

+0

答えはバージョン2でうまくいきます。私は についてのみこれを言っていました。「環境変数も作成されます詳細については、環境変数リファレンスを参照してください。 –

関連する問題