Docker组合mysql连接失败

时间:2017-02-08 06:58:19

标签: python mysql docker docker-compose

我正在尝试使用docker-compose运行2个docker容器并将mysql容器连接到app容器.Mysql容器正在运行但是app容器无法启动时出现错误错误:2003:无法连接在' 127.0.0.1:3306'上的MySQL服务器(111连接被拒绝) 好像我的app容器正在尝试连接我的主机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)}

2 个答案:

答案 0 :(得分:2)

我可以看到两个问题:

  1. 尝试添加

    links: 
      - mysql:mysql
    

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

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

    cnx = mysql.connector.connect(host="mysql", user="root", password = 'root', database=malicious)
    
  3. 修复这两个问题可以解决您的问题。

答案 1 :(得分:0)

您可能需要考虑使用 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: