【问题标题】:Why mysql service is not accessible?为什么mysql服务无法访问?
【发布时间】:2019-08-19 09:38:38
【问题描述】:

建立连接时服务名没有解析到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-compose ps

Name                     Command             State                 Ports              
----------------------------------------------------------------------------------------------
flaskapp_flask-app_1   python3 app.py                Up      0.0.0.0:5000->5000/tcp           
flaskapp_mysqldb_1     docker-entrypoint.sh mysqld   Up      0.0.0.0:3333->3306/tcp, 33060/tcp

docker 网络 ls

NETWORK ID          NAME                DRIVER              SCOPE
509b1e597bc4        bridge              bridge              local
b841295e0dc6        flaskapp_default    bridge              local
2cd96006df91        host                host                local
260025d73006        none                null                local

【问题讨论】:

  • 您需要设置networkslinks 才能调用容器服务名称
  • 您不应该使用端口3333 连接到您的数据库吗?
  • docker-compose 不会将两个容器放在同一个网络中,即桥接吗?
  • 3333端口用于从localhost访问数据库。
  • 你能从本地访问你的数据库吗?

标签: mysql docker flask docker-compose


【解决方案1】:

正如你的cmets中有人所说,你需要配置networkslinks

这是一个如何使用 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:

mysqldbflask-app 都将加入 mynetwork 网络。

我通常会过度测试,所以我也会docker-compose exec flask-app bash 并运行ping mysql 命令(假设安装了 ping)以确保两个容器之间有网络连接。

另外,虽然我提到了links,但您应该避免使用它,因为它是一个已弃用的功能,可能会在未来的 docker-compose 版本中被删除。

【讨论】:

  • 问题不在于网络,而在于容器的启动。但是创建 docker-compose 不会以相同的 n/w 启动服务。那么为什么我需要创建新的 n/w。
  • 我认为您对应该创建的默认网络是正确的。但我认为容器的启动失败是因为您的入口点失败,这是连接被拒绝错误。然后我会从 mysql 容器开始并在其中运行 netstat -tulpn 以查看端口是否打开。可能是你的mysql失败了?你能从你的主机上的 3333 端口连接吗?
【解决方案2】:

您的 mysql 服务在端口 3333 上有一个侦听器。

PORTS 语法:HOST:CONTAINER (https://docs.docker.com/compose/compose-file/)

在您的烧瓶应用程序中,您尝试连接到端口 3306。但在您的默认 docker 网络中,我假设没有 mysqldb 在端口 3306 中侦听。

仅供参考: 在您的容器中尝试 netstat -tulpn 以查看所有侦听器。

【讨论】:

    猜你喜欢
    • 2012-08-25
    • 2017-02-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-04
    • 1970-01-01
    • 2019-04-12
    • 2016-05-14
    • 2013-03-17
    相关资源
    最近更新 更多