O docker-compose criará, por padrão, uma rede virtual onde todos os contêineres/serviços no arquivo de composição podem se alcançar por um endereço IP. Usando
links
, depends_on
ou aliases de rede, eles podem se comunicar pelo nome do host. No seu caso, o nome do host é o nome do serviço, mas isso pode ser substituído. (consulte:docs
) Seu script em
my_common_package
container/service deve então se conectar ao mysql
na porta 3306
de acordo com sua configuração. (não localhost
na porta 3306
) Observe também que usar
expose
só é necessário se o Dockerfile para o serviço não tiver um EXPOSE
demonstração. A imagem padrão do mysql já faz isso. Se você deseja mapear uma porta de contêiner para
localhost
você precisa usar ports
, mas só faça isso se for necessário. 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"
Aqui estamos dizendo que a porta 3306 no contêiner mysql deve ser mapeada para localhost na porta 3306.
Agora você pode se conectar ao mysql usando
localhost:3306
fora do docker. Por exemplo, você pode tentar executar seu testsql.py
localmente (NÃO em um contêiner). A comunicação de contêiner para contêiner sempre acontecerá usando o nome do host de cada contêiner. Pense nos contêineres como máquinas virtuais.
Você pode até encontrar a rede docker-compose criada usando
docker network list
:1b1a54630639 myproject_default bridge local
82498fd930bb bridge bridge local
.. então use
docker network inspect <id>
para ver os detalhes. Os endereços IP atribuídos aos contêineres podem ser bastante aleatórios, portanto, a única maneira viável de comunicação entre contêineres é usando nomes de host.