Docker无法将应用程序连接到MySQL

我想运行集成testing(在Python中),这取决于MySQL。 目前他们依赖于本地运行的SQL,但是我希望他们依赖于在docker中运行的MySQL。

Dockerfile的内容:

FROM continuumio/anaconda3:4.3.1 WORKDIR /opt/workdir ADD . /opt/workdir RUN python setup.py install 

Docker组件的内容:

 version: '2' 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 restart: always expose: - "3306" my_common_package: image: my_common_package depends_on: - mysql restart: always links: - mysql volumes: db_data: 

现在,我尝试使用以下命令在我的包中运行testing:

 docker-compose run my_common_package python testsql.py 

我收到错误

pymysql.err.OperationalError:(2003,“无法连接到'localhost'上的MySQL服务器([Errno 99]无法分配请求的地址)”)

docker-compose默认情况下会创build虚拟networking,而撰写文件中的所有容器/服务都可以通过IP地址相互访问。 通过使用linksdepends_on或networking别名,他们可以通过主机名相互访问。 在你的情况下,主机名称是服务名称,但是这可以被覆盖。 (请参阅: 文档 )

my_common_package容器/服务中的脚本应根据您的设置连接到端口3306上的mysql 。 (不是端口3306上的localhost

另请注意,只有在服务的EXPOSE没有EXPOSE语句的情况下才需要使用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" 

这里我们说的是,mysql容器中的3306端口应该映射到3306端口上的localhost。

现在你可以使用localhost:3306以外的localhost:3306连接到mysql。 例如,你可以尝试在本地运行你的testsql.pytestsql.py一个容器中)。

容器到容器的通信总是会使用每个容器的主机名来进行。 将容器想象成虚拟机。

您甚至可以find使用docker network list创build的networkingdocker-compose:

 1b1a54630639 myproject_default bridge local 82498fd930bb bridge bridge local 

然后使用docker network inspect <id>查看详细信息。

为容器分配的IP地址可以是相当随机的,所以容器到容器通信的唯一可行方法是使用主机名。