一 docker 网络模式
(1)基本网络配置
(2)高级网络配置
(3)网络解决方案进阶
二 原生网络
docker安装后会自动创建3种网络:bridge、host、none
# yum whatprovides */brctl-->brctl的工具!
# bridge-utils-1.5-9.el7.x86_64
docker network ls
524ffb6b9445 bridge bridge local # 桥接
e6fd58664b30 host host local # 仅主机
46f9825d487f none null local # 禁用网络
(1)bridge网络
说明:docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口
[root@docker1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242fc73f70c no # 说明:由于没有建立容器,所以没有接口
缺点:bridge模式下容器没有一个公有ip(缺点1),只有宿主机可以直接访问,外部主机是不可见的(缺点-->私有网络,内部隔离),但容器通过宿主机的NAT规则(地址转换)后可以访问外网。
说明:默认是桥接的方式,不需要指定!
说明:通过docker0接口的网关(gateway),然后进行路由转发(ip_forward)与宿主机通信!
虚拟网络对--->一根网线的两根,连接各自的namespace(网络命名空间)!
说明:docker安装的时候默认帮我们开启了路由转发!
SDN( Software Define Network),软件定义网络,用户不需要直接操作硬件,鼠标点一点,隔离了用户对于硬件的依赖!
(2)host模式
host网络模式需要在容器创建时指定--network=host,host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
说明:host模式是桥接模式的有力补充,即桥接模式下容器没有公共的IP(解决bridge的问题)!
缺点:宿主机和容器共享一份网络资源,端口不能冲突,使用一个网络命名空间,所以有资源争抢的问题!
[root@docker2 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.02427b9fda13 no
# 由于共享网络资源,所以没有接口(用bridge,会有接口)
说明:会引起安全问题,宿主机和网络机共享,不经过docker0!
host的其它好处:用localhost来访问!
host方式补充:容器间共享一个网络资源
Container 网络模式是 Docker 中一种较为特别的网络的模式,在容器创建时使用--network=container:connam指定
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
一个应用:不知道IP的情况下,这种模式容器之间可以通过localhost:3306(数据库)来访问,原来通过TCP,现在通过回环地址(lo)搞定,加快网络通信的速度!
(3)none模式
特点:是指禁用网络功能,只有lo接口,在容器创建时使用,--network=none指定。
容器特殊存在:生成token,存储一些敏感密码文件,不需要网络通信,必须做这些隔离!
[root@docker2 ~]# docker run -it --name vm2 --network=none ubuntu
root@eff58bc49e6e:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
root@eff58bc49e6e:/#
说明:没有网络,必须在本机,否则无法访问!
二 高级网络配置
(1)自定义网络模式,docker提供了三种自定义网络驱动:bridge、overlay、macvlan
1)bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,overlay和macvlan是用于创建跨主机网络。
建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。
自定义的桥接和默认原生的桥接区别:自定义内置DNS解析!
2)overlay
作用:应用层(开发人员),可以支持更多的虚拟子网,用于跨主机!
3)macvlan
作用:用在底层,二层(CT人员),通过物理接口(etho网卡),用在跨主机,运营开发商!
说明:作为PASS云的体系,不知道用户的体系,overlay和macvlan都有!
(2)创建网络
[root@docker2 ~]# docker network create my_net1
6f56371978a715ced6917edffccad05c9bff9fe735fff4df229671a897a534d7
[root@docker2 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
21e12cecf441 bridge bridge local
94120fcefcf0 host host local
6f56371978a7 my_net1 bridge local
0a9bf240468c none null local
容器之间除了使用ip通信外,还可以使用容器名称通信。
docker 1.10开始,内嵌了一个DNS server,dns解析功能必须在自定义网络中使用
docker引擎又自动给我们创建了桥接口,默认是动态单调递增的,释放后会回收!
需求:创建自定义网桥,指定网段和网关
说明:创建两个容器,并桥接到不同的网桥上,默认彼此是不通信的(隔离)!
补充:使用--ip参数可以指定容器ip地址,但必须是在自定义网桥上,默认的bridge模式不支持,同一网桥上的容器是可以互通的
docker在设计上就是要隔离不同network的
iptables -S
-A DOCKER-ISOLATION-STAGE-1 -i br-d39efc8fa01f ! -o br-d39efc8fa01f -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-6f56371978a7 ! -o br-6f56371978a7 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
需求:使不同网桥的进行通信
使用 docker network connect命令为vm1添加一块my_net2 的网卡
root@18c49c18bae4:/# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
20: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
22: eth1@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:1e:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.30.0.3/24 brd 172.30.0.255 scope global eth1
valid_lft forever preferred_lft forever
root@18c49c18bae4:/#
说明:又增加一块网卡(两个网段的IP)!
[root@docker2 ~]# brctl show
bridge name bridge id STP enabled interfaces
br-6f56371978a7 8000.0242a53d3aa3 no veth1a9ed7d
br-d39efc8fa01f 8000.02424ad6e5e1 no veth0edde9d
veth24cff9e
docker0 8000.02427b9fda13 no
实质:在 vm6中添加一个网卡(不同网段的IP)!
说明:容器之间其它的通信方式
--link是连接两个容器
说明:ctrl+(p|q)->打入后太 --->docker container attach vm1
注意:不要rm调容器!
说明:会把变量信息注册到当前的容器中!
link -->变量不变(解析变了),本地解析!-->比较私密的联系(变量的利用)!
link -->把关闭的容器,重新拉起来!
docker run -d --name nginx nginx:1.16
docker run -it --name vm1 --link nginx:web ubuntu # 说明:类似于起个别名!
cat /etc/hosts
env
#######################
docker container stop nginx # 注意是停止而不是删除
docker run -d nginx:1.16 # 说明:上面停止之后,会释放IP资源,所以这里开启一个先占用IP!
docker container start nginx # 把容器起起来
/etc/hosts发生变化! # IP发生变化,环境变量不变!
补充:容器如何访问外网是通过iptables的SNAT实现的
需求:外网如何访问容器----->选项指定映射端口(-p port:port)