2015-02-15 10 views
7

Ich habe folgendes Dockerfile für meinen Behälter:Docker Compose nicht bindet Ports

FROM  centos:centos7 

# Install software 
RUN   yum -y update && yum clean all 
RUN   yum install -y tar gzip wget && yum clean all 

# Install io.js 
RUN   mkdir /root/iojs 
RUN   wget https://iojs.org/dist/v1.1.0/iojs-v1.1.0-linux-x64.tar.gz 
RUN   tar -zxvf iojs-v1.1.0-linux-x64.tar.gz -C /root/iojs 
RUN   rm -f iojs-v1.1.0-linux-x64.tar.gz 

# add io.js to path 
RUN   echo "PATH=$PATH:/root/iojs/iojs-v1.1.0-linux-x64/bin" >> /root/.bashrc 

# go to /src 
WORKDIR  /src 

CMD   /bin/bash 

ich diesen Behälter bauen und das Bild mit docker run -i -t -p 8080:8080 -v /srv/source:/usr/src/app -w /usr/src/app --rm iojs-dev bash starten. Docker bindet den Port 8080 an den Host-Port 8080, so dass ich von meinem Client aus auf die iojs-Anwendung zugreifen kann. Alles funktioniert gut.

Jetzt möchte ich meine Container mit Docker-compose starten, mit dem folgenden Docker-compose.yml

webfrontend: 
    image: iojs-dev 
    links: 
     - db 
    command: bash -c "iojs test.js" 
    ports: 
     - "127.0.0.1:8080:8080" 
    volumes: 
     - /srv/source:/usr/src/app 
     - /logs:/logs 
db: 
    image: mariadb 
    environment: 
     MYSQL_ROOT_PASSWORD: 12345 

Wenn ich jetzt docker-compose run webfrontend bash laufen kann ich den Port 8080 auf meinem Host zugreifen. Kein Port wurde gebunden. Das Ergebnis docker ports ist leer und auch das Ergebnis docker inspect ist leer an den Port-Einstellungen:

"NetworkSettings": { 
    "Bridge": "docker0", 
    "Gateway": "172.17.42.1", 
    "IPAddress": "172.17.0.51", 
    "IPPrefixLen": 16, 
    "MacAddress": "02:42:ac:11:00:33", 
    "PortMapping": null, 
    "Ports": { 
     "8080/tcp": null 
    } 
}, 
"HostConfig": { 
    "Binds": [ 
     "/srv/source:/usr/src/app:rw", 
     "/logs:/logs:rw" 
    ], 
    "CapAdd": null, 
    "CapDrop": null, 
    "ContainerIDFile": "", 
    "Devices": null, 
    "Dns": null, 
    "DnsSearch": null, 
    "ExtraHosts": null, 
    "Links": [ 
     "/docker_db_1:/docker_webfrontend_run_34/db", 
     "/docker_db_1:/docker_webfrontend_run_34/db_1", 
     "/docker_db_1:/docker_webfrontend_run_34/docker_db_1" 
    ], 
    "LxcConf": null, 
    "NetworkMode": "bridge", 
    "PortBindings": null, 
    "Privileged": false, 
    "PublishAllPorts": false, 
    "RestartPolicy": { 
     "MaximumRetryCount": 0, 
     "Name": "" 
    }, 
    "SecurityOpt": null, 
    "VolumesFrom": [] 
}, 
+2

Die [neueste RC-Version von 1.1.0-rc2] (https://github.com/docker/fig/releases) (sie heißt jetzt docker-compose) unterstützt das Flag '--service-ports', das bindet die Ports während 'fig run'. – dnephin

+0

@dnephin Danke, ich wollte gerade mein benutzerdefiniertes Run-Skript aufgeben. Zu der Antwort hinzugefügt. –

Antwort

4

Das für fig run vorsätzliches Verhalten.

Führen Sie einen einmaligen Befehl für einen Dienst aus.

Einmalige Befehle werden in neuen Containern mit derselben Konfiguration wie ein normaler Container für diesen Service gestartet, so dass Volumes, Links usw. alle wie erwartet erstellt werden. Das einzige, was sich von einem normalen Container unterscheidet, ist, dass der Befehl mit dem angegebenen überschrieben wird und keine Ports erstellt werden, falls sie kollidieren.

source.

fig up ist wahrscheinlich der Befehl, nach dem Sie suchen, es wird alle Behälter basierend auf Ihrer fig.yml (neu) erstellen und starten Sie sie.

+0

Du hast recht und ich sollte besser RTFM ;-) Es klappt jetzt, danke. – rotespferd

6

Dies ist ein vorsätzliches Verhalten für docker-compose run, wie pro documentation:

Wenn run verwenden, gibt es zwei Unterschiede zu bringen normalerweise einen Behälter nach oben:

  1. ...

  2. Standardmäßig werden keine Ports erstellt, falls sie mit bereits geöffneten Ports kollidieren.

Eine Möglichkeit, dies zu überwinden, ist up statt run zu verwenden, die:

Baut, (Wieder-) schafft, beginnt, und legt sich für einen Dienst Containern.

Eine andere Möglichkeit, wenn Sie Version 1.1.0 oder neuer verwenden sind, dann ist die --service-ports Option weitergeben müssen:

Run-Befehl mit dem und an den Host abgebildet aktivierten Ports Dienst.

P.S. Versucht, die ursprüngliche Antwort zu bearbeiten, wurde zweimal abgelehnt. Bleib edel, SO.