场景描述
宿主机上使用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真的太方便了。
参考链接
- https://yq.aliyun.com/articles/55912
- https://rominirani.com/docker-tutorial-series-part-8-linking-containers-69a4e5bf50fb
- http://blog.csdn.net/halcyonbaby/article/details/42112141
- https://www.pgadmin.org/download/pgadmin-4-container/
- https://hub.docker.com/r/dpage/pgadmin4/
- https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
- http://www.carlboettiger.info/2014/11/05/notes.html
- https://www.digitalocean.com/community/tutorials/how-to-share-data-between-docker-containers
- https://jiajially.gitbooks.io/dockerguide/content/chapter_fastlearn/docker_run/--volumes-from.html
- https://stackoverflow.com/questions/23137544/how-to-map-volume-paths-using-dockers-volumes-from