Docker连接主要有三种方式:
1. Docker内部网络(不灵活)
2. Docker Networking以及docker network命令(推荐)
3. Docker链接
Docker内部连网
在安装Docker时,会创建一个新的网络接口,名字是docker0。每个Docker容器都会在这个接口上分配一个ip地址。
ip a show docker0
docker0是一个虚拟的以太网桥,用于链接容器和本地宿主网络。Docker每创建一个容器就会创建一组互联的网络接口,他们连接宿主机端口到docker0网桥,形成一个虚拟子网。
从宿主网络与容器通信时,必须指明打开的端口。 但是一旦重启容器,那么ip将会发生变化。
Docker Networking
Docker Networking以新的用户管理的网络补充了现有的docker0。现在容器可以跨越不同的宿主机来通信,并且网络配置可以更灵活地定制。
-
创建Docker网络
docker network create app
这里用docker network创建了一个桥接网络,命名为app,这个命令返回新创建的网络ID。
查看新创建的网络dockerr network inspect
-
在Docker网络中创建容器
docker run -d --net=app --name db jamtur01/redis
–net指定了新容器将会在哪个网络中运行。
在app网络内部启动的容器,可以感知到所有在这个网络下运行的容器,并且通过/etc/hosts文件将这些容器的地址保存到本地DNS中。在代码中指定Redis DB主机名
redis = Redis.new(:host => 'db', :port => '6379')
如果任意一个容器重启了,那么它的ip地址信息则会自动在/etc/hosts文件中更新。
添加已有容器到Docker网络docker network connect
docker network connect app db2
从网络中断开一个容器
//从app网络中断开db2 docker network disconnect app db2
通过Docker链接连接容器
Docker1.9之前才推荐这种方式。
Docker链接如何工作的?
新建一个Redis容器开始
docker run -d --name redis jamtur01/redis
这里没有公开容器的任何端口。
链接 Redis 容器
docker run -p 4567 --name webapp --link redis:db -t -i -v $PWD/webapp_redis:/opt/webapp jamtur01/sinatra /bin/bash
–link 标志创建了两个容器间的客户-服务链接。这个标志需要两个参数:一个是要链接的容器的名字,另一个是容器的别名。可以绑定多个容器与Redis容器之间的链接。
最后容器启动时打开shell脚本,这样就可以查看容器是如何链接在一起的。Docker在父容器里的以下两个地方写入了链接信息:/etc/hosts文件中以及包含链接信息的环境变量中。
使用容器链接来通信的方式:
1. 使用环境变量里的一些连接信息。
2. 使用DNS和/etc/hosts信息。
使用DNS配置连接信息
docker run命令中可以加入–dns或者–dns-search标志来为某个容器单独配置DNS。更多配置见https://docs.docker.com/article.com/articles/networking/ 如果没有那两个标示,Docker会根据宿主机的信息来配置DNS。
redis = Redis.new(:host => 'db', :port => '6379')
应用程序会在本地查找名叫db的宿主机,找到/etc/hosts文件里的相关项并解析宿主机到正确的IP地址。