Докер, правильный способ создания сети для двух контейнеров

Что касается взаимодействия докеров.

Учитывая, что флаг --link устарел (так я читал), и предпочтительным способом является создание новых сетей, например:

docker network create my_network

А затем позвольте создать два контейнера с помощью --network my_network, то есть:

docker run --name container1 --network my_network -d iamsecret -p 1234:1234
docker run --name container2 --network my_network -d iamawebserver -p 80:80

Как я могу добиться:

  1. Укажите, какая подсеть и какие IP-адреса назначены статически сети и двум моим контейнерам (чтобы я мог ссылаться на них в коде). Например, скажем, я хочу, чтобы моя сеть использовала 172.16.23.0; container1 - это 172.16.23.2, а container2 - это 172.16.23.3.
  2. Разрешить container1 разговаривать только с container2 (как будто это был db)
  3. Разрешить container2 разговаривать с container1, но в то же время быть доступным для моего компьютера (как если бы это был веб-сервер).

Спасибо

Я помню, как год назад задавал нечто подобное ... Мне так и не ответили: docker - конфигурация сети для изоляции двух контейнеров

tgogos 11.04.2018 14:08
1
1
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Что ж, я нашел способ, но уверен, что есть более простой и элегантный способ. Кредиты переходят на http://www.dasblinkenlichten.com/docker-networking-101/

#start containers attached to bridge default network, both open at this point
docker run --name container1 --network bridge ...
docker run --name container2 --network bridge ...

# create new internal network with my ips
docker network create --internal --driver=bridge --subnet=172.16.23.0/24 --gateway=172.16.23.1 mynet

# disconnect secret host from public bridge
docker network disconnect bridge container1

# connect containers to secret network with my chosen ips
docker network connect --ip 172.16.23.2 mynet container1
docker network connect --ip 172.16.23.3 mynet container2

Пожалуйста, добавьте свой ответ, если вы считаете, что есть способ лучше или что-то выше не так! Спасибо

Может быть проще использовать docker-compose.

Вам нужен файл docker-compose.yml (см. Пример ниже), и он создаст сеть в соответствии с последним разделом, построит изображения в соответствии с первыми двумя разделами, сопоставляет порты контейнера с сетевыми портами, а затем присоединяет контейнеры к сети. .

version: '3'

services:
  container1:
    image: container1
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - "5100:80"
    depends_on:
      - container2
    networks:
      mynetwork:
        ipv4_address: 172.16.1.10
  container2:
    image: container2
    build:
      context: ./container2
      dockerfile: ./Dockerfile
    ports:
      - "5200:80"
    networks:
      mynetwork:
        ipv4_address: 172.16.1.20
networks:
  mynetwork:
    driver: bridge
    ipam:
      driver: default
      config:
      -
        subnet: 172.16.1.0/24
      -
        subnet: 2001:3984:3989::/64

После того, как вы настроили файл docker-compose, вы запускаете его с помощью:

docker-compose up

Чтобы снять это:

docker-compose down

Чтобы заставить его перестроить ваши изображения (если он был создан раньше, он будет использовать существующий образ):

docker-compose up --build

Другие вопросы по теме