(五)docker环境中配置hosts
目录
1. 三种方法配置hosts文件以实现域名解析
1.1 启动容器时加上“—add-host”参数
1.2 通过docker-compose配置extra_hosts属性
1.3 通过k8s管理容器时配置hostAliases
2. 解析openwebui中的host.docker.internal及 host-gateway
2.1 host.docker.internal
2.2 host-gateway
2.3 使用场景
2.4 使用方法
2.4.1 命令行配置
2.4.2 Docker Compose 配置
2.4.3 代码中直接访问
2.5 不同环境的兼容性
2.6 注意事项
2.7 替代方案
2.8 常见问题
3. 官方参数
1. 三种方法配置hosts文件以实现域名解析
1.1 启动容器时加上“—add-host”参数
docker run --add-host='www.lyb-geek.com:127.0.0.1' --add-host='www.lyb-geek.cn:192.168.3.1' --name hello-docker -it 192.168.0.1:5002/lybgeek/hello-docker:1.0
通过在启动容器时加上“—add-host”参数,可以在容器内部将指定的域名映射到指定的IP地址
1.2 通过docker-compose配置extra_hosts属性
version: '3'services:web:image: nginx:alpineextra_hosts:- 'www.lyb-geek.com:127.0.0.1'- 'www.lyb-geek.cn:192.168.3.1'
通过在docker-compose文件中配置extra_hosts属性,可以在启动容器时将指定的域名映射到指定的IP地址。
1.3 通过k8s管理容器时配置hostAliases
在创建pod的yaml文件中添加hostAliases配置,将域名映射到IP地址。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
spec:
containers:
- name: myapp-container
image: myapp:latest
hostAliases:
- ip: '192.168.3.1'
hostnames: ['www.lyb-geek.cn']
通过在Kubernetes的Pod定义文件中配置hostAliases,将指定的域名映射到指定的IP地址。这样,在容器内部就可以通过这些域名进行访问了。
2. 解析openwebui中的host.docker.internal
及 host-gateway
docker run -p 3000:8080 --rm --name open-webui \--add-host=host.docker.internal:host-gateway \-v open-webui:/app/backend/data \ghcr.io/open-webui/open-webui:main
host.docker.internal
和 host-gateway
是用于实现容器与宿主机通信的重要机制
2.1 host.docker.internal
-
作用:一个由 Docker 自动解析的 DNS 名称,指向宿主机的内部 IP 地址。
原理:
- Docker 在容器内维护一个 DNS 解析规则,将 host.docker.internal 映射到宿主机的网关地址。
- 在 Linux 上,默认情况下 Docker 不直接支持此名称,但 Docker Desktop(macOS/Windows)会自动配置。
- 在 Linux 系统中,需通过 --add-host=host.docker.internal:host-gateway 手动映射。
2.2 host-gateway
-
作用:一个特殊的占位符,代表宿主机的网络网关地址。
原理:
当 Docker 检测到
host-gateway
时,会自动替换为宿主机的当前网关 IP(例如172.17.0.1
)。避免手动查询宿主机 IP,提供跨平台的兼容性(如 macOS、Windows、Linux)。
2.3 使用场景
- 开发调试:容器内访问宿主机上运行的数据库、API 服务或调试工具。
- 跨服务通信:宿主机作为中间件(如 Redis、RabbitMQ)的代理。
- CI/CD 环境:在 Docker-in-Docker 或 Kubernetes 中简化网络配置。
2.4 使用方法
2.4.1 命令行配置
# 在容器中映射 host.docker.internal 到宿主机 IP
docker run --add-host=host.docker.internal:host-gateway your-image
2.4.2 Docker Compose 配置
services:your-service:image: your-imageextra_hosts:- "host.docker.internal:host-gateway"
2.4.3 代码中直接访问
在容器内通过 http://host.docker.internal:<port>
访问宿主机服务:
# 示例:Python 访问宿主机 API
import requests
response = requests.get("http://host.docker.internal:8080/api")
2.5 不同环境的兼容性
- Docker Desktop:原生支持
host.docker.internal
,无需额外配置。- Linux 原生 Docker:需手动添加
--add-host=host.docker.internal:host-gateway
或修改/etc/hosts
。- Kubernetes: 不支持
host.docker.internal
,需通过 Service 或 Downward API 获取宿主机 IP。
2.6 注意事项
安全性:宿主机的服务需绑定到 0.0.0.0(而非 127.0.0.1),否则容器无法访问。
生产环境:避免依赖此机制,应通过服务发现或明确配置 IP/域名。
网络模式:在 --network=host 模式下,容器直接共享宿主机网络,无需此配置。
2.7 替代方案
- 直接使用宿主机 IP:通过 ifconfig 或 ip addr 获取 IP,但缺乏跨平台兼容性。
- 自定义网络:创建 Docker 自定义网络并静态分配 IP,适合复杂拓扑。
- 服务发现工具:Consul、etcd 等动态管理服务地址。
2.8 常见问题
Q1: 容器内无法解析 host.docker.internal?
解决:确保 Docker 版本 ≥ 18.03,或在 Linux 中手动添加 --add-host。
Q2: 宿主机服务无法访问?
检查项:服务是否监听 0.0.0.0。
防火墙是否放行端口。
Docker 网络是否为默认 bridge。
Q3: 如何在 Kubernetes 中实现类似功能?
方案:通过 hostNetwork: true 或 NodePort Service 暴露宿主机端口。
3. 官方参数
【官方--add-host】docker container run | Docker Docshttps://docs.docker.com/reference/cli/docker/container/run/#add-host