2014-12-27 25 views
6

Docker Port Yönlendirme. Ben django uygulamasını sunmak için uWSGI kullanıyorum ve arka planda çalışan bir kereviz işçisi var. Bu süreçler süpervizör tarafından başlatılmıştır. Ben yaşıyorumBir liman işçisi kap içinde benim Django uygulamayı çalıştırmak çalışıyorum

sorun ben onu görmeyi beklediğiniz bağlantı noktasında uygulamayı görmek için kuramıyorum olmasıdır. 8080 numaralı bağlantı noktasını açığa çıkarıyorum ve 807'de uwsgi işlemini çalıştırıyorum, ancak uygulamamı bir tarayıcıda $(boot2docker ip):8080 ip adresinde bulamıyorum. Google Chrome’un 'Bu web sayfası müsait değil'. (Mac kullanıyorum, bu yüzden boot2docker ip adresini almam gerekiyor). Kap açıkça çalışıyor ve uwsgi ve kereviz işlemlerinin de başarılı bir şekilde çalıştığını bildiriyor. Ben docker exec CONTAINER_ID curl localhost:8080 çalıştırdığınızda konteyner limanı 8080

üzerinde bağlantıları kabul gibi görünüyor yüzden docker exec CONTAINER_ID netstat -lpn |grep :8080 çalıştırdığınızda

ben tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 11/uwsgi

olsun ...

% Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 21 0 21 0  0 3150  0 --:--:-- --:--:-- --:--:-- 3500 

gibi bir yanıt almak

docker inspect CONTAINER_ID çalıştırdığımda, aşağıdakileri edinin:

[{ 
    "AppArmorProfile": "", 
    "Args": [ 
     "-c", 
     "/home/docker/code/supervisor-app.conf" 
    ], 
    "Config": { 
     "AttachStderr": true, 
     "AttachStdin": false, 
     "AttachStdout": true, 
     "Cmd": [ 
      "supervisord", 
      "-c", 
      "/home/docker/code/supervisor-app.conf" 
     ], 
     "CpuShares": 0, 
     "Cpuset": "", 
     "Domainname": "", 
     "Entrypoint": null, 
     "Env": [ 
      "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", 
      "env=staging" 
     ], 
     "ExposedPorts": { 
      "8080/tcp": {} 
     }, 
     "Hostname": "21443d8a16df", 
     "Image": "vitru", 
     "Memory": 0, 
     "MemorySwap": 0, 
     "NetworkDisabled": false, 
     "OnBuild": null, 
     "OpenStdin": false, 
     "PortSpecs": null, 
     "StdinOnce": false, 
     "Tty": false, 
     "User": "", 
     "Volumes": null, 
     "WorkingDir": "" 
    }, 
"Created": "2014-12-27T01:00:22.390065668Z", 
    "Driver": "aufs", 
    "ExecDriver": "native-0.2", 
    "HostConfig": { 
     "Binds": null, 
     "CapAdd": null, 
     "CapDrop": null, 
     "ContainerIDFile": "", 
     "Devices": [], 
     "Dns": null, 
     "DnsSearch": null, 
     "ExtraHosts": null, 
     "Links": null, 
     "LxcConf": [], 
     "NetworkMode": "bridge", 
     "PortBindings": {}, 
     "Privileged": false, 
     "PublishAllPorts": false, 
     "RestartPolicy": { 
      "MaximumRetryCount": 0, 
      "Name": "" 
     }, 
     "SecurityOpt": null, 
     "VolumesFrom": null 
    }, 
    "HostnamePath": "/mnt/sda1/var/lib/docker/containers/21443d8a16df8e2911ae66d5d31341728d76ae080e068a5bb1dd48863febb607/hostname", 
    "HostsPath": "/mnt/sda1/var/lib/docker/containers/21443d8a16df8e2911ae66d5d31341728d76ae080e068a5bb1dd48863febb607/hosts", 
    "Id": "21443d8a16df8e2911ae66d5d31341728d76ae080e068a5bb1dd48863febb607", 
    "Image": "de52fbada520519793e348b60b608f7db514eef7fd436df4542710184c1ecb7f", 
    "MountLabel": "", 
    "Name": "/suspicious_fermat", 
    "NetworkSettings": { 
     "Bridge": "docker0", 
     "Gateway": "172.17.42.1", 
     "IPAddress": "172.17.0.87", 
     "IPPrefixLen": 16, 
     "MacAddress": "02:42:ac:11:00:57", 
     "PortMapping": null, 
     "Ports": { 
      "8080/tcp": null 
     } 
    }, 
"Path": "supervisord", 
    "ProcessLabel": "", 
    "ResolvConfPath": "/mnt/sda1/var/lib/docker/containers/21443d8a16df8e2911ae66d5d31341728d76ae080e068a5bb1dd48863febb607/resolv.conf", 
    "State": { 
     "ExitCode": 0, 
     "FinishedAt": "0001-01-01T00:00:00Z", 
     "Paused": false, 
     "Pid": 16230, 
     "Restarting": false, 
     "Running": true, 
     "StartedAt": "2014-12-27T01:00:22.661588847Z" 
    }, 
    "Volumes": {}, 
    "VolumesRW": {} 
} 
] 
Docker olmayan korkunç akıcı birisi olarak

, bunun ne anlama geldiğini gerçekten emin değilim. Belki de sunucuma neden bağlanamadığım konusunda bir ipucu var mı?

İşte benim Dockerfile, bu yüzden orada pervasızca yanlış bir şey yapıyorum olmadığını görebilirsiniz.

FROM ubuntu:14.04 

# Get most recent apt-get 
RUN apt-get -y update 

# Install python and other tools 
RUN apt-get install -y tar git curl nano wget dialog net-tools build-essential 
RUN apt-get install -y python3 python3-dev python-distribute 
RUN apt-get install -y nginx supervisor 
# Get Python3 version of pip 
RUN apt-get -y install python3-setuptools 
RUN easy_install3 pip 

RUN pip install uwsgi 

RUN apt-get install -y python-software-properties 

# Install GEOS 
RUN apt-get -y install binutils libproj-dev gdal-bin 

# Install node.js 
RUN apt-get install -y nodejs npm 

# Install postgresql dependencies 
RUN apt-get update && \ 
    apt-get install -y postgresql libpq-dev && \ 
    rm -rf /var/lib/apt/lists 

# Install pylibmc dependencies 
RUN apt-get update 
RUN apt-get install -y libmemcached-dev zlib1g-dev libssl-dev 

ADD . /home/docker/code 

# Setup config files 
RUN ln -s /home/docker/code/supervisor-app.conf /etc/supervisor/conf.d/ 

# Create virtualenv and run pip install 

RUN pip install -r /home/docker/code/vitru/requirements.txt 

# Create directory for logs 
RUN mkdir -p /var/logs 

# Set environment as staging 
ENV env staging 

EXPOSE 8080 

# The supervisor conf file starts uwsgi on port 8080 and starts a celeryd worker 
CMD ["supervisord", "-c", "/home/docker/code/supervisor-app.conf"] 

cevap

5

bende sende sorun EXPOSE sadece ana sisteme ... konteynerler arasında bağlantı noktaları kullanılabilir hale getirir oluşuna bağlıyor. Burada docs bakınız:
https://docs.docker.com/reference/builder/#expose

Sen docker run komut için -p bayrak yoluyla port "yayımlamak" gerekir:
https://docs.docker.com/reference/run/#expose-incoming-ports

Şekil benzer ayrım expose arasında, sen bunu kullanıyormuş yoktur ve fig.yml dosyasındaki ports yönergeleri.

+0

Evet, haklıydın. Sorun, konteyneri çalıştırdığım şekilde oldu. Hala 8080 numaralı bağlantı noktasını açığa çıkarmam gerektiğine inanıyorum, ama yerel makineye iletmem gerekiyor. 'Liman işçisi çalıştırmak -çok --rm -p 8080: 8080 my_image' beni $ (boot2docker ip) bir tarayıcıda Başvurumu görüntülemesine izin verir: 8080 – rfj001

+0

evet, dokümanlar açıkça belli olmasa sen' dockerfile içinde 8080' MARUZ gerekiyorsa yanı, ben muhtemelen değil düşünüyorum ama bu cevap – Anentropic

+2

gelen http://stackoverflow.com/a/22150099/356729 itibaren kaldırdık kadar emin değilim: "Eğer -p, ama mARUZ yoksa, Docker yapar dolaylı bir EXPOSE: Bunun nedeni, bir portun halka açık olması durumunda, otomatik olarak diğer Docker konteynerlerine de açık olmasıdır, dolayısıyla -p EXPOSE'u içerir. – dukebody

İlgili konular