Как создать одну сеть для двух разных Docker контейнеров, с возможностью подключения при помощи Python
Я создал два разных докер контейнера и пытаюсь подключиться к базе данных, однако подключение никаким образом не получается. Я создаю телеграм бота, и у меня есть необходимость запускать постоянно два разных контейнера которые объеденены одной сетью для подключения к базе данных.
О моих Docker контейнерах:
- Python проект с версией
3.11.9
(image: python:3.11.9-alpine3.19
), который должен подключаться к базе данных MongoDB, используя python библиотекуmotor
версии3.4.0
(pip install motor==3.4.0
) а такжеpymongo
версии4.6.3
(pip install pymongo==4.6.3
) - База данных MongoDB версии
4.4.29
(image: mongo:4.4.29
)
Я уже проверил все возможные варианты для подключения к базе данных MongoDB из Python, а то есть:
- Самостоятельно создавал сеть при помощи docker network create mongodb (имя сети), указывал эту сеть в docker-compose файле mongodb а также docker-compose файле самого python проекта.
Файл docker-compose для python:
version: "3.3"
services:
telegrambot:
image: "telegrambot"
container_name: "telegrambot"
restart: "unless-stopped"
stdin_open: "true"
tty: "true"
build:
context: "."
dockerfile: "Dockerfile"
networks:
- "mongodb"
volumes:
- "telegrambot:/home/docker-containers/scripts/telegrambot"
volumes:
telegrambot:
driver: "local"
Однако с этим файлом я получаю ошибку от самого docker, что не удается определить сеть:
docker-containers@asyncpydev:~/scripts/telegrambot$ docker compose up -d
WARN[0000] /home/docker-containers/scripts/telegrambot/docker-compose.yml: `version` is obsolete
service "telegrambot" refers to undefined network mongodb: invalid compose project
Если я попытаюсь определить сеть указав детально её данные в docker-compose файле самого python проекта, то при запуске контейнера создастся сеть с названием моего проекта и именем определенной сети, а то есть mongodb и в результате я получу новую сеть telegrambot_mongodb
.
Когда я указываю сеть другим образом с её определением external: True
, используется ранее мною созданная сеть mongodb, однако при попытке подключения к mongodb из python отображается ошибка что не удаётся подключиться. В итоге настроенная сеть для docker-compose файла, проекта python выглядит так:
version: "3.3"
services:
telegrambot:
networks:
- "mongodb"
networks:
mongodb:
external: "true"
А получаемая ошибка:
File "/usr/local/lib/python3.11/site-packages/pymongo/topology.py", line 259, in _select_servers_loop
raise ServerSelectionTimeoutError(
pymongo.errors.ServerSelectionTimeoutError: mongodb:24680: [Errno 111] Connection refused (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms), Timeout: 30s, Topology Description: <TopologyDescription id: 662a35795d892bfc6c02627e, topology_type: Unknown, servers: [<ServerDescription ('mongodb', 24680) server_type: Unknown, rtt: None, error=AutoReconnect('mongodb:24680: [Errno 111] Connection refused (configured timeouts: socketTimeoutMS: 20000.0ms, connectTimeoutMS: 20000.0ms)')>]>
В тоже время docker-compose файл моей базы данных MongoDB выглядит так:
version: "3.3"
services:
mongodb:
image: "mongo:4.4.29"
container_name: "mongodb"
restart: "unless-stopped"
stdin_open: "true"
tty: "true"
environment:
MONGO_INITDB_ROOT_USERNAME: "myuser"
MONGO_INITDB_ROOT_PASSWORD: "mypass"
MONGO_INTIDB_DATABASE: "admin"
ports:
- "24680:27017"
volumes:
- "mongodb:$HOME/etc/mongodb/data/db"
networks:
- "mongodb"
networks:
mongodb:
external: "true"
volumes:
mongodb:
driver: "local"
После запуска базы данных MongoDB я могу полноценно пользоваться базой данных из Windows 10 Pro при помощи MongoDB Compass, только при использовании хостов 127.0.0.1
а также localhost
с портом 24680. Также мой python проект спокойно подключается к базе данных, если он не находится в самом докер контейнере.
Я также проверял возможность подключения из самого docker контейнера с базой данных и авторизация удаётся:
docker exec -it mongodb mongo
use admin
db.auth("myuser", "mypass")
ifconfig на этом этапе отправляет мне, что не видит никаких дополнительных сетей от docker, что исключает вероятность использования других хостов, кроме как 127.0.0.1
а также localhost
:
docker-containers@asyncpydev:~/etc/mongodb$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.23.232.238 netmask 255.255.240.0 broadcast 172.23.239.255
inet6 fe80::215:5dff:fe5f:ec3c prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:5f:ec:3c txqueuelen 1000 (Ethernet)
RX packets 7241 bytes 8644766 (8.6 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3113 bytes 323045 (323.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 12439 bytes 21334985 (21.3 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12439 bytes 21334985 (21.3 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
У меня закончились варианты, как я мог бы осуществить подключение не определяя два сервиса в одном docker-compose файле, поэтому мне нужна ваша помощь.