使用 Python 连接到 Docker 容器中的 MySQL

Connect to MySQL in Docker container using Python

我正在使用 pony.orm 通过 python 代码连接到 mysqldb:

db.bind(provider='mysql', user=username, password=password, host='0.0.0.0', database=database)

当我编写 docker 撰写文件时:

  db:
    image: mariadb
    ports:
      - "3308:3306"
    environment:
      MYSQL_DATABASE: db
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: ''

如何通过在 docker-compose.yml 文件中给出一个值(在环境中:)将主机名传递给 python 程序?

如果我传递值,我可以通过 Python 代码中的 os.environ['PARAM'] 访问该值吗?

因为您在 docker-compose.yaml 中将您的服务命名为 db,您可以将其用作 host,前提是您在同一网络上:

db.bind(provider='mysql', user=username, password=password, host='db', database=database)

为确保您在该网络上,在您的 docker-compose.yaml 底部,您需要:

networks:
  default:
    external:
      name: <your-network>

并且您需要在 运行 docker-compose up

之前创建该网络
docker network create <your-network>

这避免了对环境变量的需要,因为容器名称将添加到网络的路由 table 中。

不需要 定义自己的网络,因为 docker-compose 会为您处理,但如果您希望更明确一点,它允许您灵活地这样做。通常,您会为想要在单个网络上连接在一起的多个组合解决方案保留此选项,但此处不是这种情况。

它在 docker-compose 中的处理方式与在原版中的处理方式相同 docker:

docker run -d -p 3308:3306 --network <your-network> --name db mariadb
docker run -it --network <your-network> ubuntu bash

# in the shell of the ubuntu container
apt-get update && apt-get install iputils-ping -y
ping -c 5 db

# here you will see the results of ping reaching container db
5 packets transmitted, 5 received, 0% packet loss, time 4093ms

编辑

请注意,根据@DavidMaze 的评论,您将与之通信的端口是 3306,因为这是容器正在侦听的端口,而不是 3308。