2015-10-08 11 views
20

Ich benutze docker-compose, um einen kompletten Entwicklungsstack zu erstellen.Wie werden IP-Adressen behandelt, wenn Docker-Container mithilfe von docker-compose miteinander verknüpft werden?

Die Anwendung benötigt einen MySQL-Server, um zu funktionieren.

Der MySQL-Server ist ein externer Container-Setup von 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 

Die Anwendung verfügt über eine eigene Docker-compose.yml und verweist auf den mysql Container:

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? 

Ich kann nicht passieren sie im Docker-komponieren, da es dynamisch ist.

Ich weiß, dass die Anwendung sich der MySQL-IP-Adresse ist, wie ich bestimmte Variablen gesetzt:

application-container$ env|grep ADDR 
    MYSQL_PORT_3306_TCP_ADDR=172.17.0.241 

Doch dies ist mein nicht DB_HOST erforderlich.

Kann ich die Variable irgendwie auf DB_HOST abbilden oder anders einstellen?

+1

Warum ist Ihr MySQL-Server in einer externen docker-composer.yml-Datei? Ist das wirklich erforderlich? Normalerweise, wenn Sie Container-Anwendungen haben, die zusammen ausgeführt werden müssen, müssen Sie die in nur einem Docker-Composer.yml konfigurieren. – nessuno

+0

@nessuno Ich möchte diesen mysql Container für mehrere Projekte verwenden. Ich brauche nicht 12 mysql Server herumfliegen.Außerdem ordne ich die mysql-Daten auf meine große Festplatte unter '/ data/mysql' ab, da die MySQL-Datenbank ziemlich massiv werden kann. Wenn Sie mehrere mysql-Instanzen haben, die demselben Ordner zugeordnet sind, führt dies zu Dateisystemsperrproblemen. – k0pernikus

+1

Sie können die mysql-Container-Konfiguration mit Ihrer Anwendung zusammenstellen, Sie müssen nur docker-compose mit dem '--no-recreate'-Flag ausführen, denke ich. Danach haben Sie nur einen MySQL Container hoch, und Sie können diesen Container direkt mit seinem Namen in der Datei docker-compose.yml referenzieren. Also make 'DB_HOST: mysql'. – nessuno

Antwort

24

Sie müssen die IP nicht festlegen, aber Sie können auf den virtuellen Hostnamen des Containers verweisen, und das ist derselbe Wert wie Sie Ihren verknüpften Container benannt haben.

Dies bedeutet, dass Sie in der Tat die DB_HOST aus dem docker-compose.yml gesetzt, entweder mit links (empfohlen) oder external_links:

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

Wie wenn Sie mit Ihrem Docker Behälter verbinden, Sie zu Ihrem MySQL-Container verbinden könnte:

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

Es funktioniert genauso, wenn Sie Container vom selben docker-composer.yml verknüpfen.

Dies ist auch documented:

Link zu Container in einen anderen Dienst. Geben Sie entweder den Namen des Service und den Link-Alias ​​(SERVICE: ALIAS) oder nur den Servicenamen an (der auch für den Alias ​​verwendet wird). die environment variable reference Details siehe -

172.17.2.186 db 
172.17.2.186 database 
172.17.2.187 redis 

Umgebungsvariablen erstellt auch:

links: 
- db 
- db:database 
- redis 

ein Eintrag mit dem Namen Alias ​​wird in/etc/hosts innerhalb Behälter für diesen Dienst, zB erstellt werden .

+2

Vorsicht, ab heute mit der Version 2 der docker-compose-Datei wird die Referenz der Umgebungsvariablen nicht mehr erstellt. siehe https://docs.docker.com/compose/link-env-deprecated/ –

+0

@MartinGOYOT Das stimmt. In der Version 2 sollten sich die Container aufgrund der geänderten Vernetzung jedoch sofort miteinander verbinden können. Ich überprüfe, ob ich ein Beispiel für Version 2 hinzufügen kann. Wenn Sie gerade dabei sind, es zu erstellen, können Sie auch eine neue Antwort für Version 2 posten. – k0pernikus

+0

Nun, Ihre Antwort funktioniert gut in Version 2. Ich sagte nur in Bezug auf die "Umgebungsvariablen werden ebenfalls erstellt - Weitere Informationen finden Sie in der Referenz zur Umgebungsvariablen. –

Verwandte Themen