python - 使用 Python 连接到 Docker 容器中的 MySQL
问题描述
我正在使用 pony.orm 使用 python 代码连接到 mysqldb:
db.bind(provider='mysql', user=username, password=password, host='0.0.0.0', database=database)
当我编写 docker compose 文件时:
db:
image: mariadb
ports:
- "3308:3306"
environment:
MYSQL_DATABASE: db
MYSQL_USER: root
MYSQL_ROOT_PASSWORD: ''
如何通过在 docker-compose.yml 文件中给出一个值(在环境中:)将主机名传递给 python 程序?
如果我传递该值,我可以通过 Python 代码中的 os.environ['PARAM'] 访问该值吗?
解决方案
因为您已在 中命名您的服务db
,所以docker-compose.yaml
您可以将其用作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>
这避免了对环境变量的需要,因为容器名称将被添加到网络的路由表中。
您不需要定义自己的网络,因为docker-compose
它将为您处理,但如果您希望更明确一点,它可以让您灵活地这样做。通常,您会将此保留用于要在单个网络上加入的多个撰写解决方案,但此处并非如此。
它的处理docker-compose
方式与您在 vanilla中的处理方式相同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。
推荐阅读
- java - 计算列表中元素的数量并将其附加到每个项目的末尾并保持要返回的列表中的插入顺序?
- java - Java:将 4 个单独的音频字节数组组合成单个 wav 音频文件
- jquery - jquery-raty 没有显示任何星星
- sugarcrm - 为什么每当我们在系统中创建新用户时,vtiger 都会在 user_privilege 中创建新的 .php 文件
- python - 试图返回一个字典,而不是得到一个
- python - 根据字符串python的开始关键字和结束关键字切割一个字符串
- android - 如何使用相对布局将小部件约束到末尾和顶部
- node.js - 为什么 crypto.pbkdf2Sync 在 Node JS 中的 setTimeout() 之前执行?
- reactjs - 用 setTimeout 测试钩子状态更新
- wordpress - Nginx:(111:连接被拒绝)同时连接到上游 wordpress 和 docker