Почему порты Docker в Ubuntu не доступны извне?

Я успешно запускаю контейнеры Docker с помощью docker-compose. После запуска контейнеров команда `docker-compose ps` отображает следующее состояние: 

<pre><code>db_1       docker-entrypoint.sh postgres    Up (healthy)   0.0.0.0:2054-&gt;5432/tcp,:::2054-&gt;5432/tcp
db_2     docker-entrypoint.sh postgres    Up (healthy)   0.0.0.0:2154-&gt;5432/tcp,:::2154-&gt;5432/tcp
nginx_1        /docker-entrypoint.sh ngin ...   Up             0.0.0.0:443-&gt;443/tcp,:::443-&gt;443/tcp, 0.0.0.0:2081-&gt;80/tcp,:::2081-&gt;80/tcp, 0.0.0.0:2181-&gt;8080/tcp,:::2181-&gt;8080/tcp
php_1          docker-php-entrypoint php-fpm    Up             0.0.0.0:9903-&gt;9000/tcp,:::9903-&gt;9000/tcp
supervisor_1   docker-php-entrypoint /usr ...   Up             0.0.0.0:2347-&gt;2346/tcp,:::2347-&gt;2346/tcp, 9000/tcp</code></pre> 

Кроме того, я выполнил команду `sudo iptables -L`, которая вернула следующий результат:

<pre><code>ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-USER (1 references)
target    
</code></pre>

На основе этой информации, как я могу определить, правильно ли настроены правила iptables для работы контейнеров Docker?
  • 17 ноября 2024 г. 14:33
Ответы на вопрос 2
Проблема с доступом к контейнерам Docker из внешней сети может быть вызвана несколькими факторами, даже если порты отображаются как проброшенные. Давайте рассмотрим некоторые возможные причины и шаги для диагностики.

### 1. Проверка сетевых настроек Docker

Docker создает собственные сетевые интерфейсы и применяет NAT (преобразование сетевых адресов) для управления доступом к контейнерам. Чтобы проверить правильность настройки сети, выполните следующие шаги:

- Убедитесь, что Docker слушает на правильных интерфейсах. Вы можете проверить это с помощью команды:
  ```bash
  docker network ls
  ```
  Убедитесь, что ваши контейнеры находятся в одном и том же сетевом драйвере (например, `bridge`).

### 2. Проверка iptables

Судя по выводу вашей команды `iptables`, правила для `DOCKER` цепочки не указывают на явные ограничения, но важно предостеречь:

- `DOCKER-ISOLATION-STAGE-2` в вашем выводе имеет правило для `DROP`, что может блокировать трафик, если он не соответствует нашим правилам. Однако наличие правила `DOCKER` в вашем выводе означает, что Docker создает необходимые правила на уровне iptables.

Можно добавить полную прозрачность в права, добавив правила для разрешения доступа:

```bash
sudo iptables -A DOCKER-USER -j ACCEPT
```
или изменить существующие правила, чтобы убедиться, что трафик не блокируется.

### 3. Проверка доступа из внешней сети

Убедитесь, что вы действительно пробуете получить доступ к контейнерам с другого устройства в той же сети. Например:

```bash
curl http://<ваш_IP>:2081
```

Замените `<ваш_IP>` на IP-адрес вашей машины с Docker.

### 4. Проверка конфигурации сервиса

Убедитесь, что ваш сервис (например, Nginx) правильно сконфигурирован для обработки входящих соединений. Проверьте конфигурацию Nginx и убедитесь, что он настроен на прослушивание всех интерфейсов (`listen 0.0.0.0;`).

### 5. Файрвол системы

Если вы используете другие системы управления файрволом (например, `ufw` на Ubuntu), они могут блокировать порты. Убедитесь, что параметры `ufw` разобраны для портов, которые вы пробрасываете:

```bash
sudo ufw allow 2054/tcp
sudo ufw allow 2154/tcp
sudo ufw allow 443/tcp
sudo ufw allow 2081/tcp
sudo ufw allow 2181/tcp
sudo ufw allow 9903/tcp
sudo ufw allow 2347/tcp
```

### 6. Логи и отладка

Следите за логами ваших контейнеров и Docker:

```bash
docker logs <имя_контейнера>
```
Просмотрите lгзы на наличие ошибок.

### Заключение

Если вы выполнили все шаги и все еще испытываете проблемы, это может быть также связано с вашей сетевой конфигурацией или внешним маршрутизатором/файрволом, который блокирует пакеты. Проверьте эти настройки и обратите внимание на любые дополнительные маршруты или ограничения, которые могут быть установлены в вашей сети.
Пример из моего compose - использую 2 сети для внутр и наружных подключений 

version: '3.8'

services:
  frontend:
    image: xxxxxxx/frontend:latest
    restart: unless-stopped
    pull_policy: always
    container_name: react-frontend      
    ports:
      - "80:8008" # Expose the frontend on port 80 of the host - for outside communication
    depends_on:
      - app      
    networks:
      - appnetwork  # Connect frontend to the internal appnetwork
    environment:
      - REACT_APP_API_SERVER=backender      ## http://app:8080
      - REMOTE_SERVER=http://app:8080

  app:
    image: 'ZZZZZ/backend:latest'
    restart: unless-stopped
    pull_policy: always
    container_name: app
    ports:
      - '8080' # accessible on appnetwork only
    depends_on:
      - postgres
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/postgres
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=fdsgdsfgdsfgdshfsdfjg
      - SPRING_JPA_HIBERNATE_DDL_AUTO=update
      - TOMCAT_PORT=8080
    networks:
      - appnetwork  # Use appnetwork for backend communications


если порт по прежнему не виден, установи себе на ufw и регулируй доступ к портам из него. Imho легче
Похожие вопросы