目录
1.4 容器如何访问外网是通过iptables的SNAT实现的
1.单机容器通信
1.1 DNS
容器之间除了使用ip通信外,还可以使用容器名称通信。 docker 1.10开始,内嵌了一个DNS server。 dns解析功能必须在自定义网络中使用。 启动容器时使用 --name 参数指定容器名称。
1.2 Joined容器(类似于host模式)
- Joined容器一种较为特别的网络模式。 - 在容器创建时使用--network=container:vm1指定。(vm1指定的是运行的容器名) - 处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。
1.3 link
- --link 可以用来链接2个容器。 --link的格式: --link <name or id>:alias name和id是源容器的name和id,alias是源容器在link下的别名。
[root@server2 ~]# docker run -d --name demo nginx [root@server2 ~]# docker run -it --link demo:nginx busybox ##使用link可以查看demo上的数据,也会自动做解析。为busybox自动分配ip
查看hosts解析
有环境变量
1.4 容器如何访问外网是通过iptables的SNAT实现的
![]()
- 需要打开内核路由功能,即forward=1 容器通过真机内核进行地址伪装通信
1.5 外网如何访问容器
- 外网如何访问容器 - 端口映射 - -p 选项指定映射端口 - 外网访问容器用到了docker-proxy和iptables DNAT 宿主机访问本机容器使用的是iptables DNAT 外部主机访问容器或容器之间的访问是docker-proxy实现(删除docker-proxy只能通过直接访问ip) - proxy和DNAT只要存在一种就可以进行通讯,是一种双冗余设置,localhost使用docker-proxy转发
![]()
[root@server2 ~]# docker run -d --rm -p 80:80 nginx ##端口映射 [root@server2 ~]# netstat -antlp Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6394/docker-proxy
1.5.1 删除链DOCKER
删除iptables那么就通过proxy来访问
1.5.2 删除docker-proxy
同时关闭无法通信
iptables开着,杀掉proyx也可以访问。
2.跨主机容器网络(macvlan)
2.1 理论
- 跨主机网络解决方案 docker原生的overlay和macvlan - 第三方的flannel、weave、calico 众多网络方案是如何与docker集成在一起的 libnetwork docker容器网络库 CNM (Container Network Model)这个模型对容器网络进行了抽象 - CNM分三类组件 Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace) Endpoint:作用是将sandbox接入network (veth pair) Network:包含一组endpoint,同一network的endpoint可以通信。
2.2 macvlan网络方案实现
- Linux kernel提供的一种网卡虚拟化技术。(内核自带) 无需Linux bridge,直接使用物理接口,性能极好。 - 下面步骤的操作在截图中 - 在两台docker主机上各添加一块网卡,打开网卡混杂模式: - - 在两台docker主机上各创建macvlan网络: - - macvlan网络结构分析: 没有新建linux bridge 容器的接口直接与主机网卡连接,无需NAT或端口映射。 [root@server2 ~]# brctl show bridge name bridge id STP enabled interfaces br-283cf1fc96c1 8000.02426d0e4f33 no docker0 8000.024257e101e8 no - macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络 - vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,vlan id取值为1~4094。 - macvlan网络间的隔离和连通 macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的。 可以在三层上通过网关将macvlan网络连通起来。 docker本身不做任何限制,像传统vlan网络那样管理即可。
2.2.1 前期设置,设置俩个网卡
server1和server2都添加成俩个网卡
2.2.2 实现不同主机之间通信
##server1和server2同样的操作 [root@server1 ~]# ip link set up eth1 [root@server1 ~]# ip link set eth1 promisc on ##打开混杂模式PROMISC [root@server1 ~]# ip addr show eth1 36: eth1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:64:dd:fd brd ff:ff:ff:ff:ff:ff inet6 fe80::5054:ff:fe64:ddfd/64 scope link valid_lft forever preferred_lft forever [root@server1 ~]# docker network create -d macvlan --subnet 10.0.0.0/24 --gateway=10.0.0.1 -o parent=eth1 macvlan1 ##使用eth1网卡 [root@server1 ~]# docker inspect mac_net1 | grep "parent" "parent": "eth1" [root@server1 ~]# docker run -it --rm --network macvlan1 --ip 10.0.0.10 busybox
不设定IP时容器会自动获得ip会冲突
设定IP
2.2.3 两不同网段的容器之间相互通信
设定IP为192网段
demo1位192网段
demo2为10网段
给含有192网段的demo3添加一个10的network
3.docker network子命令
- docker network子命令 connect 连接容器到指定网络 create 创建网络 disconnect 断开容器与指定网络的连接 inspect 显示指定网络的详细信息 ls 显示所有网络 rm 删除网络