Селен не может получить доступ к веб-сайту, размещенному в другом контейнере Docker

#docker #selenium #docker-compose

Вопрос:

Любой докер, эксперт по Селену, я был бы признателен вам за помощь!

У меня есть веб-приложение(LNMP), и я использую docker в своей локальной среде разработки в качестве разработчика.

Теперь я пытаюсь добавить дополнительный контейнер Selenium, чтобы использовать его для автоматического тестирования (https://hub.docker.com/r/selenium/standalone-chrome-debug).

Я не мог понять, как настроить соединение из контейнера Selenium с контейнером моего приложения(Nginx), потому что веб-сайт не опубликован.

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

напр.

 127.0.0.1 website.test
 

Я попытался добавить контейнер Selenium в файл yaml, похоже, это было успешно, и я могу использовать клиент VNC с хоста для подключения к контейнеру.

Но мне всегда отказывали в подключении, когда я пытался получить доступ к веб-сайту из браузера Selenium. Похоже, DNS работает, иначе Chrome выдал бы мне ошибку DNS, а не отказ в подключении.

Мой файл yaml выглядит так, как вы можете видеть, я добавил контейнер Selenium(browser_chrome) и сеть(тестирование). приложение является оригинальным контейнером Nginx.

 networks:
  testing:

  
version: "3"
services:
  browser_chrome:
      image: selenium/standalone-chrome-debug:3.8.1
      ports:
        - "5900:5900"
      networks:
        - testing
  app:
      networks:
        testing:
          aliases:
            - "website.test"

 

Это исходный файл docker без установки Selenium, https://github.com/markshust/docker-magento/blob/master/compose/docker-compose.yml, в основном, я добавил контейнер Selenium(browser_chrome) и сеть(тестирование) для их подключения.

Я знаю только основные вещи докера, поэтому буду признателен за любую помощь!

🙂

Ответ №1:

Прежде всего, вам не нужно создавать статическую сеть для работы с этим и оставлять docker, чтобы он соответствовал ей сам = меньше проблем в будущем (по крайней мере, таково мое мнение). Не указывая сеть docker в файле compose, вы оставляете docker для создания сети с именем default (точка зрения контейнера), с точки зрения хоста называемой <stack-name>_default

Второе, что вам нужно понять, — это как работает сеть и соединение между двумя контейнерами в стеке — > Здесь для соединения между контейнерами вы должны использовать имена служб (в вашем случае> app ), так как docker автоматически создает для него записи DNS

Вот простой файл для создания, чтобы проверить правильность вышеизложенного:

 version: "3"
services:
  server:
    image: containous/whoami
  client:
    image: appropriate/curl
    command: "curl -vvv http://server"
 

И вывод из журналов консоли и служб

 $ docker stack deploy -c docker-compose.yml test
Creating network test_default
Creating service test_server
Creating service test_client

$ docker service logs -f test_client
test_client.1.fv8dq5b80dkk@...    | * Rebuilt URL to: http://server/
test_client.1.fv8dq5b80dkk@...    |   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
test_client.1.fv8dq5b80dkk@...    |                                  Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 10.0.5.2...
test_client.1.fv8dq5b80dkk@...    | * TCP_NODELAY set
test_client.1.fv8dq5b80dkk@...    | * Connected to server (10.0.5.2) port 80 (#0)
test_client.1.fv8dq5b80dkk@...    | > GET / HTTP/1.1
test_client.1.fv8dq5b80dkk@...    | > Host: server
test_client.1.fv8dq5b80dkk@...    | > User-Agent: curl/7.59.0
test_client.1.fv8dq5b80dkk@...    | > Accept: */*
test_client.1.fv8dq5b80dkk@...    | > 
test_client.1.fv8dq5b80dkk@...    | < HTTP/1.1 200 OK
test_client.1.fv8dq5b80dkk@...    | < Date: Tue, 01 Jun 2021 09:54:21 GMT
test_client.1.fv8dq5b80dkk@...    | < Content-Length: 162
test_client.1.fv8dq5b80dkk@...    | < Content-Type: text/plain; charset=utf-8
test_client.1.fv8dq5b80dkk@...    | < 
test_client.1.fv8dq5b80dkk@...    | { [162 bytes data]
test_client.1.fv8dq5b80dkk@...    | Hostname: 7d91b392ac0a
test_client.1.fv8dq5b80dkk@...    | IP: 127.0.0.1
test_client.1.fv8dq5b80dkk@...    | IP: 10.0.5.3
test_client.1.fv8dq5b80dkk@...    | IP: 172.18.0.4
test_client.1.fv8dq5b80dkk@...    | RemoteAddr: 10.0.5.4:45600
test_client.1.fv8dq5b80dkk@...    | GET / HTTP/1.1
test_client.1.fv8dq5b80dkk@...    | Host: server
test_client.1.fv8dq5b80dkk@...    | User-Agent: curl/7.59.0
test_client.1.fv8dq5b80dkk@...    | Accept: */*
test_client.1.fv8dq5b80dkk@...    | 
100   162  100   162    0     0  23142      0 --:--:-- --:--:-- --:--:-- 27000
test_client.1.fv8dq5b80dkk@...    | * Connection #0 to host server left intact
 

Комментарии:

1. Спасибо за ваш ответ, я смог использовать app:8443 для подключения к приложению Nginx, но я был перенаправлен на website.test в браузере и получил ошибку DNS, в которой говорилось, что домен не может быть разрешен. если мне нужно использовать домен для тестирования, как я могу настроить DNS?

2. давай, приятель … настройка nginx выходит за рамки вашего вопроса. Еще дальше-настройка DNS-сервера. Прежде всего, вы должны овладеть базовыми функциями сети и докера. Не начинайте с конца. На данный момент используйте IP:ПОРТ для проверки функциональности

3. Мой вопрос в том, должен ли я использовать домен для доступа к веб-сайту, как я могу настроить DNS между контейнером Selenium и Nginx. Я попытался использовать имя контейнера, основываясь на вашем комментарии, это позволило мне подключиться к контейнеру Nginx.