创建一个容器就会创建一个它的network netspace
查看当前机器有哪些docker网络:
docker network ls
结果:
默认创建容器会默认连接到默认的bridge
查看指定网络的元数据(可以看到连接到这个网络的容器以及这个容器的ip)
docker network inspect NETWORKID
在得到的结果中,Containers字段包含的内容是使用此网络的所有容器
查看当前有的linux bridge:brctl show
得到的结果中interfaces是连接bridge所使用的接口
同一个宿主机,两个容器之间是如何通信的:
宿主机每创建一个容器,就会创建一个bridge接口连接到,同时容器也会创建一个bridge接口,这一对接口都连接在docker0这个bridge,这样就可以通信了。
下面是示例图,
两个容器分别是两个不同的network netspace,连接的是主机默认的一个network netspace,通过这个两对线就连在了一起
对于单个容器它是如何访问internet呢?
如果宿主机可以通过eth0访问外网,那么docker0通过一个NAT进行网络地址转换,那么容器访问外网时经过docker0这个bridge并之后通过NAT进行地址转换eth0的地址,它就会作为一个linux主机的数据包发到外面去
两个容器通信用名字代替ip地址:
1.通过link,使用link相当于使用DNS记录
例如:
通过busybox创建一个容器名为test1
docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"
再用busybox创建一个容器名为test2,创建test2时使用了link链接了test1
docker run -d --name test2 --link test1 busybox /bin/sh -c "while true; do sleep 3600; done"
2.默认创建容器时默认连接的是bridge,其实可以创建容器时可以指定使用的网络,可以指定host、none甚至可以自己建一个bridge
docker network create -d bridge my-bridge
这样就创建了一个名为my-bridge类型为bridge的网络
将已经创建的容器连接到指定的bridge网络
docker network connect my-bridge test2
如果两个容器都连接到了用户创建的bridge上,那么它们默认是link好的,可以通过相互ping通
容器的端口映射:
在创建容器时指定容器和宿主机的端口映射
例如:
docker run --name web -d -p 80:80 nginx
当访问宿主机的80端口时会将流量转发到容器的80端口
这样在外部就可以访问宿主机创建的容器了