Docker撰写mysql连接失败

Posted

技术标签:

【中文标题】Docker撰写mysql连接失败【英文标题】:Docker compose mysql connection failing 【发布时间】:2017-06-25 16:28:54 【问题描述】:

我正在尝试使用 docker-compose 运行 2 个 docker 容器并将 mysql 容器连接到应用程序容器。Mysql 容器正在运行,但应用程序容器无法启动并出现错误 Error:2003: Can't connect to MySQL '127.0.0.1:3306' 上的服务器(111 连接被拒绝) 似乎我的应用容器正在尝试连接我的主机 mysql 而不是 mysql 容器。

docker-compose.yml

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

这是我的 database_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)

【问题讨论】:

也许mysql需要一些时间来启动?在从您的应用开始连接之前尝试睡眠 10-30 秒 但它无法解决问题,因为即使在 mysql 容器启动后,app 容器仍然会出现相同的错误。我使用了 restrat: unless-restarted with app conatiner 【参考方案1】:

您可能需要考虑使用 Docker 网络。

当我有两个单独的 Python 容器连接到一个 mysql-Container 时,我遇到了类似的问题,而这两个容器连接到了一个 Vue-Frontend。

首先我尝试使用链接(这不是最佳的,因为通信流不是完全线性的),就像你一样,但我遇到了这篇很棒的帖子: https://www.cbtnuggets.com/blog/devops/how-to-share-a-mysql-db-with-multiple-docker-containers

使用网络可以关闭端口映射,让您增强整体应用架构。

因此,我认为您应该尝试以下方法:

services:
  python-app:
    networks:
      - network_name
    ...
  
  mysql:
    networks:
      - network_name
    ...

networks:
  network_name:

【讨论】:

【参考方案2】:

我可以看到两个问题:

    尝试添加

    links: 
      - mysql:mysql
    

    到 Docker Compose 文件中的 app 服务。这将确保您可以从app 访问mysql 容器。它将在您的app 容器中设置主机名映射(DNS),因此当您从appping mysql 时,它会将其解析为mysql 容器的IP 地址。

    在您的.py 文件中,您在哪里定义要连接到哪个主机?将host="mysql" 添加到connect 呼叫。默认情况下,它将连接到127.0.0.1,这就是您所看到的。

    cnx = mysql.connector.connect(host="mysql", user="root", password = 'root', database=malicious)
    

解决这两个问题应该可以解决您的问题。

【讨论】:

谢谢它解决了这个问题。但我想了解我的应用程序容器如何能够在不指定端口的情况下连接 mysql 连接器?我的意思是我没有指定端口或公开 mysql 端口。 MySQL 容器自动暴露 3306 端口(默认端口),Python MySQL 连接器使用 3306 作为默认值。如果您使用不同的端口,您可以在 connect 调用中使用额外的 port=XXX 参数来提供它。 添加了这个步骤,还是一样的错误。连接将名称“mysql”解析为 IP 但无法连接( @Sultan1991 你解决了吗?我也遇到了这个问题

以上是关于Docker撰写mysql连接失败的主要内容,如果未能解决你的问题,请参考以下文章

远程连接Docker上的Mysql失败的解决方案

使用docker-compose编写常规的lnmp容器,pdo连接mysql失败。

phpmyadmin 未使用 docker 连接----配置中定义的 controluser 连接失败

docker远程连接失败,2375端口也是放开了的

docker mysql 出现错误:连接 ECONNREFUSED

与 Docker 容器中的 Kafka 代理的连接失败 [重复]