Day08 docker 五种网络
docker的网络模式
关于docker的容器怎么实现上网,我们之前已经画图讲过了
docker的网络模式
Bridge:默认这个模式,此模式会为每一个容器分配Ip(docker 0 虚拟网卡),并且将容器连接到一个docker虚拟网桥,通过docker0网桥以及Iptables nat表配置与宿主机的通信
host:容器不会配置Ip,虚拟网卡,而是使用宿主机的Ip和端口
None:可以说单机自己玩了,关闭网络功能
Container:创建的容器不会创建自己的网卡,配置IP,而是和一个指定的容器共享IP,端口范围
自定义网络:自定义网络,其实就是bridge的升级版
Bridge 网桥模式
-net=bridge
默认网络,docker启动之后也会创建一个docker0 网桥,默认创建的容器也是添加到这个网桥
docker run -itd --name=nginx-test nginx
# 不指定映射端口,32768开始
docker inspect nginx-test
host模式
--net=host
不会获得一个独立的network namespace,而是和宿主机公用一个,这就意味着容器不会创建虚拟网卡,ip
而是使用宿主机的,容器除了网络,其他都是隔离的
docker run -itd --name=test --net=host busybox
none模式
容器拥有自己的network namespace ,但是它不为docker容器做任何网络配置
这个docker 容器没有网卡,IP、路由等信息,这种网络环境下它只有lo回环网络,没有其他网络,这种类型的网络无法联网,能很好的保证容器的安全性,也就是自己玩
-net=none
获得独立的network namespace 不做任何网络配置,需要手动配置
docker run -itd --net=none --name=none-test busybox
container模式
这个模式也叫做依附,这个模式指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿主机共享
新创建的容器不会创建自己的网卡,配置IP
而是和指定的容器共享IP,端口范围,同样的,两个容器除了网络方面,其他的内容都是隔离的,两个容器的进程可以用过网卡设备通信
container
-net=container
于指定的容器使用同一个network namespace,具有同样的网络配置信息,两个容器除了网络,其他隔离
docker run -itd --name=container-test --net=container:test busybox
# 我们做实验的 host 模式容器---test
# container 模式--container-test
两个容器进行docker inspect 查看具体信息都是没有Ip的
# 我们通过查看容器id查看一下
docker inspect -f '{{.State.Pid}}' test
docker inspect -f '{{.State.Pid}}' container-test
ls -l /proc/4748/ns
ls -l /proc/10120/ns
自定义模式
升级版本的bridge
docker 的bridge模式,无法指定IP,需要规定的docker的网络 地址就需要自己去定义docker的网络地址段
docker network create network-test
docker network ls
docker run -itd --name=networktest --net=network-test busybox
docker run -itd --name=networktest1 --net=network-test busybox
docker inspect networktest
docker exec -it networktest /bin/sh
ping networktest1
docker 可以自定义网络,指定自己的Ip,网关
在创建容器的时候可以把容器指定到自己创建的网络中
在创建的容器中,容器的Ip地址都是自己定义地址地址池来分配的
自己创建的网络模式中,容器之间可以通过 容器名字来访问,如ping network2
# 自定义网络
docker network create --driver bridge --subnet 192.168.20.0/24 --gateway 192.168.20.1 mynet
# 使用自定义网络创建容器
docker run -itd --name=net-test1 --network mynet busybox
docker run -itd --name=net-test2 --network mynet busybox
# PS:默认创建的容器是无法ping通这两个容器的
docker run -itd --name=net-test3 busybox
而net-test1 \2 是通的
我们把net-test3加入到我们创建的网络mynet中再来试试
docker network connect mynet net-test3
容器互联如何实现
-link 用于在容器之间建立一条专门的网络通信隧道,即在源容器和接受容器之间建立一条隧道,接受容器就可以看到源容器的指定信息
-link能够实现容器之间通过容器名通信,共享环境变量
注意:这里的环境变量是共享源容器的环境变量,连接的容器的环境变量不会被看到
-link 主要用于解决两个容器通过ip地址连接地址会变的问题
docker run -itd --name=test01 busybox
docker run -itd --name=test02 busybox
这个时候他们都是docker 0 分配的Ip地址
测试实验能否通
创建一个test03 link test01
docker run -itd --name=test03 --link test01 busybox
docker exec -it test03 /bin/sh
ping test01
# 但是test03是ping不通test02的容器名的,只能通Ip地址
博客测试
# 创建启动MySQL容器
docker run -itd --name db --restart=always -e MYSQL_ROOT_PASSWORD=redhat -e MYSQL_DATABASE=blog mysql:5.6
# 创建启动源容器word press
docker run -itd --name blog --restart=always -v /web:/var/www/html -p 80:80 --link db:mysql wordpress
登录宿主机的80
192.168.0.11:80
macvlan 容器跨主机通讯
macvlan 是Linux 内核模块,功能是允许同一物理网卡上配置多了mac地址
即 多个interface可以 配置自己的IP,macvlan本身是一种网卡虚拟化技术
macvlan最大的优点是性能好,不需要创建bridge
而是通过以太interface连接到物理网络
开启网卡混杂模式 11\12机器
ip link set ens160 promisc on
docker network create -d macvlan --subnet 192.168.20.0/24 --gateway 192.168.20.1 -o parent=ens160 macvlan1
docker run -itd --name bs1 --network macvlan1 --ip=192.168.20.2 busybox
docker run -itd --name bs2 --network macvlan1 --ip=192.168.20.3 busybox
ping ip 地址是通的,但是容器名是不通的
所以其实docker 没有为macvlan提供dns服务,这点与overlay网络不同