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 шт):
В 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