2016-04-18 2 views
1

Ich habe einen (globalen) Container Mariadb und ein PHP-FPM-Container in einem Docker-Compose.yml laufen. Sie sind verknüpft, aber die IP und der Port des DB-Containers befinden sich nicht in den Umgebungsvariablen von php-fpm.Docker Container Link nicht in env oder/etc/hosts

begann ich den MariaDB Container wie folgt aus:

$ docker run --name db -e MYSQL_ROOT_PASSWORD=.... -dP mariadb 

sieht mein Docker-compose.yml wie folgt aus:

version: "2" 
services: 
    nginx: 
    build: 
     context: . 
     dockerfile: docker/nginx/Dockerfile 
    ports: 
     - 80 
    links: 
     - fpm 
    volumes_from: 
     - app 
    fpm: 
    build: 
     context: . 
     dockerfile: docker/fpm/Dockerfile 
    external_links: 
     - db 
    volumes_from: 
     - app 
    app: 
    build: 
     context: . 
     dockerfile: docker/app/Dockerfile 
    volumes: 
#  - /app 
     - .:/app:ro 

Mein fpm Dockerfile:

FROM php:fpm 

RUN docker-php-ext-install pdo pdo_mysql 

Umgebungsvariablen in phpinfo()

PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
HOSTNAME db14e2928ed6 
PHP_INI_DIR /usr/local/etc/php 
PHP_EXTRA_CONFIGURE_ARGS --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data 
GPG_KEYS 1A4E8B7277C42E53DBA9C7B9BCAA30EA9C0D5763 
PHP_VERSION 7.0.5 
PHP_FILENAME php-7.0.5.tar.xz 
PHP_SHA256 c41f1a03c24119c0dd9b741cdb67880486e64349fc33527767f6dc28d3803abb 
HOME /var/www 
USER www-data 

Edit:

Ich habe versucht, zu einem ubuntu Container verknüpfen sicher php-fpm nicht vermasseln zu machen. Es funktioniert wie ein temporärer Container, aber wie ich es als external_link in einem docker-compose.yaml schreibe, verschwindet es auch von env und/etc/hosts.

version: "2" 
services: 
    test: 
    image: ubuntu 
    external_links: 
     - db 
+0

Die Referenz lautet "Hinweis: Wenn Sie das Dateiformat der Version 2 verwenden, müssen die extern erstellten Container mit mindestens einem der gleichen Netzwerke wie der Dienst verbunden sein, der mit ihnen verknüpft ist." –

+0

Version 2 Compose-Dateien verwenden benutzerdefiniertes Netzwerk, das '/ etc/hosts' nicht mehr verwendet. Es gibt einen eingebetteten DNS-Server, der die Namensauflösung behandelt. – dnephin

+1

Wie kann ich mit dem eingebetteten DNS-Server auf db zugreifen? Ich kann 'db' nicht auflösen (' $ netcat db 3306' 'nc: getaddrinfo: Name oder Dienst nicht bekannt') – schokocappucino

Antwort

0

Die Lösung wurde ein neue Brücke Netzwerk, schließen Sie die externen Datenbank-Container zu diesem Netzwerk und fügen Sie den fpm Behälter mit dem gleichen Netzwerk zu erstellen.

$ docker network create -d bridge dbnetwork 
$ docker network connect dbnetwork db 

Und die Docker-compose.yml:

version: "2" 
services: 
    nginx: 
    build: 
     context: . 
     dockerfile: docker/nginx/Dockerfile 
    ports: 
     - 80 
    links: 
     - fpm 
    volumes_from: 
     - app 
    fpm: 
    build: 
     context: . 
     dockerfile: docker/fpm/Dockerfile 
    external_links: 
     - db 
    volumes_from: 
     - app 
    networks: 
     - default 
     - dbnetwork 
    app: 
    build: 
     context: . 
     dockerfile: docker/app/Dockerfile 
    volumes: 
     - .:/app:ro 
networks: 
    dbnetwork: 
    external: true 

default ist das Standard-Netzwerk alle anderen Behälter innerhalb der Docker-compose.yml verbunden sind. Ich musste es hinzufügen, sonst kann fpm nur mit der Datenbank sprechen. Auf den Datenbankcontainer kann als db oder db.dbnetwork zugegriffen werden.