目录
前言
一、docker的原生网络
1、bridge
2、host网络
3、none网络
二、docker自定义网络
1、docker自定义网络
2、创建自定义网桥
3、让不同子网能通信
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
server2:
docker network ls #docker的原生网络【共有三个】
ip addr #docker安装后有一个docker0的桥接口
yum install -y bridge-utils
brctl show
【没有一个公有ip只有宿主机可以直接访问】
docker run -d --name demo nginx #开启一个容器
docker inspect demo
#可以看到容器已经被分到一个ip地址【docker0网络端默认地址是172.17】
##注意ip分配是单调递增的
brctl show
#所有容器内部网关都会指向docker0的接口
docker run -it --rm busybox
--/ # ping baidu.com #可以看到通信
iptables -t nat -nL #有一个伪装
【容器通过桥接到达宿主机,宿主机通过linux陆游功能到达eth0出去,出去做了伪装】
docker run -it --rm --network host busybox
--/ # ip addr
【可以让容器共享网络,外部主机与容器直接通信,但是网络缺少隔离性】
【宿主机和容器共享相同网络,宿主机如果占了80端口,那么容器就不能占用】:
brctl show
docker ps
docker rm -f demo
docker run -d --name demo --network host nginx
docker run -d --name demo2 --network host nginx
docker ps
#发现demo2没有运行
docker ps -a
#可以看到demo2已经退出
docker logs demo2
#查看demo2的日志:80端口已经被占用
docker rm -f demo2
【指禁用网络功能,只有lo接口】
docker run -it --rm --network none busybox #启动
--/ # ls
--/ # ip addr #只有回环接口,没有网络接口
【这里的bridge和默认的bridge网络模式有区别,在于有无dn解析】
docker network ls
docker ps
docker rm -f demo
docker run -it --rm --name demo busybox
--/ # ping demo
docker run -d --name demo1 nginx
docker inspect demo1 #ip为0.2
docker stop demo1 #停掉demo1
docker run -d --name demo2 nginx #创建demo2
docker inspect demo2 #ip为0.2
*因为demo1是停止的资源是释放状态
docker ps
docker start demo1 #开启demo1
docker ps
docker inspect demo1 #可以看到ip是0.3
docker run -it --rm --name demo3 busybox #创建demo3
--/ # ping demo3 #ping不通
--/ # ping demo2
--/ # ip addr #没有dn解析ping不通,但是能获得ip地址
--/ # ping 172.17.0.3 #ip可以ping通
docker ps
docker rm -f demo1
docker rm -f demo2 #删掉多余容器
docker network ls
docker network create --help
docker network create mynet1
docker network ls #默认是桥接
docker network inspect mynet1 #查看mynet详情
ip addr show docker0
docker network create --subnet 172.10.0.0/24 --gateway 172.10.0.1 mynet2
#指定网段,不能和本机所有网段冲突
docker network ls
docker network inspect mynet2
docker run -d --name demo1 --network mynet1 --ip 172.18.0.10 nginx #报错,不支持指定ip【自动分配不能手动指定】
docker ps -a
docker rm demo1
docker run -d --name demo1 --network mynet2 --ip 172.10.0.10 nginx #mynet2可以指定
docker inspect demo1
docker run -d --name demo2 --network mynet1 nginx
docker ps
docker inspect demo1 #demo1在mynet2里
docker inspect demo2 #demo2在mynet1里
docker run -it --rm --network mynet1 busybox
*注意不同的子网之前网络不通,是docker网络隔离作用
--/ # ping demo1
--/ # ping demo2
docker run -it --rm --network mynet2 busybox
--/ # ping demo1
--/ # ping demo2
iptables -nL
docker ps
docker network ls
docker run -it --name demo3 --network mynet1 busybox
--/ # ping demo1
--/ # ping demo2
--/ # ip addr
按住ctrl+p+q【不退出】
docker ps
docker network connect mynet2 demo3 #把demo3接到mynet2里【默认接到mynet1】
docker attach demo3 #进入demo23
--/ # ip addr *可以看到有两个网卡
--/ # ping demo1
--/ # ping demo2
*两个都能连通