通过卷和 pymysql 连接 MYSQL 容器和 Python 容器

Connecting MYSQL container with Python container through volume and pymysql

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

我用 docker-compose 制作了容器,我将 link 文件放在这里。 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)

我有 docker 文件和 requirements.txt 之类的文件,但我可以向你保证,它们没有任何问题,唯一方便的是来自 docker 的公开文件文件 python 这是 EXSPOSE 8080。

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

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

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

例如您需要创建网络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)