docker网络是如何和宿主机相通的
先用docker命令查看下我们的docker网络
1 | docker network list |
可以看到网络列表
1 | NETWORK ID NAME DRIVER SCOPE |
然后我们查看指定网络信息
1 | docker inspect network bd45b573efca |
可以看到test1容器的网络信息
1 | "Containers": { |
test1这个容器连接的是docker0这个桥。我们可以通过ip a查看网桥和接口
可以看到docker0信息
1 | docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default |
也可以看到veth的接口信息,test容器的网络其实是通过vetch的接口连接到docker0上的
1 | sudo docker exec test1 ip a |
可以看到test容器的veth接口,该接口连接的就是docker0网桥
接下来我们安装个工具
1 | sudo apt-get install bridge-utils |
这样看到docker0连接的接口veth077a502,而该接口就是和容器连接的接口
1 | bridge name bridge id STP enabled interfaces |
这样,容器和宿主机就连接了。
多个容器如何实现网络互联
每个容器通过自己的veth连接docker0网桥,从而达到网络互联的目的
而bridge0可以通过nat映射访问外网
多个容器之间互联
可以通过link进行连接,但是link是单向的,比如
1 | docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 3000; done" |
test2是单方向连接test1,也就是从test2中可以访问test1,而test1是无法访问test2的
可以通过构建network实现两个容器互相访问
1 | docker network create -d bridge com-sig |
输入
1 | docker network ls |
可以看到docker网络
1 | NETWORK ID NAME DRIVER SCOPE |
启动新的容器指定network为com-sig
1 | docker run -d --name test2 --network com-sig busybox /bin/sh -c "while true; do sleep 3000; done" |
对于已经存在的容器,可以通过connect命令将两个容器连接到一个网络
1 | docker network connect com-sig test1 |
上述命令将test1连接到com-sig网络里,这样test1和test2就可以通信了。