1. 使用主机网络
如果您使用容器的主机网络模式,那么容器的网络堆栈不会与 Docker 主机隔离(容器共享主机的网络名称空间) ,并且容器不会得到自己的 ip 地址分配。 例如,如果您运行一个绑定到端口80的容器,并且使用主机网络,那么容器的应用程序在端口80的主机 IP 地址上是可用的。
注意: 当使用主机模式网络时,容器没有自己的 ip 地址,因此端口映射不生效,并且忽略
-p
、--publish
、-P
和--publish-all
选项,从而产生一个警告:WARNING: Published ports are discarded when using host network mode
主机模式网络对于优化性能非常有用,并且在容器需要处理大范围的端口的情况下,因为它不需要网络地址转换(NAT) ,也不会为每个端口创建“ userland-proxy”。
主机网络驱动程序只能在 Linux 主机上工作,而且不支持 Mac 版的 Docker Desktop,Windows 版的 Docker Desktop,或 Windows 服务器版的 Docker EE。
您还可以为群服务使用一个主机网络,方法是将 --network host
传递给 docker service create
命令。 在这种情况下,控制流量(与管理群和服务相关的流量)仍然通过覆盖网络发送,但是各个群服务容器使用 Docker 守护进程的主机网络和端口发送数据。 这就产生了一些额外的限制。 例如,如果一个服务容器绑定到端口80,那么在给定的群节点上只能运行一个服务容器。
2. 实践练习 主机网络
2.1 目标
本练习涉及处理网络独立容器,直接绑定到 Docker 主机的网络,没有网络隔离。
实践目标是启动一个直接绑定到 Docker 主机上的端口80的 nginx 容器。 从网络的角度来看,这与 nginx 进程直接在 Docker 主机而不是容器中运行的隔离级别是相同的。 但是,在所有其他方面,例如存储、流程名称空间和用户名称空间,nginx 流程都与主机隔离。
2.2 前提条件
此过程要求在 Docker 主机上可以使用端口80。 要让 Nginx 在另一个端口上侦听,请参阅 Nginx 映像的文档
主机网络驱动程序只能在 Linux 主机上工作,而且不支持 Mac 版的 Docker Desktop,Windows 版的 Docker Desktop,或 Windows 服务器版的 Docker EE。
2.3 实践
创建并启动容器作为一个分离的进程。
--rm
选项意味着在容器退出 / 停止时删除它。-d
标志意味着启动分离的容器(在后台)。docker run --rm -d --network host --name my_nginx nginx
访问 Nginx 服务 通过网页浏览器 浏览 http://localhost:80/ 。
使用以下命令检查网络堆栈:
使用以下命令检查网络堆栈:
ip addr show
使用 netstat 命令验证哪个进程绑定到端口80。 您需要使用 sudo,因为进程属于 Docker 守护进程用户,否则您将无法看到它的名称或 PID。
sudo netstat -tulpn | grep :80
停止容器。当它使用
--rm
选项启动时,它将被自动删除。docker container stop my_nginx