Контейнеры Docker в определяемых пользователем мостовых сетях не могут обмениваться данными

Я использую докер на своей машине с Ubuntu 20.10. Я хотел бы использовать docker-compose для настройки нескольких контейнеров в определяемой пользователем сети мостов.

Моя текущая настройка для моего docker_compose.yml выглядит следующим образом:

version: "3.5"
services:
  webserver:
    image: httpd
    networks:
      default:
        ipv4_address: 172.16.0.2

networks:
  default:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.16.0.0/16
          gateway: 172.16.0.1
    driver_opts:
      com.docker.network.bridge.enable_icc: "true"
      com.docker.network.bridge.enable_ip_masquerade: "true"
      com.docker.network.bridge.host_binding_ipv4: "0.0.0.0"
      com.docker.network.bridge.name: "docker1"

Запуск docker-compose up работает нормально и создает сеть с контейнером, и если я попытаюсь взаимодействовать с контейнером с хоста:

wget 172.16.0.2

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

docker run --rm -it --net=test1_default alpine wget 172.16.0.2

Добавленный контейнер не может подключиться. Также стоит отметить, что ни один контейнер в сети не имеет доступа к Интернету.

Я вспомнил, что мог нормально взаимодействовать между контейнерами, которые были добавлены в сетевой мост по умолчанию, поэтому я создал модифицированный docker-compose.yml просто для проверки:

version: "3.5"
services:
  webserver:
    image: httpd
    network_mode: bridge

Ему был присвоен IP-адрес 172.17.0.2. Попытка той же команды, что и раньше, в этой сети:

docker run --rm -it --net=bridge alpine wget 172.17.0.2

отлично работает! Я также попытался пропинговать 8.8.8.8, и контейнеры, похоже, также нормально подключаются к Интернету.

Я не верю, что это проблема с docker-compose при создании мостовой сети, потому что я сталкиваюсь с той же проблемой, если создаю сеть docker вручную и пытаюсь добавить в нее контейнеры.

Любая помощь будет принята с благодарностью. Я также рад предоставить дополнительную информацию о конфигурации хост-системы.


person Bryce    schedule 24.11.2020    source источник
comment
Это кажется довольно сложной конфигурацией для базовой установки. Если вы полностью удалите оба блока networks:, сможете ли вы подключиться из другого контейнера, используя что-то вроде docker run --rm --net=test1_default alpine wget webserver, используя имя службы Compose в качестве имени хоста? Сеть в Compose немного подробнее описывает общую среду; в терминологии основной сети Docker Compose (v2/v3 docker-compose.yml) всегда использует определяемую пользователем сеть-мост, возможно, автоматически созданную сеть с именем default.   -  person David Maze    schedule 25.11.2020
comment
Да, я хотел, чтобы сеть была определена в файле docker-compose, чтобы я мог назначать контейнерам статические IP-адреса. Мне это не обязательно нужно для того, над чем я работаю, но, к сожалению, мостовая сеть, созданная автоматически с помощью docker-compose, имеет ту же проблему.   -  person Bryce    schedule 25.11.2020


Ответы (2)


Кажется тривиальным, но я смог решить проблему, удалив докер и переустановив его. Я предполагаю, что что-то пошло не так в моем недавнем обновлении с Ubuntu 18.04 до 20.10.

person Bryce    schedule 27.11.2020

Попробуйте официальную документацию: https://docs.docker.com/compose/compose-file/#network-configuration-reference и здесь https://docs.docker.com/compose/networking/, вы должны прочитать о тегах --link

person Lucas Costa    schedule 24.11.2020
comment
Пожалуйста, приведите несколько примеров и пояснений. Не только ссылки на официальные документы - person n0nvme; 25.11.2020