【问题标题】:connect to mysql server in docker连接到 docker 中的 mysql 服务器
【发布时间】:2015-04-03 11:42:17
【问题描述】:

如果我在第一个 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 应用程序,我只想连接到第一个容器中的数据库,如何确定要使用的主机?

【问题讨论】:

    标签: python mysql docker mariadb dockerfile


    【解决方案1】:

    我对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 和端口。

    【讨论】:

    • 如何进入docker容器?
    • 这是一个不同的问题 :-) 基本上,使用 exec 行:docker exec -it myapp bash