Подключение к базе данных из докера, с сетью host
Один контейнер, сильно завязанн на свои адреса при работе. Астериск. Он включается с сетью host. Но он также подключается к базе данных. Как узнать адрес контейнера с бд в этом случае?
version: '2.4'
volumes:
astdb:
voicemail:
pgdata:
services:
asterisk:
#image: azielke/asterisk:lts
build: ./docker/asterisk/
container_name: asterisk
restart: always
network_mode: host
depends_on:
- db
environment:
- TZ=Europe/Moscow
volumes:
- "./asterisk:/etc/asterisk:ro"
- "./odbcinst.ini:/etc/odbcinst.ini:ro"
- "./odbc.ini:/etc/odbc.ini:ro"
- "astdb:/var/lib/asterisk/db"
- "voicemail:/var/spool/asterisk/voicemail"
db:
image: postgres:10
restart: always
environment:
POSTGRES_PASSWORD: asterisk
POSTGRES_USER: asterisk
POSTGRES_DB: asterisk
volumes:
- "pgdata:/var/lib/postgresql/data"
ports:
- "127.0.0.1:5432:5432"
Как не выкидывать db по портам в этом случае?
# docker network inspect asterdocker_default
[
{
"Name": "asterdocker_default",
"Id": "58c21386cd625c803976e2a323a1f0756dfb7096804c52cd62d4119f281f5997",
"Created": "2021-08-09T22:52:08.393852519Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"040d5fecc26d4e1e8bd65217fe5e7a34dccd35e8b10fe35a1eb0355dd7f11110": {
"Name": "asterdocker_db_1",
"EndpointID": "98cf10ccde83d58a4ae3b01d3a1c6195e5e95b268e244f1523452566b045a802",
"MacAddress": "02:42:ac:12:00:02",
"IPv4Address": "172.18.0.2/16",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {
"com.docker.compose.network": "default",
"com.docker.compose.project": "asterdocker",
"com.docker.compose.version": "1.25.0"
}
}
]
нужный хост имеет адрес 172.18.0.2 - как его отресолвить?
Ответы (1 шт):
Автор решения: Senior Pomidor
→ Ссылка
нельзя одновременно иметь и host и bridge типы сетей в композе.
По умолчанию композ сам решает кому какой IP установить при старте. Но так как этот метод не детерминирован, то нам нужно самому определять нужные IP-шники контейнеров
version: "2.4"
services:
db:
image: postgres:10
ports:
- "5432:5432"
environment:
- "POSTGRES_DB=metrics"
- "POSTGRES_PASSWORD=password"
- "POSTGRES_USER=user"
networks:
app_net:
ipv4_address: 172.16.238.20
ipv6_address: 2001:3984:3989::20
app:
image: ubuntu:18.04
network_mode: host
command:
- /bin/bash
- -c
- |
apt-get update && apt-get -y install iputils-ping telnet
ping -c 10 172.16.238.20
sleep 10000
networks:
app_net:
driver: bridge
enable_ipv6: true
ipam:
driver: default
config:
- subnet: 172.16.238.0/24
gateway: 172.16.238.1
- subnet: 2001:3984:3989::/64
gateway: 2001:3984:3989::1
кусок логов
app_1 | Processing triggers for libc-bin (2.27-3ubuntu1.4) ...
app_1 | PING 172.16.238.20 (172.16.238.20) 56(84) bytes of data.
app_1 | 64 bytes from 172.16.238.20: icmp_seq=1 ttl=64 time=0.122 ms
app_1 | 64 bytes from 172.16.238.20: icmp_seq=2 ttl=64 time=0.055 ms
app_1 | 64 bytes from 172.16.238.20: icmp_seq=3 ttl=64 time=0.168 ms
app_1 | 64 bytes from 172.16.238.20: icmp_seq=4 ttl=64 time=0.160 ms
app_1 | 64 bytes from 172.16.238.20: icmp_seq=5 ttl=64 time=0.055 ms
app_1 | 64 bytes from 172.16.238.20: icmp_seq=6 ttl=64 time=0.055 ms
app_1 | 64 bytes from 172.16.238.20: icmp_seq=7 ttl=64 time=0.059 ms
app_1 | 64 bytes from 172.16.238.20: icmp_seq=8 ttl=64 time=0.055 ms
app_1 | 64 bytes from 172.16.238.20: icmp_seq=9 ttl=64 time=0.059 ms
app_1 | 64 bytes from 172.16.238.20: icmp_seq=10 ttl=64 time=0.084 ms
app_1 |
app_1 | --- 172.16.238.20 ping statistics ---
app_1 | 10 packets transmitted, 10 received, 0% packet loss, time 9199ms
app_1 | rtt min/avg/max/mdev = 0.055/0.087/0.168/0.043 ms