目录
前言
?一、docker的原生网络
?1、bridge
2、host网络
3、none网络
二、docker自定义网络
1、docker自定义网络
?
?
?
2、创建自定义网桥
3、让不同子网能通信
前言
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
?一、docker的原生网络
server2:
docker network ls ?#docker的原生网络【共有三个】
ip addr #docker安装后有一个docker0的桥接口
yum install -y ?bridge-utils
brctl show
?1、bridge
【没有一个公有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
2、host网络
【可以让容器共享网络,外部主机与容器直接通信,但是网络缺少隔离性】
【宿主机和容器共享相同网络,宿主机如果占了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
?
3、none网络
【指禁用网络功能,只有lo接口】
docker run -it --rm --network none busybox #启动
--/ # ls
--/ # ip addr ?#只有回环接口,没有网络接口
二、docker自定义网络
【这里的bridge和默认的bridge网络模式有区别,在于有无dn解析】
?
1、docker自定义网络
docker network ls
docker ps
docker rm -f demo?
docker run -it --rm --name demo busybox
--/ # ping demo
?【容器ip是动态单调递增的,但是不固定】
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通
2、创建自定义网桥
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
3、让不同子网能通信
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
*两个都能连通
?
|