Python Docker编写mysql连接失败
我正在尝试使用docker compose运行2个docker容器,并将mysql容器连接到应用容器。mysql容器正在运行,但应用容器无法启动,错误为:2003:无法连接到“127.0.0.1:3306”上的mysql服务器(111连接被拒绝) 似乎我的应用程序容器正在尝试连接我的主机mysql,而不是mysql容器 docker compose.ymlPython Docker编写mysql连接失败,python,mysql,docker,docker-compose,Python,Mysql,Docker,Docker Compose,我正在尝试使用docker compose运行2个docker容器,并将mysql容器连接到应用容器。mysql容器正在运行,但应用容器无法启动,错误为:2003:无法连接到“127.0.0.1:3306”上的mysql服务器(111连接被拒绝) 似乎我的应用程序容器正在尝试连接我的主机mysql,而不是mysql容器 docker compose.yml version: '2' services: mysql: image: mysql:5.7 container_nam
version: '2'
services:
mysql:
image: mysql:5.7
container_name: database
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: malicious
MYSQL_USER: root
MYSQL_PASSWORD: root
app:
build: .
restart: unless-stopped
volumes:
- .:/Docker_compose_app #app directory
depends_on:
- "mysql"
command: [ "python", "database_update.py"]
restart: unless-restart
environment:
# Environment variables to configure the app on startup.
MYSQL_DATABASE: malicious
MYSQL_HOST: database
Dockerfile
FROM python:2.7
ADD . /Docker_compose_app
WORKDIR /Docker_compose_app
RUN apt-get update
RUN pip install --requirement requirement.txt
这是我的数据库\u update.py文件
def create_TB(cursor,connection):
query = '''CREATE TABLE {}(malicious VARCHAR(100) NOT NULL)'''.format("url_lookup")
cursor.execute(query)
connection.commit()
def connection():
try:
cnx = mysql.connector.connect(user="root",password = 'root',database=malicious)
cursor = cnx.cursor()
create_TB(cursor,cnx)
except mysql.connector.errors.Error as err:
data = {"There is an issue in connection to DB":"Error: {}".format(err)}
我可以看到两个问题:
links:
- mysql:mysql
到Docker Compose文件中的应用程序
服务。这将确保您可以从app
访问mysql
容器。它将在您的app
容器中设置主机名映射(DNS),因此当您从app
ping mysql时,它将解析为mysql
容器的IP地址.py
文件中,您在哪里定义要连接到的主机?将host=“mysql”
添加到connect
调用中。默认情况下,它将连接到您看到的127.0.0.1
cnx = mysql.connector.connect(host="mysql", user="root", password = 'root', database=malicious)
修复这两个应该解决你的问题。
你可能想考虑使用DOCKER网络。
当两个单独的Python容器连接到一个mysql容器时,我遇到了类似的问题,而这两个容器连接到一个Vue前端 首先,我尝试使用链接(这不是最佳的,因为通信流不是完全线性的),就像你一样,但我遇到了这篇伟大的帖子: 使用网络可以关闭端口映射,让您增强整个应用程序体系结构 因此,我认为您应该尝试以下方式:services:
python-app:
networks:
- network_name
...
mysql:
networks:
- network_name
...
networks:
network_name:
也许mysql需要一些时间来开始?在从应用程序启动连接之前,尝试睡眠10-30秒,但这不会解决问题,因为即使在mysql容器出现之后,app container仍然给出相同的错误。我使用了restrat:除非用app conatinerThanks重新启动,否则它解决了问题。但我试图了解我的app container如何能够在不指定端口的情况下连接mysql连接器?我的意思是我没有指定端口或公开mysql端口。mysql容器自动公开端口3306(默认端口),Python MySQL连接器使用3306作为默认值。如果使用其他端口,则可以在
connect
调用中使用额外的port=XXX
参数提供该端口。添加此步骤后,仍然会出现相同错误。Connection将名称“MySQL”解析为IP,但无法连接(@Sultan1991)你修好了吗?我也遇到了麻烦