如何在 docker 中连接 MariaDB 和 Python

How to connect MariaDB and Python in docker

我有两个容器:python 和 mariadb。由于域名是 docker 中的容器名称,我将主机用作 ,但无法连接。

以下是我的docker-compose.yaml

version: "3"

services:
  db:
    container_name: mydb
    image: mariadb
    restart: always
    ports:
      - "3307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: maria
    volumes:
      - ./sql_scripts:/scripts
      - hyacinth_db:/var/lib/mysql

  web:
    build: ./hyacinthBE
    container_name: hyacinth
    volumes:
      - ./hyacinthBE/app:/code
    ports:
      - "8000:80"
    depends_on:
      - db
    restart: on-failure

volumes:
  hyacinth_db:

注:mariadb的container_name为"mydb",端口为3307。

我的python连接代码如下:

from fastapi import FastAPI
import mariadb
import sys

app = FastAPI()

try:
    conn = mariadb.connect(
        user="root",
        password="maria",
        host="mydb",
        port=3307,
        database="Hyacinth"
    )
except mariadb.Error as e:
    print(f"Error connecting to MariaDB Platform: {e}")
    sys.exit(1)
cur = conn.cursor()


@app.get("/")
def read_root():
    return {"Hello": "World"}

Docker ps docker-组合

docker-compose.yml

version: "3"

services:
  database:
    image: mariadb
    environment:
      MYSQL_ROOT_PASSWORD: maria
    volumes:
      - /my/full/path/sql_scripts:/scripts
      - hyacinth_db:/var/lib/mysql

  web:
    build: /my/full/path/hyacinthBE
    volumes:
      - /my/full/path/hyacinthBE/app:/code
    ports:
      - "8000:80"

volumes:
  hyacinth_db:

连接码:

from fastapi import FastAPI
import mariadb
import sys

app = FastAPI()

try:
    conn = mariadb.connect(
        user="root",
        password="maria",
        host="database",
        port=3306,
        database="Hyacinth"
    )
except mariadb.Error as e:
    print(f"Error connecting to MariaDB Platform: {e}")
    sys.exit(1)
cur = conn.cursor()


@app.get("/")
def read_root():
    return {"Hello": "World"}

我改变了什么以及它做了什么:

  1. 您不必将数据库端口暴露给容器外部,因为只有您的 webapp 会连接到它
  2. 在应用程序的连接代码中,我更改了端口 3307 -> 3306,因为这两个容器在同一网络中,不需要 运行 堆栈外的请求

这里的事情是,使用 docker 内部 DNS(容器名称)你也必须使用 docker 网络,因此使用容器公开的默认端口