docker-compose по подразбиране ще създаде виртуална мрежа, където всички контейнери/услуги във файла за композиране могат да се свързват един с друг чрез IP адрес. С помощта на links
, depends_on
или мрежови псевдоними, те могат да се свързват един с друг чрез име на хост. Във вашия случай името на хоста е името на услугата, но това може да бъде отменено. (вижте:docs
)
Вашият скрипт в my_common_package
контейнерът/услугата трябва да се свърже с mysql
на порт 3306
според вашата настройка. (не localhost
на порт 3306
)
Също така имайте предвид, че използвате expose
е необходимо само ако Dockerfile за услугата няма EXPOSE
изявление. Стандартното изображение на mysql вече прави това.
Ако искате да съпоставите порт на контейнер към localhost
трябва да използвате ports
, но правете това само ако е необходимо.
services:
mysql:
image: mysql:5.6
container_name: test_mysql_container
environment:
- MYSQL_ROOT_PASSWORD=test
- MYSQL_DATABASE=My_Database
- MYSQL_USER=my_user
- MYSQL_PASSWORD=my_password
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
Тук казваме, че порт 3306 в контейнера mysql трябва да бъде съпоставен с localhost на порт 3306.
Сега можете да се свържете с mysql с помощта на localhost:3306
извън docker. Например можете да опитате да стартирате вашия testsql.py
локално (НЕ в контейнер).
Комуникацията между контейнери винаги ще се извършва с помощта на името на хоста на всеки контейнер. Мислете за контейнерите като виртуални машини.
Можете дори да намерите мрежовия docker-compose, създаден с помощта на docker network list
:
1b1a54630639 myproject_default bridge local
82498fd930bb bridge bridge local
.. след това използвайте docker network inspect <id>
за да разгледате подробностите.
Присвоените IP адреси на контейнерите могат да бъдат доста произволни, така че единственият жизнеспособен начин за комуникация между контейнери е използването на имена на хостове.