docker-compose creará de forma predeterminada una red virtual donde todos los contenedores/servicios en el archivo de composición pueden comunicarse entre sí mediante una dirección IP. Mediante el uso de links
, depends_on
o alias de red, pueden comunicarse entre sí por nombre de host. En su caso, el nombre de host es el nombre del servicio, pero esto se puede anular. (ver:docs
)
Tu script en my_common_package
el contenedor/servicio debe conectarse a mysql
en el puerto 3306
según su configuración. (no localhost
en el puerto 3306
)
También tenga en cuenta que usar expose
solo es necesario si el Dockerfile para el servicio no tiene un EXPOSE
declaración. La imagen mysql estándar ya hace esto.
Si desea asignar un puerto de contenedor a localhost
necesitas usar ports
, pero hazlo solo si es necesario.
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"
Aquí decimos que el puerto 3306 en el contenedor mysql debe asignarse a localhost en el puerto 3306.
Ahora puede conectarse a mysql usando localhost:3306
fuera de la ventana acoplable. Por ejemplo, puede intentar ejecutar su testsql.py
localmente (NO en un contenedor).
La comunicación de contenedor a contenedor siempre ocurrirá utilizando el nombre de host de cada contenedor. Piense en los contenedores como máquinas virtuales.
Incluso puede encontrar la red docker-compose creada usando docker network list
:
1b1a54630639 myproject_default bridge local
82498fd930bb bridge bridge local
.. luego use docker network inspect <id>
para ver los detalles.
Las direcciones IP asignadas a los contenedores pueden ser bastante aleatorias, por lo que la única forma viable de comunicación de contenedor a contenedor es mediante nombres de host.