Docker网络管理及容器跨主机通信(四)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介:

1、网络模式

docker支持四种网络模式,使用--net选项指定:

  • host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而是和宿主机共用一个。容器将不会虚拟出自己的网卡,IP等,而是使用宿主机的IP和端口,也就是说如果容器是个web,那直接访问宿主机:端口,不需要做NAT转换,跟在宿主机跑web一样。容器中除了网络,其他都还是隔离的。

  • container,--net=container:NAME_or_ID,与指定的容器共同使用网络,也没有网卡,IP等,两个容器除了网络,其他都还是隔离的。

  • none ,--net=none,获得独立的network namespace,但是,并不为容器进行任何网络配置,需要我们自己手动配置。

  • bridge,--net=bridge,默认docker与容器使用nat网络,一般分配IP是172.17.0.0/16网段,要想改为其他网段,可以直接修改网桥IP地址,例如:

  $ sudo ifconfig docker0 192.168.10.1 netmask 255.255.255.0


2、容器默认网络配置过程

先创建一个docker0的网桥,使用Veth pair创建一对虚拟网卡,一端放到新创建的容器中,并重命名eth0,另一端放到宿主机中,以veth+随机7个字符串名字命名,并将这个网络设备加入到docker0网桥中,网桥自动为容器分配一个IP,并设置docker0的IP为容器默认网关。同时在iptables添加SNAT转换网桥段IP,以便容器访问外网。

Veth par是用于不同network namespace间进行通信的方式,而network namespace是实现隔离网络。


3、容器桥接宿主机网络

关闭docker并设置桥接模式:

$ sudo apt-get install bridge-utils

$ sudo service docker stop

#关闭默认网桥

$ sudo ip link set dev docker0 down

#删除默认网桥

$ sudo brctl delbr docker0

创建桥接网卡:

$ sudo brctl addbr br0    #创建网桥

$ sudo vi /etc/network/interfaces #将原有宿主机IP配置到新创建的网桥上

1
2
3
4
5
6
7
8
auto  eth0
iface eth0 inet manual
auto  br0
iface br0 inet static
     address 192.168.10.10    #宿主机IP
     netmask 255.255.255.0
     gateway 192.168.10.1
     dns-nameservers 192.168.10.1

$ sudo /etc/init.d/networking restart

重启网卡后,再通过ifconfig命令查看,多了br0网桥,并且IP地址也绑定在了上面。

#修改docker桥接网桥,并重启

$ sudo  vi /etc/default/docker

DOCKER_OPTS="-b=br0"

$ sudo service docker restart

接下来启动一个容器,先不配置网络信息:

$ sudo docker run -itd --name=ubuntu_test --net=none ubuntu  


不配置ip的原因是:容器启动后自动随机分配一个网桥段的IP,这个IP不管你宿主机网络中是否已经分配,它都会根据自身的算法来分配IP,docker有自己的一套分配算法。
所以既然选择桥接网络,就要事先规划好IP分配。


4、创建容器没配置网络,该怎么配置呢?

pipework是一个LXC网络管理工具,用shell写的,有200多行代码。可以给容器配置固定IP地址:

$ git clone https://github.com/jpetazzo/pipework.git

$ sudo cp pipework/pipework /usr/local/bin/

$ sudo pipework br0 ubuntu_test 192.168.18.29/24@192.168.18.1

Warning: arping not found; interface may not be immediately reachable

这一步是给配置容器网络并连接网桥,@左边是与宿主机同网段IP,右边是网关。

提示arping命令没发现,可以通过apt-get install arping来安装。

$ sudo brctl show   #查看虚拟网卡veth开头的已加入网桥

$ sudo docker attach ubuntu_test  

#进入容器用ifconfig命令查看,IP信息已经配置上,通过ping百度及同网段IP是相通的,配置成功。

pipework工具怎么实现配置的IP呢?

pipework是通过ip netns exec进入容器的net命名空间,来配置容器net命名空间的网络参数。


博客地址:http://lizhenliang.blog.51cto.com


5、简单讲下怎么SSH连接容器

根据上面的配置后,简单配置下SSH服务即可实现SSH远程登录:

#进入容器

$ sudo docker attach ID/NAME

#安装SSH

$ sudo apt-get update

$ sudo apt-get install openssh-server

#修改SSH配置文件(/etc/ssh/sshd_config)

PermitRootLogin yes   #运行root登录

UsePAM no   #不使用验证模块

#启动SSH

/etc/init.d/ssh restart

#查看是否启动成功

ps -ef |grep ssh

此时已经可以像连接虚拟机那样SSH连接容器了!


在docker默认网络模式情况下,由于容器是docker分配docker0网段的IP,这时又该怎么SSH连接容器呢?

当创建新容器时有选项可以指定宿主机到容器端口,那就是-p选项。

例如:$ sudo docker run -itd --name=ubuntu_test -p 2222:22 ubuntu  

2222是宿主机端口,22是容器内部ssh服务端口。这样就可以通过"ssh -p 2222 root@宿主机IP"连接容器了。不但ssh服务可以这样做,比如web、mysql等服务也同样方式实现容器对外提供服务。

当使用-p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看,出现最下面的一条记录:

wKiom1aL3TSTH2kxAAB-E013mgY294.png

知道了docker容器网络通信原理,那么,就可以自定义添加规则实现端口映射。

例如:将来自宿主机的2222端口转发到容器的22端口

1
sudo  iptables -t nat -A PREROUTING -d 192.168.18.231 -p tcp --dport 2222 -j DNAT --to 172.17.0.1:22


6、容器跨主机通信

由于docker自身还未支持跨主机容器通信,需要借助docker网络开源解决方案。这里利用OpenVSwich即开放式虚拟交换机实现,简称OVS,OVS在云计算领域应用广泛,值得我们去学习使用。

什么是OpenVSwich?

OpenVSwich是一种开源软件,通过软件的方式实现二层交换机功能,专门管理多租赁云计算网络环境,提供虚拟网络中的访问策略、网络隔离、流量监控等。

既然是虚拟交换机,自然与传统的物理交换机有着相同的特性,操作中可以按照理解物理交换机的方式去操作,有助于对虚拟交换机的认识。

实验环境:

操作系统:ubuntu14.04_x64

宿主机1:192.168.18.16  容器网段:172.17.1.0/24

宿主机2:192.168.18.17  容器网段:172.17.2.0/24

开始创建网络环境(两台宿主机做相同的操作,部分要适当修改,已注明):

#安装openvswitch

$ sudo apt-get install openvswitch-switch bridge-utils

#添加网桥obr0(理解为添加了一个交换机)

$ sudo ovs-vsctl add-br obr0

#将gre0接口加入到网桥obr0, 远程IP写对端IP(创建一个GRE隧道并添加到网桥中)

1
sudo  ovs-vsctl add-port obr0 gre0 --  set  Interface gre0  type =gre options:remote_ip=192.168.18.17

#查看ovs信息

$ sudo ovs-vsctl show

wKioL1aL3ZyQ83sCAAAaNGk5sqk641.png

#添加docker网桥

$ sudo brctl addbr kbr0

#将obr0网桥加入kbr0网桥,并启动

$ sudo brctl addif kbr0 obr0

$ sudo ip link set dev kbr0 up

#查看网桥信息

$ sudo brctl show

wKiom1aL3YTBxyGlAAAJtsMwrmo154.png

#添加docker网桥配置信息(18.17宿主机按照这种方式配置自己)

$ vi /etc/network/interfaces

1
2
3
4
5
6
7
8
9
10
11
auto eth0
iface eth0 inet static
     address 192.168.18.16
     netmask 255.255.255.0
     gateway 192.168.18.1
     dns-nameservers 192.168.18.1
auto kbr0
iface kbr0 inet static        
     address 172.17.1.1
     netmask 255.255.255.0
     gateway 172.17.1.0

#删除默认docker网桥

$ sudo ip link set dev docker0 down

$ sudo ip link delete dev docker0

#关键一点,添加路由条目,否则无法通讯(同样在18.17上面这样添加路由,写对端IP)

#via从哪个网关出去,写对端IP。dev由哪个设备出去

$ sudo ip route add 172.17.2.0/24 via 192.168.18.17 dev eth0  


至此容器跨主机通信配置完成,两边各创建一个容器来验证吧!


里面涉及到一个GRE隧道,什么是GRE隧道呢?

GRE即通用路由协议封装,隧道技术是一种封装技术,将网络层协议(如IP)的数据报文进行封装,使这些封装的数据报文能够在另一个网络层协议中传输。可以看作是一个虚拟点到点连接,所以建立隧道时,要配置好隧道源地址和目的地址。


另外,weave也可以实现跨主机容器通信,也是类似于一个网络交换机,配置简单,有兴趣朋友可以了解下。


目录
相关文章
|
10天前
|
Shell Linux Docker
docker常用命令大全(基础、镜像、容器、数据卷)
这些命令仅仅是 Docker 命令行工具的冰山一角,但对于日常操作来说已经非常全面。通过熟练地使用这些基础命令,用户可以有效地管理 Docker 的镜像、容器、数据卷和网络。随着用户对 Docker 的深入使用,更高级的命令和选项将会变得必需,但上面列出的命令已经为用户提供了一个坚实的起点。对于初学者来说,理解和掌握这些常用命令是深入学习 Docker 的基础。
110 5
docker常用命令大全(基础、镜像、容器、数据卷)
|
1天前
|
存储 应用服务中间件 开发工具
docker compose 容器编排
docker compose 容器编排
|
2天前
|
持续交付 云计算 开发者
Docker容器技术在软件开发中的应用
【7月更文挑战第25天】Docker容器技术凭借其轻量级、可移植和高效的特点,在软件开发中发挥着越来越重要的作用。通过容器化技术,开发者可以更加方便地构建、部署和管理应用程序,提高开发效率和应用程序的可靠性。随着云计算和现代应用开发的不断发展,Docker容器技术将在更多领域得到广泛应用,为企业的数字化转型提供有力支持。
|
7天前
|
Ubuntu Devops 云计算
ubuntu docker-compose编排容器并且设置自启动
使用Docker Compose编排容器并设置为Ubuntu系统的自启动服务,不仅优化了应用的部署流程,也提升了运行时的可管理性和可靠性。通过上述步骤,您可以轻松实现这一目标。维护此类服务时,记得定期检查和更新您的 `docker-compose.yml`文件,确保所有的服务都符合当前的业务需求和技术标准。在云计算和微服务架构不断演进的今天,掌握Docker Compose等工具对于DevOps和软件工程师来说,变得尤为重要。
24 3
|
12天前
|
Docker Python 容器
容器化技术,特别是Docker,已经成为现代软件开发和部署的重要工具。
容器化技术,特别是Docker,已经成为现代软件开发和部署的重要工具。
|
12天前
|
Kubernetes 持续交付 开发者
微软Azure云上部署Docker容器的技术实践
【7月更文挑战第15天】Docker与Azure的集成,为开发者提供了一种快速、可扩展和可维护的应用部署方式。通过在Azure平台上部署Docker容器,开发者可以充分利用Azure丰富的云服务和强大的基础设施,实现应用的快速迭代和高效运行。未来,随着Docker和Azure的不断发展和集成,我们可以期待更加便捷和高效的容器化应用部署体验。
|
11天前
|
弹性计算 运维 应用服务中间件
容器的优势,在Docker中运行Tomcat
摘要:了解Docker与虚拟机的区别:虚拟机使用Hypervisor创建完整操作系统,而容器通过namespace和cgroup实现轻量级隔离,共享主机内核。Docker启动快、资源利用率高,适合快速部署和跨平台移植。但安全性相对较低。示例介绍了如何通过Docker搜索、拉取官方Tomcat镜像并运行容器,最后验证Tomcat服务的正常运行。
|
11天前
|
安全 网络协议 云计算
Docker容器网络配置详解
【7月更文挑战第16天】Docker的网络配置是实现容器间以及容器与外部网络通信的基础。通过选择合适的网络模式和配置选项,可以构建高效、安全、可扩展的Docker网络解决方案。
|
11天前
|
Java Scala 流计算
实时计算 Flink版产品使用问题之Docker镜像中的Java路径和容器内的Java路径不一致,是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
12天前
|
运维 Ubuntu Docker
Docker镜像和容器使用
【7月更文挑战第2天】Docker 概要:Docker 镜像是只读模板,包含运行应用的环境和代码,像蓝图一样。构建镜像可通过基于现有镜像(如 Ubuntu)安装软件后提交,或使用 Dockerfile 定义构建过程。Docker 容器是镜像的运行时实例,`docker run` 命令可创建并运行容器。常用容器操作包括启动/停止、状态检查和交互式进入。通过端口映射,容器服务可从主机访问,促进应用部署和管理的便捷性。