docker:通过dockerhost连接到数据库容器

时间:2015-11-07 19:22:43

标签: docker

我试图在两种情况下从应用程序容器连接到数据库容器,一个成功,一个没有。

我的dockerhost上有两个容器:

  1. 端口3306连接到dockerhost上的3356的mysql容器
  2. 申请容器
  3. 在工作中,dockerhost的IP地址为10.0.2.15,在家中,dockerhost的IP地址为192.168.8.11(主机名-I)。
    在这两种情况下,我都希望从主机10.0.2.15/192.168.8.11和端口3356的应用程序容器连接到数据库容器。

    当我在工作时这样做(Windows网络,Vagrant / Virtualbox dockerhost)时,这没问题。我可以通过telnet 10.0.2.15 3356'从app容器并连接到db容器。 当我在家里(Ubuntu)这样做时,无法连接。唯一的方法是使用db容器(172.17.0.2)的docker ip地址和端口3306.但是,我可以ping 192.168.8.11。

    启动容器的脚本是相同的;我不使用--add-host,因此dockerhost IP地址不在/ etc / hosts中。

    有什么建议吗?

2 个答案:

答案 0 :(得分:1)

好的,使用docker运行3个数据库实例

docker run --name mysqldb1 -e MYSQL_ROOT_PASSWORD=changeme -d mysql
docker run --name mysqldb2 -e MYSQL_ROOT_PASSWORD=changeme -d mysql
docker run --name mysqldb3 -e MYSQL_ROOT_PASSWORD=changeme -d mysql

每台主机都有不同的IP地址:

$ for i in mysqldb1 mysqldb2 mysqldb3
> do   
> docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $i
> done
172.17.0.2
172.17.0.3
172.17.0.4

在您的计算机上重复此操作,您很可能拥有不同的IP地址。

那么问题是如何解决的呢。

旧方法(在docker 1.9中弃用)是使用链接。以下命令将显示如何在链接的应用程序容器(使用数据库的容器)中设置环境变量

$ docker run -it --rm --link mysqldb1:mysql mysql env 
..
MYSQL_PORT_3306_TCP_ADDR=172.17.0.2

$ docker run -it --rm --link mysqldb2:mysql mysql env 
..
MYSQL_PORT_3306_TCP_ADDR=172.17.0.3

$ docker run -it --rm --link mysqldb3:mysql mysql env 
..
MYSQL_PORT_3306_TCP_ADDR=172.17.0.4

以下演示了如何创建链接:

$ docker run -it --rm --link mysqldb1:mysql mysql grep mysql /etc/hosts
172.17.0.2  mysql 2a12644351a0 mysqldb1

$ docker run -it --rm --link mysqldb2:mysql mysql grep mysql /etc/hosts
172.17.0.3  mysql 89140cbf68c7 mysqldb2

$ docker run -it --rm --link mysqldb3:mysql mysql grep mysql /etc/hosts
172.17.0.4  mysql 27535e8848ef mysqldb3

所以你可以使用“mysql”主机名或“MYSQL_PORT_3306_TCP_ADDR”环境变量来引用另一个容器。

在Docker 1.9中,有一个更强大的网络功能,可以让容器跨主机链接。

http://docs.docker.com/engine/userguide/networking/dockernetworks/

答案 1 :(得分:0)

您可以使用我的容器作为dockerhost的NAT网关,而无需任何手动设置https://github.com/qoomon/docker-host