Docker - сопоставление IP-адресов контейнера - PullRequest
0 голосов
/ 12 ноября 2018

В Docker у меня есть 3 контейнера, которые являются node, mysql и redis. Когда я запускаю sudo iptables -t nat -L -n, я вижу, что эти контейнеры работают на разных IP-адресах, как показано ниже

enter image description here

Однако порядок IP-адресов для служб и IP-адресов (на некоторых машинах это 172.23.0.x, на некоторых машинах это 172.21.0.x) может отличаться каждый раз, когда я делаю docker-compose up --build, поэтому, если я хочу, чтобы приложение работало Я должен настроить IP-адреса для каждой службы вручную. Можно ли каким-либо образом автоматически сопоставить фиксированный IP-адрес для каждой службы в файле docker-compose.yml? Благодарю. Вот мой docker-compose.yml файл:

version: "3"
services:
  universe:
    build: .
    working_dir: /usr/src
    volumes:
      - .:/usr/src
      - /usr/src/node_modules/
    ports:
      - "3000:3000"
      - "8000:8000"
    restart: always

  # Redis Alpine
  redis:
    image: redis:alpine
    ports:
    - "127.0.0.1:6379:6379"

  # MySQL 5.7
  mysql:
    build:
      context: ./docker/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database_name
      MYSQL_USER: database_user
      MYSQL_PASSWORD: database_password
    volumes:
    - /config/scripts:/docker-entrypoint-initdb.d
    restart: always
    ports:
    - "127.0.0.1:3306:3306"

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

В вашей настройке Docker Compose, как вы показали, для связи между контейнерами вы можете использовать имена сервисов (universe, redis, mysql) в качестве обычных имен хостов, и они будут разрешены на внутренний IP-адрес контейнера, каким бы он ни был.

Обратите внимание, что если вы используете опцию ports: для переназначения опубликованного порта, вам все равно нужно подключиться к внутреннему порту (тот, что справа от двоеточия). Например, вы бы подключились к mysql:3306, даже если вы указали другое сопоставление внешних портов или вообще не сопоставляли порты.

Это не работает вне пространства Docker; там вы подключаетесь к DNS-имени хоста или IP-адресу с опубликованным ports:, и факт Docker полностью скрыт от вас.

0 голосов
/ 12 ноября 2018

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

version: "3"
services:
  universe:
    build: .
    working_dir: /usr/src
    volumes:
      - .:/usr/src
      - /usr/src/node_modules/
    ports:
      - "3000:3000"
      - "8000:8000"
    restart: always
    networks:
      vpcbr:
        ipv4_address: 10.3.0.2

  # Redis Alpine
  redis:
    image: redis:alpine
    ports:
    - "6379:6379"
    networks:
      vpcbr:
        ipv4_address: 10.3.0.3

  # MySQL 5.7
  mysql:
    build:
      context: ./docker/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database_name
      MYSQL_USER: database_user
      MYSQL_PASSWORD: database_password
    volumes:
    - /config/scripts:/docker-entrypoint-initdb.d
    restart: always
    ports:
    - "3306:3306"
    networks:
      vpcbr:
        ipv4_address: 10.3.0.4

networks:
  vpcbr:
    driver: bridge
    ipam:
     config:
       - subnet: 10.3.0.0/16
         gateway: 10.3.0.1
...