原理
Docker本地网络实现利用了linux的网络命名空间和虚拟网络设备(veth pair)
基本原理
要实现网络通信,机器需要至少一个网络接口与外界机器相连,并可以收发数据包。
docker中的网络是在本地主机和容器内分别创建一个虚拟接口,并让它们彼此联通。这样的接口叫做veth pair. 然后这样接口一个链接在容器上,接口的另一端连载网桥docker0上。docker0网桥和宿主机的物理网卡相连。
网络创建过程
(1) 创建一对虚拟接口,分别放到本地主机和新容器的命名空间中;
(2)本地主机一段的虚拟接口连接到默认的docker0网桥或指定网桥上,并具有一个以veth开头的唯一名字
(3) 容器一端的虚拟接口将放到新创建的容器中,并修改名字为eth0。这个接口只在容器的命名空间可见。
(4)从网桥可用地段中获取一个空闲地址分配给容器的eth0,并配置默认路由网关为docker0网卡的内部接口docker0的ip地址
容器启动网络配置参数
有5个可选值bridge、none、container、host和用户定义的网络:
–net=bridge:默认值,在Docker网桥docker0上为容器创建新的网络栈。❑–net=none:让Docker将新容器放到隔离的网络栈中,但是不进行网络配置。
–net=container:NAME_or_ID:让Docker将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享IP地址和端口等网络资源,两者进程可以直接通过lo环回接口通信。
–net=host:告诉Docker不要将容器网络放到隔离的命名空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其他root进程一样打开低范围的端口,可以访问本地网络服务,比如D-bus,还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用–privileged=true参数,容器甚至会被允许直接配置主机的网络栈。
-net=user_defined_network:用户自行用network相关命令创建一个网络,通过这种方式将容器连接到指定的已创建网络上去。
容器互联
可以使用 --link参数来是容器互联
但是建议将容器加入自定义的Docker网络来连接多个容器,而不是使用–link参数
新建网络
docker network create -d bridge my-net
-d 参数指定 Docker 网络类型,有 bridge overlay
连接容器
运行一个容器并连接到新建的my-net网络
docker run -it --rm --name busybox1 --network my-net busybox sh
打开终端,在运行一个容器并加入到my-net网络
docker run -it --rm --name busybox2 --network my-net busybox sh
在打开一个终端 查看容器信息
docker container ls
这样就可以看到 busybox1容器和busyboy2容器建立了连接
可以有attach 命令 进去 任意一个容器 ping来测试容器之间 是否连接