Nginx внутри контейнера docker не может взаимодействовать с другими контейнерами (работает дженкинс)

Я пытаюсь настроить прокси-сервер nginx внутри docker, который будет прослушивать веб-трафик, а затем на основе виртуальных хостов перенаправлять трафик на разные экземпляры jenkins, также работающие внутри контейнеров docker. Чтобы организовать это, я использую docker-compose.

Мне удалось:

  • Запустите экземпляры jenkins и поговорите с ними напрямую
  • Запустите nginx и настройте его в качестве прокси-сервера для веб-сервера, работающего на другом хосте

Но когда я пытаюсь разрешить серверу nginx маршрутизировать трафик внутри docker, я не могу заставить его работать, просто получая ошибки шлюза с 502 пакетами и последующее отображение в журналах nginx:

[error] 6#6: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8081/", host: "localhost:8080"

Соответствующие части моего docker-compose.yml:

httpd:  build: httpd  ports:      - "8080:8080"  links:      - "server_jenkins"      - "clients_jenkins"  restart: alwaysserver_jenkins:  image: jenkins  ports:      - "8081:8080"  restart: alwaysclients_jenkins:  image: jenkins  ports:      - "8082:8080"  restart: always

Файл httpd/Dockerfile выглядит следующим образом:

FROM nginxRUN rm -rf /etc/nginxCOPY config /etc/nginx/

И соответствующие части nginx.conf выглядят следующим образом (проксирование только одного экземпляра jenkins):

http {    server {        listen       8080;        server_name server.build.example.com;        root /tmp;        location / {            proxy_pass   http://127.0.0.1:8081;        }    }    server {        listen       8080;        server_name clients.build.example.com;        root /tmp;        location / {            proxy_pass   http://127.0.0.1:8082;        }    }}

Я пробовал следующие варианты первого URL-адреса proxy_pass (и некоторые другие, которые я не помню):

При запуске с --x-networking я изменил инструкции link на container_name в docker-compose.yml

Варианты исполнения:

  • докер: 1.9.1, сборка a34a1d5
  • docker-compose: 1.5.2, сборка 7240ff3
  • ОС: Debian 8 (работает внутри Virtualbox)

Я удаляю свой предыдущий ответ, поскольку я отвечал на что-то совершенно другое.Я нашел твою проблему, это http://127.0.0.1 и порты, которые являются неправильными, 127.0.0.1 внутри conf nginx означает, что httpd сам контейнер в данном случае не является хостом.

Если вы переопределите это, чтобы server_jenkins и clients_jenkins а также суффикс 8080 порт для обоих из них, тогда это должно сработать.

server {    listen       8080;    server_name server.build.example.com;    root /tmp;    location / {        proxy_pass   http://server_jenkins:8080;    }}server {    listen       8080;    server_name clients.build.example.com;    root /tmp;    location / {        proxy_pass   http://clients_jenkins:8080;    }}

Кроме того, я заметил, что директива http вызывает ошибки, но, как вы упомянули, предоставленный вами файл может быть просто фрагментом.

Нашел проблему.Я был сбит с толку тем, как работает отображение портов.

Рабочая конфигурация:docker-compose.yml:

httpd:  build: httpd  ports:      - "8080:8080"  links:      - "server_jenkins"      - "clients_jenkins"  restart: alwaysserver_jenkins:  image: jenkins  restart: alwaysclients_jenkins:  image: jenkins  restart: always

nginx.conf:

http {    server {        listen       8080;        server_name server.build.example.com;        root /tmp;        location / {            proxy_pass   http://server_jenkins:8080;        }    }    server {        listen       8080;        server_name clients.build.example.com;        root /tmp;        location / {            proxy_pass   http://client_jenkins:8080;        }    }}

То есть. Нет необходимости в сопоставлении портов.

Пожалуйста, предоставьте четкие сообщения об ошибках. “[…] Я не могу заставить его работать. […]” вообще недостаточно.

Ну, я получаю 502-Плохой шлюз с сервера nginx, когда я перехожу на localhost: 8080