企业运维实战--最全Docker学习笔记3.Docker网络知识详解
前言
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
网络模式 | 含义 |
---|---|
–network host | 容器与真实主机共享IP和端口 |
–network none | 指定关闭容器的网络功能,只保留内部的回环接口 |
birdge | 桥接模式会为每一个容器分配IP,容器通过docker0网桥以及iptables nat表配置与真实主机通信 |
container | 容器与另外一个容器共享IP和端口 |
一、Docker网络
1.原生网络
关掉harbor仓库
docker-compose stop
查看docker版本
docker version
查看原生网络
docker network ls
自动生成桥接docker0
ip addr show docker0
安装查看桥街工具
yum install -y bridge-utils
brctl show
查看docker0桥接
brctl show docker0
启动容器会生成虚拟网卡,自动分配ip
docker run -d --name demo nginx
brctl show
删除容器,虚拟网卡释放
docker rm -f demo
brctl show
–network host 表示虚拟机与宿主机同时使用IP和端口。不会生成虚拟网卡。
docker run -d --name demo --network host nginx
brctl show docker0
查看已经启动的nginx80端口
netstat -antlp
由于端口冲突,所以demo2无法启动
docker run -d --name demo2 --network host nginx
docker ps
删除测试容器,释放80端口
docker rm demo2
docker rm demo
docker rm -f demo
netstat -antlp
–network none指定关闭容器的网路功能,只留下回环接口。
docker run -it --rm --network none busybox
当容器停掉时,资源会释放,重新启动按照启动顺序分配动态ip
docker run -d --name demo1 nginx
docker run -d --name demo2 nginx
docker ps
docker inspect demo1
docker inspect demo2
关闭demo1、demo2,再重启,启动顺序为先demo2后demo1
docker stop demo1
docker stop demo2
docker start demo2
docker start demo1
再次查看demo1和demo2的网卡IP
docker inspect demo1
docker inspect demo2
2.自定义网络
自定义网络网桥mynet1
docker network create mynet1
docker network ls
使用自定义桥接拉起容器demo1,镜像为nginx,查看配置IP
docker run -d --name demo1 --network mynet1 nginx
ip addr
再次使用自定义桥接拉起容器busybox,查看IP
docker run -it --rm --network mynet1 busybox
终端中—ping demo1,可以ping通,内置DNS自动做了解析
自定义网段和ip
创建生成自定义ip和网关的网桥mynet
docker network create --subnet 172.30.0.0/24 --gateway 172.30.0.1 mynet1
使用mynet1拉起nginx,容器名为demo
docker run -d --name demo --network mynet1 --ip 172.30.0.9 nginx
查看分配的IP
docker inspect demo # 或者nginx的ID docker inspect 4ceceb1799d1
再次使用创建的桥接拉起容器busybox
docker run -it --rm --network mynet1 busybox
ip addr #如果不指定,则动态分配IP
终端中可以ping通demo
容器添加双网卡实现彼此不同网段通信
按照之前的操作,不同网桥分配的IP网段是不同的,所以彼此之间也不能通信。
创建两个网卡mynet1、mynet2
docker network create --subnet 172.30.0.0/24 --gateway 172.30.0.1 mynet1
docker network create --subnet 172.31.0.0/24 --gateway 172.31.0.1 mynet2
使用mynet1网卡,拉起容器nginx
docker run -d --name demo --network mynet1 --ip 172.30.0.10 nginx
查看demo容器ip
docker inspect demo
使用mynet1拉起容器busybox,查看分配的ip
docker run -it --rm --network mynet1 busybox
ip addr
ctrl+p+q 将终端退出
为demo添加第二个网卡
docker network connect mynet2 demo
#查看demo网卡信息
docker insoect demo
#有两条网卡信息
再次打开后台的busybox,发现可以ping通demo。
3.容器通信
从docker1.10版本开始,内嵌了DNS server,自带DNS解析功能。
在容器创建时使用–network=container:v1指定
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
–link 可以用来链接2个容器,格式
--link <name or id>:alias
name和id是源容器的name和id,alias是源容器在link下的别名。
容器如何访问外网是通过iptables的SNAT实现的。
外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现
4.跨主机容器网络–macvlan
macvlan网络方案实现
Linux kernel提供的一种网卡虚拟化技术。
无需Linux bridge,直接使用物理接口,性能极好。
打开网卡混杂模式
ip link set eth0 promisc on
ip addr show eth0
使用macvlan 创建网卡macvlan1,-o指定物理网卡
docker network create -d macvlan --subnet 172.30.0.0/24 --gateway 172.30.0.1 -o parent=eth0 macvlan1
查看macvlan1信息
docker network inspect macvlan1
使用macvlan1拉起busybox容器,指定ip
docker run -it --rm --network macvlan1 --ip 172.30.0.10 busybox
server2虚拟机与server1操作相同
ip link set eth0 promisc on
ip addr show eth0
docker network create -d macvlan --subnet 172.30.0.0/24 --gateway 172.30.0.1 -o parent=eth0 macvlan1
docker run -it --rm --name demo2 --network macvlan1 --ip 172.30.0.11 busybox
server1中可以ping通demo2。
macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
vlan可以将物理二层网络划分为4096个逻辑网络,彼此隔离.
添加新的网卡eth1,开启混杂模式
ip link set up eth1
ip link set eth1 promisc on
ip addr show eth1
使用vlan子接口,-o parent=eth1.1
docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=eth1.1 macvlan2
server2操作与server1相同,分别打开一个终端,可以ping通。