Можно ли установить соединение с сокетом, находящимся в другом контейнере?

У меня есть Docker контейнер, который запускает сокет сервер на PHP и использует порт 80 внутри контейнера, а снаружи – порт 1614. Я использую следующую команду для создания сокет сервера: 

<pre><code class="php">stream_socket_server('0.0.0.0:80', $errno, $errstr);</code></pre>

Теперь я пытаюсь подключиться к этому сокету из другого контейнера с помощью следующей команды: 

<pre><code class="php">stream_socket_client('0.0.0.0:1614', $errno, $errstr);</code></pre>

Однако у меня не получается установить соединение. В чем может быть проблема? Возможно ли это сделать? Обратите внимание, что внешнего доступа к этому сокету нет, и оба контейнера находятся в одной сети.
  • 9 декабря 2024 г. 17:53
Ответы на вопрос 2
Да, вы можете установить соединение между контейнерами, если они находятся в одной сети Docker. Однако, проблема с вашим кодом может быть связана с тем, что вы используете `0.0.0.0` в качестве адреса для подключения, что не является корректным IP-адресом для подключения в этом контексте.

Вот несколько шагов для устранения проблемы:

1. **Использование имени контейнера или его IP-адреса**: Вместо `0.0.0.0`, вы должны использовать имя контейнера, который запускает сокет сервер, или его IP-адрес в локальной сети Docker. Например, если ваш контейнер называется `socket_server`, то вы должны использовать:
   ```php
   stream_socket_client('socket_server:80', $errno, $errstr);
   ```

2. **Проверка сети**: Убедитесь, что оба контейнера находятся в одной сети. Вы можете проверить это с помощью команды:
   ```bash
   docker network ls
   ```
   И затем, для проверки конкретной сети:
   ```bash
   docker network inspect <network_name>
   ```

3. **Проверка конфигурации сервера**: Убедитесь, что сервер действительно запущен и доступен. Вы можете выполнить команду для проверки состояния контейнера и его логов:
   ```bash
   docker logs <socket_server_container_name>
   ```

4. **Проверка портов**: Вы правильно установили сокет сервер на `0.0.0.0:80`, что позволяет принимать подключения на порту 80 внутри контейнера. Внешний порт 1614 не имеет значения внутри контейнера. Вам нужно подключаться к порту 80.

5. **Firewall и настройки безопасности**: Если у вас есть дополнительные настройки безопасности или firewall в вашей системе, убедитесь, что они не блокируют соединение.

В целом, вам нужно использовать имя контейнера или его локальный IP в сети Docker для подключения к сокет-серверу. Если ваши контейнеры находятся в одной сети и правильно настроены, то соединение должно установиться без проблем.
Между контейнерами в одной сети надо подключаться по внутреннему порту. И по имени контейнера, разумеется.
Похожие вопросы