Docker 网络 host模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker 网络 host模式相关的知识,希望对你有一定的参考价值。

参考技术A 本文翻译自docker官网: https://docs.docker.com/network/host/

If you use the host network mode for a container, that container's network
stack is not isolated from the Docker host (the container shares the host's
networking namespace), and the container does not get its own IP-address allocated.
For instance, if you run a container which binds to port 80 and you use host
networking, the container's application is available on port 80 on the host's IP
address.

Host mode networking can be useful to optimize performance, and in situations where
a container needs to handle a large range of ports, as it does not require network
address translation (NAT), and no "userland-proxy" is created for each port.

The host networking driver only works on Linux hosts, and is not supported on
Docker Desktop for Mac, Docker Desktop for Windows, or Docker EE for Windows Server.

You can also use a host network for a swarm service, by passing --network host
to the docker service create command. In this case, control traffic (traffic
related to managing the swarm and the service) is still sent across an overlay
network, but the individual swarm service containers send data using the Docker
daemon's host network and ports. This creates some extra limitations. For instance,
if a service container binds to port 80, only one service container can run on a
given swarm node.

Docker 网络:host模式

本文转自https://www.freeaihub.com/article/host-module-in-docker-network.html,该页可在线运行

技术图片

当我们准备将Docker技术应用到生产级别的场景时,我们需要了解很多网络方面的知识。网络是Docker中相对比较薄弱的部分,我们有必要了解Docker的网络知识,以满足更高的网络需求。本节先对Docker网络模型中的host模型进行理论介绍,再通过案例的实操,让您更好地去理解docker网络模型。

Docker网络

当你安装完Docker时,它会自动创建三个网络。你可以使用以下docker network ls命令列出这些网络:

docker network ls

结果应如下

NETWORK ID          NAME                DRIVER              SCOPE
594430d2d4bb        bridge              bridge              local
d855b34c5d51        host                host                local
b1ecee29ed5e        none                null                local

Docker内置这三个网络,运行容器时,你可以使用该来指定容器应连接到哪些网络。

我们在使用docker run创建Docker容器时,可以用--network标志 选项指定容器的网络模式,Docker有以下4种网络模式:

host模式:使用 --net=host 指定。

none模式:使用 --net=none 指定。

bridge模式:使用 --net=bridge 指定,默认设置。

container模式:使用 --net=container:NAME_or_ID 指定。

host模式

Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的Network Namespace隔离。

host模式类似于Vmware的桥接模式,与宿主机在同一个网络中,但没有独立IP地址。一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

如下图所示:容器与主机在相同的网络命名空间下面,使用相同的网络协议栈,容器可以直接使用主机的所有网络接口

技术图片

案例验证

查看主机链路接口

ip a

我们右侧云环境主机的IP为{host0.ip}/24上用host模式启动nginx容器,监听它的tcp80端口。

使用--net host参数来指定网络模型使用host模式

docker run --name=nginx --net=host -p 80:80 -d nginx

查看容器链路接口,与主机一致

docker exec -it nginx cat /etc/hosts

这时外界要访问容器中的应用,则直接使用{host0.ip}:80即可,不用任何NAT转换,就像直接跑在宿主机中一样。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

curl {host0.ip}

总结

host 模式简单并且性能高,host 模式下面的网络模型是最简单和最低延迟的模式,容器进程直接与主机网络接口通信,与物理机性能一致,host 不利于网络自定配置和管理,并且所有主机的容器使用相同的IP。也不利于主机资源的利用。对网络性能要求比较高,可以使用该模式。否则应该使用其他模式

以上是关于Docker 网络 host模式的主要内容,如果未能解决你的问题,请参考以下文章

Docker——网络配置

Docker 网络:container模式

详解Docker的网络模式

Docker(十四)-Docker四种网络模式

docker: 四种网络模式

Docker网络模式