如何在 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"}
我改变了什么以及它做了什么:
- 您不必将数据库端口暴露给容器外部,因为只有您的 webapp 会连接到它
- 在应用程序的连接代码中,我更改了端口 3307 -> 3306,因为这两个容器在同一网络中,不需要 运行 堆栈外的请求
这里的事情是,使用 docker 内部 DNS(容器名称)你也必须使用 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"}
我改变了什么以及它做了什么:
- 您不必将数据库端口暴露给容器外部,因为只有您的 webapp 会连接到它
- 在应用程序的连接代码中,我更改了端口 3307 -> 3306,因为这两个容器在同一网络中,不需要 运行 堆栈外的请求
这里的事情是,使用 docker 内部 DNS(容器名称)你也必须使用 docker 网络,因此使用容器公开的默认端口