Docker-compose chrome-alpine для использования nginx

У меня есть эта конфигурация для создания докеров, в которую я хочу встроить хромированный безголовый браузер для запуска моих тестов e2e...

nginx настроен на обратный прокси-адрес URL-адреса, скажем, foo.bar куда-то... это прекрасно работает, если я использую свой хост-браузер, и я могу проверить его, открыв порты 444:443!

однако это не работает, когда я пытаюсь использовать chrome-alpine, Я перехожу к отладчику localhost:9222, выбираю экземпляр и набираю: http://foo.bar.

Как настроить alpine-chrome для использования контейнера nginx?

services:
  nginx:
    image: nginx:alpine
    command: [nginx-debug, "-g", "daemon off;"]
    volumes:
      - ../../config/nginx/nginx.config.d:/etc/nginx/conf.d/server.conf
      - ../../config/nginx/certs:/etc/nginx/certs
    ports:
      - "444:443"

  chrome:
    image: zenika/alpine-chrome:latest
    command: [chromium-browser, "--headless", "--disable-gpu", "--no-sandbox", "--remote-debugging-address=0.0.0.0", "--remote-debugging-port=9222"]
    ports:
      - "9222:9222"

Ожидал

  1. Перейдите к localhost:9222
  2. Откройте удаленный отладчик Chrome.
  3. введите адрес foo.bar
  4. иметь обратный прокси-сервер nginx foo.bar для (например) google.com

Вы хотите получить доступ к Chrome через nginx?

Mostafa Hussein 26.06.2019 08:55

Я хотел бы ввести foo.bar в отладчике Chrome, а затем разрешить его с помощью nginx

Hitmands 26.06.2019 09:04
foo.bar находится в /etc/hosts вашего хоста, когда вы делаете это нормально на хосте chrome?
atline 26.06.2019 09:11

да, точно... у меня он есть на моем /etc/hosts на моем компьютере, так что с хрома моего ноутбука он работает просто отлично... проблема возникает, когда я использую хром-альпийский

Hitmands 26.06.2019 09:12

я собирался сказать то же самое, что упоминал @atline, вам нужно добавить его внутрь /etc/hosts контейнера, используя ключевое слово docker-compose extra_hosts, это позволит контейнеру Chrome разрешать доменное имя указывает на IP-адрес контейнера

Mostafa Hussein 26.06.2019 09:13

хромированный контейнер? foo.bar:localhost? я пробовал но не получилось

Hitmands 26.06.2019 09:14

Я предполагаю, что ваш формат неверен.

atline 26.06.2019 09:16

да, я должен был ввести IP-адрес, но они назначаются динамически...

Hitmands 26.06.2019 09:16

вы пробовали как 127.0.0.1? /etc/hosts ожидает, что IP-адрес не будет разрешаться, что вы подразумеваете под динамически назначаемым?

Mostafa Hussein 26.06.2019 09:17

Я пробовал, не получилось... не могли бы вы привести пример?

Hitmands 26.06.2019 09:18

попробуйте этот: stackoverflow.com/a/30541426/2336650 , должно быть foobar: 127.0.0.1

Mostafa Hussein 26.06.2019 09:18

На что указывает foo.bar файл /etc/hosts на хостах?

atline 26.06.2019 09:24

только что попробовал, не работает... nginx не получает никаких запросов... Я добавил лишний хост в образ chrome и, проверив его, увидел, что 127.0.0.1 foo.bar я думаю, 127.0.0.1 вместо этого должен быть IP-адрес контейнера nginx ... и именно поэтому я сказал, что он динамический

Hitmands 26.06.2019 09:25

Не могли бы вы попробовать обновленный ответ, добавить container_name, а также добавить дополнительные хосты, foo.bar указывает на имя контейнера?

atline 26.06.2019 09:28
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
Как создать PHP Image с нуля
Как создать PHP Image с нуля
Сегодня мы создадим PHP Image from Scratch для того, чтобы легко развернуть базовые PHP-приложения. Пожалуйста, имейте в виду, что это разработка для...
1
14
1 361
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вам нужно использовать links под контейнером chrome и вызывать nginx через nginx:port :

links:
   - nginx

или вы можете использовать сетевой драйвер host для обоих контейнеров и вызывать друг друга через localhos:port

network: host

конфигурация сети должна быть под каждой службой, см. также это

Вы можете добавить больше деталей? (Особенно для опции network), так как links устарела

Hitmands 26.06.2019 09:13

Я не думаю, что смогу использовать сеть host, так как тогда мне нужно будет переопределить /etc/hosts на ci...

Hitmands 26.06.2019 09:17

Связывание между контейнерами не решит проблему, так как обычно foo.bar все равно не будет идентифицироваться сетью докеров, это работает, если контейнер с именем foo.bar находится внутри самой сети докеров.

Mostafa Hussein 26.06.2019 09:23

Жаль, что после проб я не нашел простого решения, я думаю, решение @Mostafa Hussein со статическим IP-адресом является самым простым для реализации этого требования.

Результатом моего исследования является псевдоним foo.bar как 127.0.0.1, и пусть socat перенаправляет 127.0.0.1 сетевой трафик на mynginx, здесь socat может использовать mynginx, который не может использоваться в extra_hosts:

Итак, мое решение следующее, уродливое, но на случай, если оно кому-нибудь понадобится позже:

version: '3'

services:
  nginx:
    image: nginx:alpine
    container_name: mynginx
    command: [nginx-debug, "-g", "daemon off;"]
    ports:
      - "444:443"

  chrome:
    image: zenika/alpine-chrome:latest
    container_name: mychrome
    command: [chromium-browser, "--headless", "--disable-gpu", "--no-sandbox", "--remote-debugging-address=0.0.0.0", "--remote-debugging-port=9222"]
    ports:
      - "9222:9222"
    extra_hosts:
      - "foo.bar:127.0.0.1"

  helper:
    image: ubuntu:16.04
    volumes:
      - /usr/bin/docker:/usr/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
    tty: true
    command: bash -c "docker exec -u root -it mychrome /bin/sh -c \"apk add socat && socat TCP4-LISTEN:80,reuseaddr,fork TCP4:mynginx:80\""
    depends_on:
      - chrome

И тест:

shubuntu1@shubuntu1:~/99$ docker exec -it mychrome wget -q -O - http://foo.bar
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href = "http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href = "http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

похоже, вам нужно передать действительные ips на add_hosts: Cannot create container for service chrome: invalid IP address in add-host: "nginxproxy"

Hitmands 26.06.2019 09:30

Если возможно, мы сначала сужаем проблему с помощью remove extra_hosts related, but set container_name=foo.bar, а в браузере просто вводим http://foo.bar, чтобы убедиться, что все в порядке, а затем пытаемся найти другое решение?

atline 26.06.2019 09:35

Кажется, интересный вопрос, я попытаюсь на месте смоделировать вашу ситуацию.

atline 26.06.2019 09:38

Жаль, что я не нашел простого решения, просто используйте socat для перенаправления трафика с 127.0.0.1 на mynginx мой результат. Я думаю, что решение @Mostafa Hussein для использования статического IP-адреса хорошее, также проголосуйте за него.

atline 27.06.2019 03:34
Ответ принят как подходящий

Я смог заставить его работать, определив статический IP-адрес для контейнера nginx, как показано ниже:

Note: The purpose of setting a static IP for nginx is to avoid any issue that could happen due to ip changes.

version: "2"
services:
  nginx:
    image: nginx:alpine
    command: [nginx-debug, "-g", "daemon off;"]
    ports:
      - 80:80
    networks:
      nginx-chrome-network:
        ipv4_address: 172.28.1.1

  chrome:
    image: zenika/alpine-chrome:latest
    command: [chromium-browser, "--headless", "--disable-gpu", "--no-sandbox", "--remote-debugging-address=0.0.0.0", "--remote-debugging-port=9222"]
    ports:
      - "9222:9222"
    networks:
      - nginx-chrome-network
    extra_hosts:
      foo.bar: 172.28.1.1


networks:
  nginx-chrome-network:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16

Затем, перейдя к localhost:9222 и открыв новую вкладку, затем набрав foo.bar, вы получите то же, что и на следующем снимке экрана:

Пожалуйста, @Hitmands, из-за проблем с ssl, это самоподписанный сертификат? так как он работает с веб-сайтом Google правильно, если вы используете самозаверяющий сертификат, вам нужно Security.setIgnoreCertificateErrors в DevTools

Mostafa Hussein 26.06.2019 12:36

да, он самоподписанный, проблема решается запуском хрома с флагами "--ignore-certificate-errors", "--reduce-security-for-testing",

Hitmands 26.06.2019 12:37

Другие вопросы по теме