启动容器test1和test2
docker run --name test1 -d busybox /bin/sh -c "while true; do sleep 3600; done"
docker run --name test2 -d busybox /bin/sh -c "while true; do sleep 3600; done"
docker网络常用命令
查看所有网络:docker network ls
查看某个网络详情:docker network inspect 网络ID
bridge
bridge模式:docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。
bridge 存在的目的:隔离各个容器,使得每个容器的端口号都是隔离的。如果不隔离开来,那么容器将和宿主机,容器和容器间都会发生端口占用的情况。
查看docker0网桥:ip addr show docker0
查看docker0详情:
sudo yum install bridge-utils
brctl show
这里的 veth7c94a82 是和容器test1的network namespace相连的。
新建一个test2容器后:
bridge 容器上网
NAT(Network Address Translation,网络地址转换),当在专用网内部的一些主机本来已经分配到了本地IP地址(即仅在本专用网内使用的专用地址),但现在又想和因特网上的主机通信(并不需要加密)时,可使用NAT方法。
这种方法需要在专用网连接到因特网的路由器上安装NAT软件。装有NAT软件的路由器叫做NAT路由器,它至少有一个有效的外部全球IP地址。这样,所有使用本地地址的主机在和外界通信时,都要在NAT路由器上将其本地地址转换成全球IP地址,才能和因特网连接。
创建bridge网络mybridge
docker network create -d bridge mybridge
各处信息同步:
docker network ls
:
ip a
:
brctl show
两个容器通过mybridge互连
docker network connect mybridge test1
docker network connect mybridge test2
查看mybridge信息 docker network inspect mybridge
:
test1中:
ping 172.18.0.3 –ok
ping test2 –ok
ping www.baidu.com –ok
test2中:
ping 172.18.0.2 –ok
ping test1 –ok
ping www.baidu.com –ok
成功实现两个容器互联。
创建bridge网络和link的区别
在test2中link test1后,test2容器有以下改变:
* 被注入环境变量
* /etc/hosts添加一行内容
* 只能test2 单向ping通test1
在test2和test1都连接bridge后:
- 没有注入环境变量
- 没有/etc/hosts修改
- test2和test1可以相互ping通
当多个容器互联时,使用自定义bridge的方式,是最简单的。如果使用link, 需要通信的容器个数大于 2 个时复杂度会呈指数增长,或者,你可以编辑容器内的 /etc/hosts 文件,但这会产生难以调试的问题。自定义bridge是通过容器间自动 DNS 解析(automatic DNS resolution来实现容器互联的。
用户定义bridge和默认bridge docker0的区别
默认情况下,从容器发送到默认网桥的流量,并不会被转发到外部。要开启转发,需要改变两个设置。这些不是 Docker 命令,并且它们会影响 Docker 主机的内核。
配置 Linux 内核来允许 IP 转发
sysctl net.ipv4.conf.all.forwarding=1
改变 iptables 的政策,FORWARD 政策从 DROP 变为 ACCEPT
sudo iptables -P FORWARD ACCEPT