Docker networking

Собственно, хочу чтобы мой контейнер был доступен как на созданном docker bridge, так и на localhost моего сервера.

version: "3"
services:
  server:
    image: zalgo
    build: .
    command: python3 ZalgoBot.py
    ports:
      - 8000:8000
    networks:
      - zalgo_net
    restart: always
    depends_on:
      - gpl
    container_name: zalgo

  gpl:
    image: gpl
    build: GPL
    ports:
      - 7865:7865
    command: python3 GPL.py
    restart: always
    networks:
      zalgo_net:
        ipv4_address: 192.168.127.3
    container_name: gpl
networks:
  zalgo_net:
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.127.0/24

zalgo_net нужна для обмена данными между сервисами, а доступ к localhost сервера мне нужен для того, чтобы потом уже непосредственно через проксирование nginx выставлять сервис zalgo в свет.

В сетях слаб, поэтому не могу сказать работает ли bridge правильно. Буду рад любым замечаниям по сетям.


Ответы (1 шт):

Автор решения: Senior Pomidor

В docker-compose 3 версии когда вы поднимаете, то композ автоматически поднимает bridge-network для вашего композа. Ваши сервисы начнут видеть друг-друга по имени.

container_name вам тоже не нужен, так как это будет мешать вам скелиться.
Как быть, если захотите 2 инстанса базы или api поднять? Никак.

Вот пример:

version: '3.7'

services:
  app1:
    image: alpine
    command: ping -c 100 app2
  app2:
    image: alpine
    command: ping -c 100 app1
  app3:
    image: alpine
    command: ping -c 100 app2
    depends_on:
      - app2

Выполняем docker-compose up

✗ docker-compose up
Creating network "app_default" with the default driver
Creating app_app1_1 ... done
Creating app_app2_1 ... done
Creating app_app3_1 ... done
Attaching to app_app1_1, app_app2_1, app_app3_1
app2_1  | PING app1 (172.21.0.2): 56 data bytes
app2_1  | 64 bytes from 172.21.0.2: seq=0 ttl=64 time=0.117 ms
app1_1  | PING app2 (172.21.0.3): 56 data bytes
app1_1  | 64 bytes from 172.21.0.3: seq=0 ttl=64 time=0.090 ms
app3_1  | PING app2 (172.21.0.3): 56 data bytes
app3_1  | 64 bytes from 172.21.0.3: seq=0 ttl=64 time=0.267 ms
app1_1  | 64 bytes from 172.21.0.3: seq=1 ttl=64 time=0.209 ms
app2_1  | 64 bytes from 172.21.0.2: seq=1 ttl=64 time=0.567 ms
app3_1  | 64 bytes from 172.21.0.3: seq=1 ttl=64 time=0.259 ms
app1_1  | 64 bytes from 172.21.0.3: seq=2 ttl=64 time=0.243 ms
app2_1  | 64 bytes from 172.21.0.2: seq=2 ttl=64 time=0.179 ms
app3_1  | 64 bytes from 172.21.0.3: seq=2 ttl=64 time=0.369 ms
app1_1  | 64 bytes from 172.21.0.3: seq=3 ttl=64 time=0.179 ms
app2_1  | 64 bytes from 172.21.0.2: seq=3 ttl=64 time=0.144 ms
app3_1  | 64 bytes from 172.21.0.3: seq=3 ttl=64 time=0.141 ms
app1_1  | 64 bytes from 172.21.0.3: seq=4 ttl=64 time=0.245 ms
app2_1  | 64 bytes from 172.21.0.2: seq=4 ttl=64 time=0.214 ms
app3_1  | 64 bytes from 172.21.0.3: seq=4 ttl=64 time=0.129 ms
app1_1  | 64 bytes from 172.21.0.3: seq=5 ttl=64 time=0.188 ms
app2_1  | 64 bytes from 172.21.0.2: seq=5 ttl=64 time=0.189 ms
app3_1  | 64 bytes from 172.21.0.3: seq=5 ttl=64 time=0.137 ms
app1_1  | 64 bytes from 172.21.0.3: seq=6 ttl=64 time=0.395 ms
app2_1  | 64 bytes from 172.21.0.2: seq=6 ttl=64 time=0.143 ms
app3_1  | 64 bytes from 172.21.0.3: seq=6 ttl=64 time=0.219 ms
app1_1  | 64 bytes from 172.21.0.3: seq=7 ttl=64 time=0.133 ms
app2_1  | 64 bytes from 172.21.0.2: seq=7 ttl=64 time=0.188 ms

В композе идет пинг контейнеров друг-друга. при старте стартуют сразу app1 и app2, а app3 ждет пока поднимется app2, потому что depends_on. Это и видно в логе.

Как выяснили, контейрены работают друг с другом, так как докер по умолчанию создает network. Название берет из названия папки.

Как из контейрера получить доступ к хост-машине?
чтобы из контейнера ссылаться на хост-маишу, можно использовать специальный алиас docker.for.mac.localhost, docker.for.win.localhost. Еще одним способов является использование host network.

Относительно удобства работы с такими контейнерами, можно вместо docker kill app1, использовать docker-compose,

docker-compose down - удалить все нетворки, контейнеры
docker-compose up app3 - поднять контейнер app3 и все, что он ссылается.
docker-compose stop app
docker-compose kill app

→ Ссылка