Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.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
如何在docker中连接MariaDB和Python_Python_Docker_Docker Compose_Mariadb_Database Connection - Fatal编程技术网

如何在docker中连接MariaDB和Python

如何在docker中连接MariaDB和Python,python,docker,docker-compose,mariadb,database-connection,Python,Docker,Docker Compose,Mariadb,Database Connection,我有两个容器:python和mariadb。因为域名是docker中的容器名,所以我将主机用作,但它无法连接 下面是我的docker-compose.yaml version: "3" services: db: container_name: mydb image: mariadb restart: always ports: - "3307:3306" environment: MY

我有两个容器: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的集装箱名称为“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合成后的Docker ps 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"}
我改变了什么,它做了什么:

  • 您不必向容器外部公开数据库端口,因为只有您的webapp将连接到它
  • 在应用程序的连接代码中,我更改了端口3307->3306,因为这两个容器位于同一网络中,不需要在堆栈外运行请求
  • 这里的问题是,使用docker内部DNS(容器名称),您也必须使用docker网络,因此使用容器公开的默认端口

    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"}
    
    我改变了什么,它做了什么:

  • 您不必向容器外部公开数据库端口,因为只有您的webapp将连接到它
  • 在应用程序的连接代码中,我更改了端口3307->3306,因为这两个容器位于同一网络中,不需要在堆栈外运行请求
  • 这里的问题是,使用docker内部DNS(容器名称),您也必须使用docker网络,因此使用容器公开的默认端口