Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Docker编写mysql连接失败_Python_Mysql_Docker_Docker Compose - Fatal编程技术网

Python Docker编写mysql连接失败

Python 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

我正在尝试使用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_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)你修好了吗?我也遇到了麻烦