2016-07-03 3 views
1

В некоторых моих контейнерах работает веб-сервер (PHP, NodeJS).Докер-контейнер недоступен в главной машине

Если мы возьмем пример контейнера NodeJS, это его конфигурация

докер-compose.yml

version: '2' 
services: 
    webapp: 
    build: . 
    volumes_from: 
    - data 
    links: 
    - db:db 
    - redis:redis 
    ports: 
     - '8080:3000' 
    restart: always 

    ... 

С помощью этой конфигурации, я могу получить доступ к моей веб-приложение через http://example.com:8080/ но я не могу получить доступ на мой хост-машине с

$ curl localhost:8080 
(Time-out) 

у меня есть N ginx сервер на моем хосте с такой конфигурацией:

example.com.conf

upstream webapp { 
    server 127.0.0.1:8080; 
} 

server { 
    listen 80; 
    listen [::]:80; 

    server_name example.com; 

    location/{ 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header HOST $http_host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-NginX-Proxy true; 
    proxy_redirect off; 

    proxy_pass http://webapp; 
    } 

} 

Но присоединения к http://example.com/ бросить 504 Шлюз тайм-аут.

Если я пытаюсь изменить конфигурацию порта в моем docker-compose.yml по '127.0.0.1:8080:3000' проблемы все еще здесь, но не может получить доступ к http://example.comhttp://example.com:8080, но это результат я хочу).

Это очень странно, и у меня нет проблем с запуском моего приложения на новом сервере. Я ищу корень этой проблемы.

Спасибо за вашу поддержку.

EDIT:

$ netstat -tunlp 
Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address  State  PID/Program name 
tcp  0  0 127.0.0.11:59712  0.0.0.0:*    LISTEN  -    
udp  0  0 127.0.0.11:33293  0.0.0.0:*       -    

Web-сервер должен быть прослушивает порт 3000, но у меня есть

$ docker-compose logs 
webapp_1 | Express server listening on port 3000 in production mode 

Сервер также работает ...

$ docker port webapp_1 
3000/tcp -> 127.0.0.1:8080 
+1

не должен быть «завиток» http: //example.com: 8080/'? – stacksonstacks

+0

Вы используете докерную машину? –

+0

@stacksonstacks: Я хочу, чтобы мой контейнер был доступен только локально и перенаправлялся в общедоступном домене с помощью Nginx. –

ответ

0

Edit: Это должен работать аналогично тому, как у вас есть, вы пытались изменить: proxy_set_header HOST $http_host; до proxy_set_header HOST $host; в вашей конфигурации nginx?

Вы можете поместить nginx в файл Docker Compose и позволить Compose использовать свою собственную сеть. Если вы хотите добавить элементы в другую сеть, вы можете указать настраиваемую сеть, см.: https://docs.docker.com/compose/networking/

В противном случае вы можете посмотреть выходные данные ifconfig и т. Д. На вашем хосте и посмотреть, какие IP и сетевые ресурсы используются и что хост слушает.

+0

Не знаю, хорошо ли это сделать, я предпочитаю изолировать каждый из моих контейнеров и запускать их в локальном режиме и разрешать внешний трафик, проксимируя Nginx на хосте. –

+0

Я отредактировал свой ответ, чтобы более конкретно рассмотреть вашу проблему nginx, в зависимости от вашей настройки, которая может быть преступником. Обсуждение Docker очень много, но, безусловно, лучшей практикой было бы держать все в Docker, чтобы сделать его более портативным, но он очень специфичен для решения. Я использую оба метода на самом деле, я просто не использую компоновку при их смешивании, но нет причин, по которым вы не сможете этого сделать. – ldg

+0

Я уже пытался изменить эту конфигурацию, но я не думаю, что это проблема конфигурации Nginx. –

Смежные вопросы