docker run创建Docker容器时,可以用–net选项指定容器的网络模式,Docker有以下4种网络模式:
Ø bridge模式:使--net =bridge指定,默认设置;
Ø host模式:使--net =host指定;
Ø none模式:使--net =none指定;
Ø container模式:使用--net =container:NAME orID指定。
参考:http://www.docker.org.cn/dockerppt/111.html
一:docker 容器的网络基础
1.docker0:
linux的虚拟网桥
在OSI七层模型中的数据链路层
2.Linux虚拟网桥的特点:
可以设置ip地址
相当于拥有一个隐藏的虚拟网卡
docker0的地址划分:
IP:172.17.42.1 子网掩码:255.255.0.0
MAC:02:42:ac:11:00:00到02:42:ac:11:ff:ff
总共提供了65534个地址
通过veth*与容器通信
3.安装网桥管理工具:
yum install bridge-utils -y
brctl show 可以查看到有一个docker0的网桥设备,下面有很多接口,每个接口都表示一个启动的docker容器,因为我在docker上启动了很多容器,所以interfaces较多,如下所
4.修改docker0地址:
ifconfig docker0 192.168.200.1 netmask 255.255.255.0
然后重启docker:
service docker restart
创建一个容器,进去之后ifconfig可以看见docker0的ip地址是我们刚才设置的了
5.添加虚拟网桥
brctl addbr br0
ifconfig br0 172.16.1.1 netmask 255.255.0.0(我的宿主机docker0地址是172.17.42.1)
更改docker守护进程的启动配置(docker1.7按如下方式改):
/etc/sysconfig/docker 中添加
other_args="-b=br0"
重启docker:service docker restart
ps -ef | grep docker 可以看见br0这个参数
docker run -it centos:6.9 /bin/bash
ifconfig可以看见ip地址是172.16.0.1
也就是说们启动docker时,在/etc/sysconfig/docker里修改other_args="-b=br0",在创建docker容器的时候,容器的ip就是172.16.*.*,也就是我们新建立的网桥
二:docker 容器的互联(相互之间的访问)
下面用到的镜像的dockerfile文件如下:
cd dockerfile/inter-image
vim dockerfile
FROM centos:7 RUN yum install epel-release -y RUN yum install nginx -y RUN sed -i "7s/^/#/g" /etc/nginx/conf.d/default.conf EXPOSE 80 CMD /bin/bash
docker build -t="inter-image" .
允许所有容器间互联(也就是访问)
第一种方法:
例:
(1)基于上面的inter-image镜像启动第一个容器test1
docker run --name test1 -it inter-image
进入到容器里面启动nginx:
/usr/sbin/ngnx
Ctrl +p,ctrl+q 退出
(2)基于上面的inter-image镜像启动第二个容器test2
docker run --name test2 -it inter-image
ctrl+p和ctrl+q退出容器
(3)进入到test1容器和test2容器,可以看两个容器的ip,分别是
172.17.0.20和172.17.0.21
docker exec -it test2 /bin/bash
ping 172.17.0.20 可以看见能ping通test1容器的ip
curl http://172.17.0.20
可以访问到test1容器的内容
上述方法假如test1容器重启,那么在启动就会重新分配ip地址,所以为了使ip地址变了也可以访问可以采用下面的方法
第二种方法:
可以给容器起一个代号,这样可以直接以代号访问,避免了容器重启ip变化带来的问题
--link
docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE][COMMAND]
例:
1.启动一个test3容器
docker run --name test3 -it inter-image /bin/bash
启动nginx:
/usr/sbin/nginx
Ctrl+p和ctrl+q退出或者exit退出
2.启动一个test5容器,--link做链接,那么当我们重新启动test3容器时,就算ip变了,也没关系,我们可以在test5上ping别名webtest
docker run --name test5 -it --link=test3:webtest inter-image /bin/bash
ctrl+p和ctrl+q退出
3.test3和test5的ip分别是172.17.0.22和172.17.0.24
4.重启test3容器
docker restart test3
发现ip变成了172.17.0.25
5.进入到test5容器
docker exec -it test5 /bin/bash
ping test3容器的ip别名webtest可以ping通,尽管test3容器的ip变了也可以通
拒绝容器互联(拒绝容器相互访问)
docker守护进程的启动项
--icc=false
修改启动项的配置文件
vim /etc/sysconfig/docker
在最后一行添加如下参数:
other_args="-icc=false"
重启docker容器配置生效,然后分别运行test3,test5,在test5上ping test3的ip(webtest),会发现ping不通