docker容器如何访问宿主机host设置的域名

为什么要访问host

假设我的容器里的服务设置了请求redis的域名为 xxx.redis.com 此时的xxx.redis.com设置在宿主机的host可以对应任意的ip 但是docker的容器并不知道这个地址指向哪里。因为这是宿主机上的host 所以就需要对容器做调整

需要知道docker的网络

docker network ls

birdge 桥接

桥接的意思就是docker里的容器通过docker的网关访问宿主机的网络

host

docker里的容器 不通过docker网关访问宿主机 而是直接使用宿主机的网络  如果采用了该网络 那么docker run -p 指定的端口会无效。因为端口和网络都采用了宿主机的端口和网络。

null

这个可以忽略

如何访问宿主机的host

通过以上知道了网络后。就可以对docker的启动做设置了  直接设置为 网络 --network=host即可  如下代码

docker run -d --network=host --restart=always --name iot-cloud-mqtt-agent -e TZ=Asia/Shanghai -v /data/code/iot-cloud-mqtt-agent/logDir_IS_UNDEFINED:/app/logDir_IS_UNDEFINED iot-cloud-mqtt-agent

以上代码设置了 docker容器的网络为host模式 

### Docker宿主机域名配置方法 在Docker环境中,如果希望容器内的服务能够通过域名访问宿主机的服务或者外部设备可以通过域名访问宿主机上的Docker服务,则需要进行一系列的网络和DNS配置。 #### 1. 容器内解析宿主机域名容器内部需要访问宿主机上的某个特定域名时,可以利用`host.docker.internal`作为中间桥梁。此功能适用于Mac和Windows平台,在Linux平台上默认不可用,但可以通过手动方式实现类似的机制: - **对于Linux环境** Linux环境下不支持`host.docker.internal`,因此需要手动将宿主机的IP地址映射到目标域名。可以在启动容器时挂载宿主机的`/etc/hosts`文件或将自定义的DNS条目注入到容器中。 ```bash docker run --add-host=xxx.redis.com:<HOST_IP> my_image ``` 上述命令会将`xxx.redis.com`绑定到指定的宿主机IP地址[^1]。 - **对于Mac/Windows环境** 如果运行的是Mac或Windows系统,可以直接使用`host.docker.internal`来代替具体的IP地址。例如: ```bash redis-cli -h host.docker.internal ``` #### 2. 外部访问Docker宿主机上的服务 为了让外部客户端通过域名访问Docker宿主机上的服务,通常采用Nginx反向代理的方式完成域名转发。以下是具体步骤: - **配置Nginx反向代理** 编辑Nginx配置文件并添加如下内容: ```nginx server { listen 80; server_name yourdomain.com; location / { proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://<DOCKER_HOST_IP>:<SERVICE_PORT>; } } ``` 将上述模板中的`yourdomain.com`替换为目标域名,并将`<DOCKER_HOST_IP>`设为实际宿主机IP地址(通常是`127.0.0.1`),而`<SERVICE_PORT>`则表示Docker服务监听的端口号[^4]。 - **更新本地DNS记录** 若测试阶段仅限于局域网内访问,可直接编辑本机的`/etc/hosts`文件(Linux/MacOS)或`C:\Windows\System32\drivers\etc\hosts`文件(Windows)。例如: ```plaintext <DOCKER_HOST_IP> yourdomain.com ``` #### 3. 调整防火墙规则 为了确保外部流量能正常到达Docker宿主机上的服务,可能还需要调整系统的防火墙策略。以下是一个常见的操作流程: - 查看当前活动链表: ```bash iptables -L -v -n ``` - 添加允许入站连接的新规则: ```bash sudo iptables -A INPUT -p tcp --dport <SERVICE_PORT> -j ACCEPT ``` - 持久化更改以便重启后仍然生效: 对于Ubuntu系统,可以安装`iptables-persistent`工具包保存现有规则集; 或者针对CentOS/RHEL系列发行版,执行`firewalld`的相关指令[^5]。 --- ### 总结 以上介绍了两种主要场景下的解决方案:一是让Docker容器识别宿主机设定好的域名;二是使外界可通过预定义的域名访问部署在Docker宿主机上的应用实例。每种情况都涉及到了不同的技术细节以及相应的实践技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值