При использовании docker -compose и docker run возникает некоторая удобная магия c. Сеть будет установлена неявным образом.
Пример:
cat > docker-compose.yml <<EOF
version: '3'
services:
c1:
image: alpine
container_name: c1
command: "sleep 1000"
c2:
image: alpine
container_name: c2
command: "sleep 1000"
EOF
# fire up the containers and detach
docker-compose up -d
Эти контейнеры смогут общаться друг с другом, так как сеть по умолчанию установлена. ( имя_папки_default )
docker network ls -fname=demo1
NETWORK ID NAME DRIVER SCOPE
e3777f15f5aa demo1_default bridge local
# c1 can talk to c2
docker-compose exec c1 sh -c 'ping -c1 c2'
PING c2 (172.30.0.2): 56 data bytes
64 bytes from 172.30.0.2: seq=0 ttl=64 time=3.741 ms
# c2 can talk to c1
docker-compose exec c2 sh -c 'ping -c1 c1'
PING c1 (172.30.0.3): 56 data bytes
64 bytes from 172.30.0.3: seq=0 ttl=64 time=0.798 ms
Теперь ваш сценарий состоит в том, что ваш контейнер базы данных не подключен к сети, созданной docker -compose. Например:
docker run --rm -it --name c3 alpine sh -c 'ping -c1 c1'
ping: bad address 'c1'
Вы можете определить сеть для своей команды запуска (это будет работать):
docker run --rm --net demo1_default -it --name c3 alpine sh -c 'ping -c1 c1'
PING c1 (172.30.0.3): 56 data bytes
64 bytes from 172.30.0.3: seq=0 ttl=64 time=0.571 ms
# make sure c3 keeps running while we try to contact it.
docker run --rm --net demo1_default -d -it --name c3 alpine sh -c 'sleep 1000'
# yes it works!
docker-compose exec c1 sh -c 'ping -c1 c3'
PING c3 (172.30.0.4): 56 data bytes
64 bytes from 172.30.0.4: seq=0 ttl=64 time=0.314 ms
Чтобы связать все мои различные компоненты вместе, я всегда определяю их в docker - составьте, где я явно назову сеть следующим образом:
cat > docker-compose.yml <<EOF
version: '3'
services:
c1:
image: alpine
container_name: c1
command: "sleep 1000"
networks:
- mynet
c2:
image: alpine
container_name: c2
command: "sleep 1000"
networks:
- mynet
networks:
mynet:
EOF
docker run
только для ad-ho c императивных вещей. Я бы включил службу базы данных в файл docker -compose.yml или в отдельный файл, например docker-compose -f mydb.yml up -d
, где определено имя сети. Оттуда ваши контейнеры смогут общаться с базой данных.
Удачи!