为什么mysql服务不可访问?
在建立连接期间,服务名称未解析为mysql的主机。 服务名称是mysqldb,但当我在连接数据库时将其用作主机时,它会生成错误 已解决:问题在于容器的启动。烧瓶容器没有等待mysql容器准备就绪。这就是它提前退出的原因。我通过使用烧瓶容器故障时的重启策略进行了快速修复。 docker-compose.yml文件:为什么mysql服务不可访问?,mysql,docker,flask,docker-compose,Mysql,Docker,Flask,Docker Compose,在建立连接期间,服务名称未解析为mysql的主机。 服务名称是mysqldb,但当我在连接数据库时将其用作主机时,它会生成错误 已解决:问题在于容器的启动。烧瓶容器没有等待mysql容器准备就绪。这就是它提前退出的原因。我通过使用烧瓶容器故障时的重启策略进行了快速修复。 docker-compose.yml文件: version: '3.7' services: mysqldb: image: mysql:latest environment: MYSQL_R
version: '3.7'
services:
mysqldb:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: myapp
MYSQL_PASSWORD: root
ports:
- "3333:3306"
volumes:
- ./db:/docker-entrypoint-initdb.d/:ro
flask-app:
build: .
ports:
- "5000:5000"
depends_on:
- mysqldb
使用mysql.connector
mydb = mysql.connector.connect(host="mysqldb", user="root",password="root", database="myapp", port="3306")
这就是我得到的错误
flask-app_1 | Traceback (most recent call last):
flask-app_1 | File "/usr/local/lib/python3.7/site-packages/mysql/connector/network.py", line 509, in open_connection
flask-app_1 | self.sock.connect(sockaddr)
flask-app_1 | ConnectionRefusedError: [Errno 111] Connection refused
flask-app_1 |
flask-app_1 | During handling of the above exception, another exception occurred:
flask-app_1 |
flask-app_1 | Traceback (most recent call last):
flask-app_1 | File "app.py", line 10, in <module>
flask-app_1 | mydb = mysql.connector.connect(host="mysqldb", user="root",password="root", database="myapp", port="3306")
flask-app_1 | File "/usr/local/lib/python3.7/site-packages/mysql/connector/__init__.py", line 179, in connect
flask-app_1 | return MySQLConnection(*args, **kwargs)
flask-app_1 | File "/usr/local/lib/python3.7/site-packages/mysql/connector/connection.py", line 95, in __init__
flask-app_1 | self.connect(**kwargs)
flask-app_1 | File "/usr/local/lib/python3.7/site-packages/mysql/connector/abstracts.py", line 716, in connect
flask-app_1 | self._open_connection()
flask-app_1 | File "/usr/local/lib/python3.7/site-packages/mysql/connector/connection.py", line 206, in _open_connection
flask-app_1 | self._socket.open_connection()
flask-app_1 | File "/usr/local/lib/python3.7/site-packages/mysql/connector/network.py", line 512, in open_connection
flask-app_1 | errno=2003, values=(self.get_address(), _strioerror(err)))
flask-app_1 | mysql.connector.errors.InterfaceError: 2003: Can't connect to MySQL server on 'mysqldb:3306' (111 Connection refused)
flaskapp_flask-app_1 exited with code 1
docker网络
NETWORK ID NAME DRIVER SCOPE
509b1e597bc4 bridge bridge local
b841295e0dc6 flaskapp_default bridge local
2cd96006df91 host host local
260025d73006 none null local
您的mysql服务在端口3333上有一个侦听器 端口语法:主机:容器() 在flask应用程序中,您尝试连接到端口3306。但在默认的docker网络中,我假设在端口3306中没有mysqldb侦听 供参考:
在容器中尝试netstat-tulpn以查看所有侦听器。您的mysql服务在端口3333上有一个侦听器 端口语法:主机:容器() 在flask应用程序中,您尝试连接到端口3306。但在默认的docker网络中,我假设在端口3306中没有mysqldb侦听 供参考:
请在容器中尝试netstat-tulpn以查看所有侦听器。正如您的评论中所述,您需要配置
网络
或链接
以下是如何使用docker-compose.yml配置网络的示例示例:
version: '3.7'
services:
mysqldb:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: myapp
MYSQL_PASSWORD: root
ports:
- "3333:3306"
volumes:
- ./db:/docker-entrypoint-initdb.d/:ro
networks:
- mynetwork
flask-app:
build: .
ports:
- "5000:5000"
depends_on:
- mysqldb
networks:
- mynetwork
networks:
mynetwork:
mysqldb
和flask-app
都将加入mynetwork
网络
我通常会过度测试,所以我也会docker编写exec flask app bash
,并运行ping mysql
命令(假设安装了ping),以确保两个容器之间具有网络连接
另外,虽然我提到了
链接
,但您应该避免使用它,因为它是一个不推荐使用的功能,可能会在将来的docker compose版本中删除。正如您的评论中所述,您需要配置网络
或链接
以下是如何使用docker-compose.yml配置网络的示例示例:
version: '3.7'
services:
mysqldb:
image: mysql:latest
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: myapp
MYSQL_PASSWORD: root
ports:
- "3333:3306"
volumes:
- ./db:/docker-entrypoint-initdb.d/:ro
networks:
- mynetwork
flask-app:
build: .
ports:
- "5000:5000"
depends_on:
- mysqldb
networks:
- mynetwork
networks:
mynetwork:
mysqldb
和flask-app
都将加入mynetwork
网络
我通常会过度测试,所以我也会docker编写exec flask app bash
,并运行ping mysql
命令(假设安装了ping),以确保两个容器之间具有网络连接
另外,虽然我提到了
链接
,您应该避免使用它,因为它是一个不推荐使用的功能,可能会在将来的docker compose版本中删除。您需要设置网络
或链接
,以便能够调用容器服务名称。您不应该使用port3333
连接到数据库吗?docker compose是否将两个容器放在同一个位置网络即桥接?端口3333用于从本地主机访问数据库。您可以从本地访问数据库吗?您需要设置网络
或链接
才能调用容器服务名称您不应该使用端口3333
连接到数据库吗?docker compose是否将两个容器放在同一个位置网络即桥接?端口3333用于从本地主机访问数据库。您可以从本地主机访问数据库吗?问题不在于联网,而在于容器的启动。但是创建docker compose不会在相同的n/w中启动服务。那么,为什么我需要创建新的n/w。我认为您关于应该创建的默认网络的看法是正确的。但是我认为容器的启动失败了,因为您的入口点失败了,这就是连接被拒绝错误。然后我从mysql容器开始,在其中运行netstat-tulpn
,查看端口是否打开。可能是你的mysql失败了?你能从3333端口上的主机连接吗?问题不在于联网,而在于容器的启动。但是创建docker compose不会在相同的n/w中启动服务。那么,为什么我需要创建新的n/w。我认为您关于应该创建的默认网络的看法是正确的。但是我认为容器的启动失败了,因为您的入口点失败了,这就是连接被拒绝错误。然后我从mysql容器开始,在其中运行netstat-tulpn
,查看端口是否打开。可能是你的mysql失败了?你能从3333端口的主机连接吗?