2015-02-15 17 views
7

Ho la seguente Dockerfile per il mio contenitore:Docker Compose non si lega porte

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 

costruisco questo contenitore e inizio l'immagine con docker run -i -t -p 8080:8080 -v /srv/source:/usr/src/app -w /usr/src/app --rm iojs-dev bash. Docker collega la porta 8080 alla porta host 8080, così posso accedere all'applicazione iojs dal mio client. Tutto funziona bene

Ora voglio iniziare la mia finestra mobile contenitore con-composizione, utilizzando la seguente finestra mobile-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 

Quando ora corro docker-compose run webfrontend bash non posso accedere alla porta 8080 sul mio ospite. Nessuna porta è stata vincolata. Il risultato di docker ports è vuota e anche il risultato di docker inspect è vuota le impostazioni della porta:

"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

La [ultima versione RC di 1.1.0-rc2] (https://github.com/docker/fig/releases) (è ora chiamata docker-compose) supporta il flag '--service-ports', che legherà le porte durante 'fig run'. – dnephin

+0

@dnephin Grazie, stavo per rinunciare al mio script 'run' personalizzato. Aggiunto alla risposta. –

risposta

4

Questo è un comportamento intenzionale per fig run.

Eseguire un comando singolo su un servizio.

I comandi one-off vengono avviati in nuovi contenitori con la stessa configurazione di un normale contenitore per quel servizio, quindi volumi, collegamenti, ecc. Verranno creati come previsto. L'unica cosa diversa da un normale contenitore è il comando che verrà sovrascritto con quello specificato e non verranno create porte nel caso in cui si scontrino.

source.

fig up è probabilmente il comando che stai cercando, (ri) creerà tutti i contenitori basati su fig.yml e li avvierà.

+0

Hai ragione e dovrei fare meglio RTFM ;-) Funziona ora, grazie. – rotespferd

6

Questo è un comportamento intenzionale per docker-compose run, secondo documentation:

Quando si utilizza run, ci sono due differenze da portare un contenitore normalmente:

  1. ...

  2. per impostazione predefinita non verranno create porte in caso di collisione con porte già aperte.

Un modo per superare questo è quello di utilizzare up invece run, quali:

Builds, (ri) crea, inizia, e attribuisce ai contenitori per un servizio.

Un altro modo, se si sta utilizzando la versione 1.1.0 o più recente, è quello di passare l'opzione --service-ports:

comando Esegui con le porte del servizio abilitati e mappati per l'host.

P.S. Ho provato a modificare la risposta originale, mi sono rifiutato, due volte. Stay classy, ​​SO.

Problemi correlati