为什么mysql服务不可访问?

为什么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

在建立连接期间,服务名称未解析为mysql的主机。 服务名称是mysqldb,但当我在连接数据库时将其用作主机时,它会生成错误

已解决:问题在于容器的启动。烧瓶容器没有等待mysql容器准备就绪。这就是它提前退出的原因。我通过使用烧瓶容器故障时的重启策略进行了快速修复。

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
  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版本中删除。

您需要设置
网络
链接
,以便能够调用容器服务名称。您不应该使用port
3333
连接到数据库吗?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端口的主机连接吗?