Docker网络功能

容器间的访问

首先安装bridge-utils

#sudo apt-get install bridge-utils

Docker网络功能_第1张图片

新添加一个桥接网卡br0

#sudo brctl addbr br0

Docker网络功能_第2张图片

修改配置文件加入DOCKER_OPTS="-b=br0" ,使用该桥接网卡启动docker

#sudo vim /etc/default/docker

重启docker

#sudo restart docker

启动一个容器发现ip地址已经使用我们自定义的br0ip地址为192.168.100.2

Docker网络功能_第3张图片

 

容器互联

使用 --link 参数可以容器之安全的行交互

我们再次创建一个容器httpd2 使用--link选项,并测试两个容器的连通性

--link 参数的格式--link name:alias ,其中 name 是要接的容器的名称, alias 接的名。

Docker网络功能_第4张图片

关闭并重新启动httpd1并查看其地址,发现地址已经改变

Docker网络功能_第5张图片

我们再用httpd2 测试httpd1的连接,发现地址已自动修正

Docker网络功能_第6张图片

我们查看一下他的host记录。发现httpd1ip地址已自动更新

Docker网络功能_第7张图片

拒绝容器之间的互联

--icc=false

编辑/etc/default/docker ,增加--icc=false,并重启docker

wKiom1W6_oGTGRSkAABiemaiy-U897.jpg

启动容器

Docker网络功能_第8张图片

连接到httpd2再次测试httpd1,发现网络已经不通

wKiom1W6_pjTuqs6AAB-LAkXSzg489.jpg

容许特定的连接

编辑/etc/default/docker ,增加--iptables=true,并重启docker

wKiom1W6_rPjK0XEAABoQicz4qM685.jpg

进入容器httpd1启动httpd服务

wKiom1W6_ryDcVFVAACIfBrdCqw594.jpg

使用httpd2测试httpd1web服务,是否发现web可以访问呢?

Docker网络功能_第9张图片

我们来查看一下本地的iptables,发现httpd1web端口是对httpd2开放的,所以我们可以访问却ping不通

Docker网络功能_第10张图片

我们再次启动一个httpd3拒绝他访问httpd1web

wKioL1W7ANuDVA-qAABu18Nt05M030.jpg

是不是发现httpd3无法访问httpd1web服务呢。有关ubuntuiptables下节我将介绍一下

Docker网络功能_第11张图片

Docker网络功能_第12张图片

外部访问容器

容器中可以行一些网络应用,要外部也可以访问这用,可以通-P -p 参数来指定端口映射。

当使用 -P 标记时Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网端口。

 

#sudo docker -it -p 80 --name httpd4 192.168.7.130:5000/httpd

Docker网络功能_第13张图片

使用docker port 加容器名查看映射端口

也可以自己定义指定端口来映射,如图,我们用8080端口来映射容器的web服务

#sudodocker run -it -p 8080:80 --name httpd5 192.168.7.130:5000/httpd

Docker网络功能_第14张图片

本地访问测试

Docker网络功能_第15张图片

/etc/default/docker 参数

其中有些命令选项只有在 Docker 务启动候才能配置,而且不能上生效。

-b BRIDGE or --bridge=BRIDGE --指定容器挂的网

--bip=CIDR --定制 docker0的掩

-H SOCKET... or --host=SOCKET... --Docker 端接收命令的通道

--icc=true|false --是否支持容器之间进行通信

--ip-forward=true|false --看下文容器之的通信

--iptables=true|false --禁止 Docker 添加 iptables 规则

--mtu=BYTES --容器网中的 MTU

下面2个命令选项既可以在启动务时指定,也可以 Docker 容器启动docker run 候指定。在

Docker 务启动候指定会成认值,后面docker run 可以覆盖置的默认值

--dns=IP_ADDRESS... --使用指定的DNS

--dns-search=DOMAIN... --指定DNS搜索域

最后选项只有在 docker run 使用,因它是针对容器的特性内容。

-h HOSTNAME or --hostname=HOSTNAME --配置容器主机名

--link=CONTAINER_NAME:ALIAS --添加到一个容器的

--net=bridge|none|container:NAME_or_ID|host--配置容器的接模式

-p SPEC or --publish=SPEC --映射容器端口到宿主主机

-P or --publish-all=true|false --映射容器所有端口到宿主主机

容器访问控制

容器要想访问外部网,需要本地系转发支持。在Linux 中,检查转发是否打开。

$sysctl net.ipv4.ip_forward

net.ipv4.ip_forward = 1

如果0明没有开启转发需要手打开。

$sysctl -w net.ipv4.ip_forward=1

如果在启动 Docker --ip-forward=true ,Docker 就会自动设定系ip_forward参数1