@MikUrrey

Docker: почему локальный IP-адрес машины-хоста недоступен для соединений внутри кластера?

Всем доброго дня!
На хосте с Ubuntu 20 поднят кластер из нескольких контейнеров, объединенных между собой в одну сеть.
Кластер представляет собой стек разработки nginx + php-fpm + mysql + memcached + redis.
Адрес хоста в локальной сети - 192.168.1.104. До сего дня все контейнеры свободно "общались" между собой, используя этот IP, и вдруг этот адрес стал для них недоступен. Потребовалось во всех конфигах явно прописывать сетевые имена каждого контейнера. Понимаю, что так изначально было правильнее, но не понимаю - почему это произошло?
До кучи отвалился доступ и к самба-серверу 192.168.1.104 из локалки, но сам веб-кластер всё еще доступен с других машин в сети на 80-м порту. Может быть, это и не связано, но всё же. Прилагаю docker-compose для ясности.
docker-compose

version: '3'
services:
  #PHP
  php:
    build:
      context: ./image/php/${PHP_VERSION}/.
    image: openweb/php:${PHP_VERSION}
    container_name: os-php${PHP_VERSION}
    restart: unless-stopped
    tty: true
    environment:
      SERVICE_NAME: app
      SERVICE_TAGS: dev
    working_dir: /var/www
    volumes:
      - ./www:/var/www
      - ./config/php/php.ini:/usr/local/etc/php/php.ini
      - ./scripts:/bin/app
    networks:
      - openweb-network
  #Nginx Service
  webserver:
    image: nginx:alpine
    container_name: os-nginx
    restart: unless-stopped
    tty: true
    ports:
      - "${WWW_PORT}:80"
      - "${WWW_SECURITY_PORT}:443"
    volumes:
      - ./www:/var/www
      - ./config/nginx/:/etc/nginx/conf.d/
      - ./scripts:/bin/app
    networks:
      - openweb-network
  #MySQL Service
  mysql:
    image: mysql:5.7.24
    container_name: os-mysql5.7.24
    restart: unless-stopped
    tty: true
    ports:
      - "${MYSQL_PORT}:3306"
    volumes:
      - ./db/mysql:/var/lib/mysql
      - ./scripts:/bin/app
    environment:
      MYSQL_ROOT_PASSWORD: "${MYSQL_PASSWORD}"
      SERVICE_TAGS: dev
      SERVICE_NAME: mysql
    networks:
      - openweb-network
  #Redis Service
  redis:
    image: redis
    container_name: os-redis
    restart: unless-stopped
    tty: true
    ports:
      - "${REDIS_PORT}:6379"
    volumes:
      - ./db/redis:/var/lib/redis
      - ./scripts:/bin/app
    environment:
      - REDIS_REPLICATION_MODE=master
    networks:
      - openweb-network
  #Memcached
  memcached:
    image: memcached
    container_name: os-memcached
    restart: unless-stopped
    tty: true
    ports:
      - "${MEMCACHED_PORT}:11211"
    networks:
      - openweb-network
#Docker Networks
networks:
  openweb-network:
    driver: bridge
#Volumes
volumes:
  dbdata:
    driver: local


P. S. Критика по настройке кластера - вери вэлкам, потому как настраивал на основе готовой сборки и не уверен, что всё идеально (ночнее, уверен, что не идеально).
  • Вопрос задан
  • 2065 просмотров
Решения вопроса 1
@iddqda
network engineer, netdevops
вот тут почитайте как работает сеть в compose
https://docs.docker.com/compose/networking/
для вашего случая наверное стоит обратить внимание на два предложения
By default Compose sets up a single network for your app. Each container for a service joins the default network and is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name.


Instead of just using the default app network, you can specify your own networks with the top-level networks key. This lets you create more complex topologies and specify custom network drivers and options. You can also use it to connect services to externally-created networks which aren’t managed by Compose


короче, если Вы НЕ указываете networks в docker-compose, то compose использует default bridge и сам увязывает контейнеры по имени между собой.
Если указываете кастомный network (openweb-network в вашем случае) то с именами придется возиться самому

и эта ...
Адрес хоста в локальной сети - 192.168.1.104. До сего дня все контейнеры свободно "общались" между собой, используя этот IP

нет это не так работает. У контейнеров своя сеть openweb-network. Адрес можно посмотреть командой
docker network inspect openweb-network
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@MikUrrey Автор вопроса
К сожалению, модератор невнимательно прочел вопрос Как сделать так, чтобы в сети docker была «видна» сеть машины-хоста? и отметил его как дубликат этого вопроса.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы