web-dev-qa-db-fra.com

Comment gérer les adresses IP lors de la liaison de conteneurs Docker entre eux à l'aide de Docker-compose?

J'utilise docker-compose pour construire une pile de développement complète.

L'application a besoin d'un serveur mysql pour fonctionner.

Le serveur mysql est une configuration de conteneur externe par 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

L'application a son propre docker-compose.yml et fait référence au conteneur 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?

Je ne peux pas les passer dans le docker-compose car il est dynamique.

Je sais que l'application connaît l'adresse IP mysql, car j'ai certaines variables définies:

application-container$ env|grep ADDR 
    MYSQL_PORT_3306_TCP_ADDR=172.17.0.241

Pourtant, ce n'est pas mon exigé DB_Host.

Puis-je mapper la variable en quelque sorte sur DB_Host ou le définir différemment?

23
k0pernikus

Vous n'avez pas besoin de définir l'IP, mais vous pouvez référencer le nom d'hôte virtuel du conteneur , et c'est la même valeur que vous avez nommée votre conteneur lié.

Cela signifie que vous pouvez en effet définir le DB_Host depuis le docker-compose.yml, avec links (recommandé) ou external_links:

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

Comme lorsque vous vous connectez à votre conteneur docker, vous pouvez vous connecter à votre conteneur mysql:

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

Cela fonctionne de la même façon lorsque vous liez le conteneur du même docker-composer.yml.

C'est aussi documenté :

Lien vers les conteneurs d'un autre service. Spécifiez à la fois le nom du service et l'alias de lien (SERVICE: ALIAS), ou simplement le nom du service (qui sera également utilisé pour l'alias).

links:
 - db
 - db:database
 - redis

Une entrée avec le nom de l'alias sera créée dans/etc/hosts à l'intérieur des conteneurs pour ce service, par exemple:

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

Des variables d'environnement seront également créées - voir référence de variable d'environnement pour plus de détails.

28
k0pernikus