Docker网络


Docker网络:

原生网络

[root@localhost ~]# docker  network  ls
NETWORK ID          NAME                DRIVER              SCOPE
fcc280741b01        bridge              bridge              local
9c09e5a698dc        host                host                local
03411a6d716c        none                null                local

点击并拖拽以移动

None:什么都没有的网络

[root@localhost ~]# docker run  -itd  --name  none  --network none  busybox:latest
[root@localhost ~]# docker exec  -it  none  /bin/sh

点击并拖拽以移动

PS:用到None网络的容器,会发现它只有一个LoopBack回环的网络,没有Mac地址、IP等信息,意味着它不能跟外界通信,是被隔离起来的网络

使用场景:

隔离意味着安全,所以,此网络可以运行一些关于安全方面的验证码、校验码等服务

Bridge:桥接网络

[root@localhost ~]# brctl  show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.02428e69e324	no		
virbr0		8000.525400547d41	yes		virbr0-nic

点击并拖拽以移动

docker0:在我们安装docker这个服务的时候,默认就会生产一张docker0的网卡,一般默认IP为172.17.0.1/16

[root@localhost ~]# docker run  -itd  --name  test1 busybox:latest 
[root@localhost ~]# docker  exec  -it  test1   /bin/sh

点击并拖拽以移动

容器默认使用的网络是docker0网络,docker0此时相当于一个路由器,基于此网络的容器,网段都是和docker0一致的

自定义网络

自带了一个ContainerDNSserver功能(域名解析)

bridge

//创建一个bridge网络:

[root@localhost ~]# docker network create -d  bridge my_net

点击并拖拽以移动

//创建两个容器,应用自定义网络(my_net):

[root@localhost ~]# docker  run  -itd  --name  test3  --network  my_net  busybox:latest
[root@localhost ~]# docker  run  -itd  --name  test4  --network  my_net  busybox:latest

点击并拖拽以移动

PS:自定义网络优点,它可以通过容器的名称通信

[root@localhost ~]# docker exec  -it  test3  /bin/sh
/ # ping test4

点击并拖拽以移动

//创建一个自定义网络,并且指定网关和网段

[root@localhost ~]# docker  network  create -d  bridge  --subnet  172.20.16.0/24 --gateway 172.20.16.1 my_net2

点击并拖拽以移动

//创建两个容器,应用自定义网络(my_net2),并指定IP

[root@localhost ~]# docker  run  -itd  --name  test5  --network  my_net2  --ip  172.20.16.6  busybox:latest
[root@localhost ~]# docker  run  -itd  --name  test6  --network  my_net2  --ip  172.20.16.8  busybox:latest

点击并拖拽以移动

PS:如果想要给容器指定IP地址,那么自定义网络的时候,必须指定网关gateway和subnet网段选项

//实现不同网段之间的通信,在容器里再添加一块网卡:

[root@localhost ~]# docker network connect my_net2  test4

点击并拖拽以移动

img点击并拖拽以移动

让外网能够访问容器的端口映射方法:

1)手动指定端口映射关系:

[root@localhost ~]# docker run  -itd  --name  web1  -p  90:80 nginx:latest

点击并拖拽以移动

2)从宿主机随机映射端口到容器:

[root@localhost ~]# docker run  -itd  --name   web2  -p  80  nginx:latest

点击并拖拽以移动

3)从宿主机随机映射端口到容器,容器内所有暴露的端口,都会一一映射

[root@localhost ~]# docker run  -itd  --name  web4  -P  nginx:latest

点击并拖拽以移动

join容器:container(共享网络协议栈)

容器和容器之间

[root@localhost ~]# docker run  -itd  --name  web5  busybox:latest
[root@localhost ~]# docker run  -itd  --name  web6  --network  container:web5  busybox:latest

点击并拖拽以移动

[root@localhost ~]# docker exec  -it   web6  /bin/sh
/ # echo  123456  >  /tmp/index.html
/ # httpd  -h  /tmp/

点击并拖拽以移动

[root@localhost ~]# docker exec  -it  web5  /bin/sh
/ # wget  -O  -  -q  127.0.0.1
123456

点击并拖拽以移动

//这时会发现,两个容器的IP地址一样

PS:这种方法的使用场景:

由于这种网络的特殊特性,一般在运行同一个服务,并且合格服务需要做监控,已经日志收集、或者网络监控的时候,可以选择这种网络

docker的跨主机网络解决方案

overlay(覆盖)的解决方案:

实验环境:

docker01:192.168.1.70

docker02:192.168.1.60

docker03:192.168.1.50

暂时不考录防火墙和selinux安全问题

将3台dockerhost防火墙和selinux全部关闭,并分别更改主机名称

[root@localhost ~]# hostnamectl   set-hostname  docker01
[root@localhost ~]# su -
[root@docker01 ~]# systemctl  stop  firewalld
[root@docker01 ~]# setenforce  0
[root@docker01 ~]# systemctl  disable  firewalld

点击并拖拽以移动

在docker01上操作:

//运行consul服务:(数据中心–分布式的)

[root@docker01 ~]# docker load  <  myprogrium-consul.tar
[root@docker01 ~]# docker run  -d  -p  8500:8500  -h  consul  --name  consul  \  
> --restart  always  progrium/consul  -server  -bootstrap

点击并拖拽以移动

PS:容器产生之后我们可以通过浏览器访问consul服务,验证consul服务是否正常,访问dockerHost加映射端口

img点击并拖拽以移动

修改docker02和docker03的docker配置文件:

//将IP和端口的映射关系,写入consul

[root@docker02 ~]# vim  /usr/lib/systemd/system/docker.service
修改:
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.70:8500 --cluster-advertise=ens33:2376

点击并拖拽以移动

PS:返回浏览器consul服务界面,找到KEY/VALUE—->Docker—->NODES,会看到刚刚加入的docker02和docker03的信息

img点击并拖拽以移动

img点击并拖拽以移动

img点击并拖拽以移动

在docker02上创建一个自定义网络:

[root@docker02 ~]# docker network  create  -d  overlay  ov_net1
[root@docker02 ~]# docker network  ls
NETWORK ID          NAME                DRIVER              SCOPE
fe92a0eff6a4        ov_net1             overlay             global

点击并拖拽以移动

在docker02上创建网络,我们可以看到它的SCOPE定义的时global(全局),意味着加入到consul这个服务的docker服务,都可以看到我们自定义的网络

同理如果是用此网络创建的容器,会有两张网卡,默认这张网卡是10.0.0.0网段,如果想要docker01也可以看到这个网络,那么也只需在docker01的docker配置文件添加相应内容即可

同理,因为是自定义网络,符合自定义网络的特性,可以直接通过docker容器的名称互相通信,当然也可以在自定义网络的时候,指定它的网段,那么使用此网络的容器也可以指定IP地址

img点击并拖拽以移动


文章作者:Echo
版权声明:本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Echo !
  目录