【问题标题】:Connecting MYSQL container with Python container through volume and pymysql通过volume和pymysql连接MYSQL容器和Python容器
【发布时间】:2020-09-30 20:18:11
【问题描述】:

我需要将一个 MYSQL 容器连接到一个 Python 容器,这样我就可以在这个 Python 容器上从我的 MYSQL 获取数据库。我现在正在使用 pymysql。

我使用 docker-compose 制作了容器,我将在此处链接文档。 dockerfile.yml mysql 'my-mysql' 是 mij 自定义 mysql 镜像

version: "3.3"

services:
  app-name: 
    build:
      context:  .
    image: my-mysql
    container_name: my-mysql
    ports:
     - '3308:3308'
    environment:
      MYSQL_ROOT_PASSWORD: 'root-password'
      MYSQL_DATABASE: 'bags'
      MYSQL_USER: 'user'
      MYSQL_PASSWORD: 'password'
    restart: unless-stopped
    expose: 
     - '3308'
volumes:
  data:
    external:
      name: data

这是 python 的dockerfile.yml,“dataoverdracht”是我的自定义 python 图像

version: "3.7"

services:
  app-name:
    build:
      context:  .
    image: dataoverdracht:1.0.0
    container_name: dataoverdracht
    ports:
     - 92:8080
    environment:
     - TARGET=$TARGET
    restart: unless-stopped
    volumes:
     - .:/data
volumes:
  data:
    external:
      name: data

这是我为容器连接mysql而编写的python代码。

import dash_html_components as html

import pymysql

import pandas as pd

connection = pymysql.connect("172.17.0.2","user","password","bags" )

cur = connection.cursor()

cur.execute("select * from filledbags LIMIT 10")

rows = cur.fetchall()

df = pd.DataFrame(rows)

print(df)

我有 dockerfiles 和 requirements.txt 之类的文档,但我可以向您保证,它们没有任何问题,唯一可以方便的是从 dockerfile python 公开,这是 EXSPOSE 8080。

当我尝试连接它们时,我会收到错误

pymysql.err.OperationalError: (1045, "Access denied for user 'user'@'172.18.0.2' (using password: YES)")

有人可以向我解释我的代码有什么问题吗?顺便说一句:我确实在这个网站上检查了不同的问题我读了一些关于更改 my.cnf 我试图寻找我的绑定地址,但它没有包含在这个文件中,所以这似乎不是解决方案。

【问题讨论】:

  • 我建议去docs.docker.com/compose/networking 看看。因为您创建了 2 个单独的 docker compose 文件。首先检查本地计算机中 pymysql 的 url/port 是什么,这将为您提供一个很好的开始,以了解应用程序包中的问题。

标签: python mysql docker pymysql


【解决方案1】:

您需要创建网络例如my_network

$ docker network create --driver=bridge my_network

然后在 docker-compose 文件中使用它。

first_file.yml

version: "3.3"

services:
  app-name:
    build:
      context: .
    image: my-mysql
    container_name: my-mysql
    ports:
      - "3308:3308"
    environment:
      MYSQL_ROOT_PASSWORD: "root-password"
      MYSQL_DATABASE: "bags"
      MYSQL_USER: "user"
      MYSQL_PASSWORD: "password"
    restart: unless-stopped
    expose:
      - "3308"
    networks:
      - my_network

networks:
  my_network:
    external: true

volumes:
  data:
    external:
      name: data

second_file.yml

version: "3.7"

services:
  app-name:
    build:
      context: .
    image: dataoverdracht:1.0.0
    container_name: dataoverdracht
    ports:
      - 92:8080
    environment:
      - TARGET=$TARGET
    restart: unless-stopped
    volumes:
      - .:/data
    networks:
      - my_network

networks:
  my_network:
    external: true

volumes:
  data:
    external:
      name: data

然后更新您的 python 代码(使用 my_network 而不是 172.17.0.2 )。

import dash_html_components as html

import pymysql

import pandas as pd

connection = pymysql.connect("my_network","user","password","bags" )

cur = connection.cursor()

cur.execute("select * from filledbags LIMIT 10")

rows = cur.fetchall()

df = pd.DataFrame(rows)

print(df)

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2020-03-01
    • 2022-01-22
    相关资源
    最近更新 更多