我试图在两种情况下从应用程序容器连接到数据库容器,一个成功,一个没有。
我的dockerhost上有两个容器:
在工作中,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中。
有什么建议吗?
答案 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