回到主页

docker容器访问宿主机的服务

宿主机服务绑定于127.0.0.1

· Docker,运维

场景描述

宿主机上使用docker安装了一个数据库,出于安全考虑,该数据库绑定到127.0.0.1上,并暴露了一个接口给上层的应用连接。

常规情况下,我们在宿主机上跑jvm程序,连接本机数据库,自然没有问题。

最近,我们打算在server上也装一个docker版的pgadmin4,方便管理数据库。

这就涉及到从一个docker容器的内部访问宿主机上绑定在127.0.0.1的服务了。

弯路

朝着题目的目标,还是走了些弯路。

docker默认是bridge的网络方式,直接127.0.0.1只能访问到容器内容的环境,自然是行不通的。

尝试把第二个容器的网络环境改成 host(--net="host"),使得第二个容器的网络环境和宿主机一致,结果pgadmin4这个镜像写死了要占用80端口,和宿主机的Nginx直接冲突,跑都跑不起来。

又试了--net="container:name or id" 这样的方式,使得两个容器的网络环境一致,但是第二个容器的服务业需要暴露出来,这就要求修改第一个容器的网络环境,太折腾放弃。

容器间的link

此时转念一想,可以纠正一下题目,其实我们的实际需求可以变更为,一个容器的网络可以访问另一个容器的网络。

朝着这个思路,很快找到了link机制,这时候docker容器间的link机制就有很大用处了。

1.运行一个容器,通过–name指定一个便于记忆的名字,这个容器被称为source container,也就是要连接的容器

docker run --name db -e MYSQL_ROOT_PASSWORD=server -d mysql

上面通过传递环境变量MYSQL_ROOT_PASSWORD=server,来设置mysql服务的密码为server

2.运行另外一个容器,并link到上面启动的容器,这个容器被称为received container

sudo docker run -d --name web --link db:aliasdb nginx

上面通过--link连接名为db的容器,并为其设置了别名aliasdb
完成了上面的两个步骤后,在nginx的容器中就可以使用db或者aliasdb作为连接地址来连接mysql服务,即使容器重启了,地址发生了变化,不会影响两个容器之间的连接。

 

上面贴了云栖社区参考文章的一段,讲解的很实用了。docker真的太方便了。

参考链接