python - 在 docker 中连接到 mysql 服务器

标签 python mysql docker mariadb dockerfile

如果我在第一个 docker 容器中运行 mysql 服务器:

docker run --name mysqlserver -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.5

并将第二个 docker 容器与第一个容器链接起来:

docker run --name myapp --link mysqlserver:mysql -d vladimir/app

如果在第二个 docker 容器中我有 python 应用程序,我只想连接到第一个容器中的数据库,如何确定要使用的主机?

最佳答案

我对mysql不太熟悉。查看 mysql 文档似乎这可能是您想要的命令类型:

import _mysql
db=_mysql.connect(host="mysql",port=3306,passwd="...",db="...")

当您在应用程序运行中执行 --link 时,您声明了您正在将名为 mysqlserver 的容器的 EXPOSEd 端口链接到名为 myapp 的容器。 Docker 更新/etc/hosts 文件。因此,如果您 cat/etc/hosts 文件,您应该会看到如下一行:

172.17.0.26 mysql 5c960433e26a mysqlserver

所以这就是为什么在你的 python 中引用主机“mysql”的原因。默认端口是 3306。所以,这应该连接你。将此主机和端口用于您从 python 使用的任何 mysql 连接包。

这就是我在其他对象众所周知的端口上与其他对象连接的方式。您也可以使用环境变量,但是,我认为这可能会被逐步淘汰……不知道……

root@d23d8be2a6fa:/# env | grep MYSQL
MYSQL_ENV_MYSQL_ROOT_PASSWORD=pass
MYSQL_PORT_3306_TCP_PORT=3306
MYSQL_PORT_3306_TCP=tcp://172.17.0.32:3306
MYSQL_ENV_MYSQL_VERSION=5.5.42
MYSQL_NAME=/myapp/mysql
MYSQL_PORT_3306_TCP_PROTO=tcp
MYSQL_PORT_3306_TCP_ADDR=172.17.0.32
MYSQL_ENV_MYSQL_MAJOR=5.5
MYSQL_PORT=tcp://172.17.0.32:3306

因此您可以修改连接线以使用环境:

import os
myhost = os.environ.get('MYSQL_PORT_3306_TCP_ADDR')
myport = int(os.environ.get('MYSQL_PORT_3306_TCP_PORT'))
import _mysql
db=_mysql.connect(host=myhost,port=myport,passwd="...",db="...")

无论哪种方式。这是发现。还有更复杂的方法,使用consul、etcd、skydns、registrator。我喜欢 skydns/registrator 配对,registrator 监视你的 docker 守护进程,当创建新容器时,它会将 dns 记录插入 etcd,skydns 可以使用它来模拟 dns 服务器。使用这种技术,您还可以获得 ip 和端口。

关于python - 在 docker 中连接到 mysql 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29431549/

相关文章:

python - reshape 的输入是一个具有 37632 个值的张量,但请求的形状有 150528 个

python - django-cms makemigrations错误: No module named 'packaging'

python - 如何使用Python分割字符串

php - 如何更改 WAMP 中 phpMyAdmin 中显示的语言?

bash - 如果镜像有入口脚本,Docker 无法启动交互式 shell

python - 为特定行更新 pandas DataFrame 的单元格

mysql - 简化mysql全文搜索

php - 使用 Eloquent 在 Laravel 中进行内连接

macos - 无法连接到 jenkins docker 容器 MacOS 内的 docker

google-chrome - Windows 上的 Chrome 和 Firefox 与 Linux 上的 Chrome 和 Firefox (selenium)