web-dev-qa-db-ja.com

docker-composeを使用してdockerコンテナーを相互にリンクするときにIPアドレスを処理する方法

Docker-composeを使用して、完全な開発スタックを構築しています。

アプリケーションが動作するにはmysqlサーバーが必要です。

Mysqlサーバーは、docker-composeによる外部コンテナーのセットアップです。

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

アプリケーションには独自のdocker-compose.ymlがあり、mysqlコンテナーを参照します。

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?

動的なので、docker-composeに渡すことはできません。

特定の変数が設定されているため、アプリケーションがmysql IPアドレスを認識していることを知っています。

application-container$ env|grep ADDR 
    MYSQL_PORT_3306_TCP_ADDR=172.17.0.241

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

変数を何らかの方法でDB_Hostにマッピングしたり、別の方法で設定したりできますか?

23
k0pernikus

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

つまり、links(推奨)またはdocker-compose.ymlを使用して、external_links内からDB_Hostを実際に設定できます。

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

Dockerコンテナーに接続するときは、mysqlコンテナーに接続できます。

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

同じdocker-composer.ymlからコンテナをリンクしても同様に機能します。

これも 文書化

別のサービスのコンテナにリンクします。サービス名とリンクエイリアスの両方(SERVICE:ALIAS)を指定するか、サービス名のみを指定します(エイリアスにも使用されます)。

links:
 - db
 - db:database
 - redis

エイリアスの名前を持つエントリは、このサービスのコンテナ内の/ etc/hostsに作成されます。例:

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

環境変数も作成されます-詳細については、 環境変数リファレンス を参照してください。

28
k0pernikus