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地址相互访问。 通过使用links
, depends_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.py
( testsql.py
一个容器中)。
容器到容器的通信总是会使用每个容器的主机名来进行。 将容器想象成虚拟机。
您甚至可以find使用docker network list
创build的networkingdocker-compose:
1b1a54630639 myproject_default bridge local 82498fd930bb bridge bridge local
然后使用docker network inspect <id>
查看详细信息。
为容器分配的IP地址可以是相当随机的,所以容器到容器通信的唯一可行方法是使用主机名。