docker容器的通讯——内部访问外部

本文介绍如何使用Docker让容器访问外部网络,并通过iptables策略实现MASQUERADE网络地址转换,使得容器流量能够以宿主机IP对外访问。

《容器访问外部世界:》

 

原理:NAT地址转换

 

 

 

1.物理机可以连接外网

2.docker run -it busybox

ip a

容器可以访问外网

3.查看iptables策略,了解策略原理

iptables -t nat -s

 

-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

收到来自这个网段的包,把它交给MASQUERADE,然后它将包的源地址替换成host主机的地址发送出去,就是做了一次网络源地址转换(NAT)

 

4.开启一个终端运行,监控docker0网卡:

tcpdump -i docker0 -n icmp

 

5.在另一个终端:

进容器ping百度

docker run -it busybox

ping www.baidu.com

结果,发现容器的IP地址交给了MASQUERADE处理

 

 

 

6.结束上一个终端,运行监控物理机网卡

tcpdump -i ens33 -n icmp

发现已经将容器的地址进行转换了,成了物理机的IP地址。

 

 

 

转载于:https://www.cnblogs.com/Leonardo-li/p/8946455.html

### Docker容器启动后无法访问的原因及解决方案 #### 一、网络配置问题 Docker 默认提供三种网络模式:`bridge`(桥接)、`host`(宿主)和 `none`(无)。如果未正确设置网络模式,则可能导致外部无法访问容器中的服务。通常情况下,默认的 `bridge` 模式会分配一个独立的 IP 地址容器,但如果未映射端口或防火墙阻止流量,则会出现无法访问的情况[^3]。 解决方法: 1. 使用 `-p` 或 `--publish` 参数将容器内的端口映射到宿主机上。例如: ```bash docker run -d -p 8000:8000 my-django-app ``` 2. 如果需要共享宿主机的网络,可以使用 `--network=host` 运行容器。注意此方式仅适用于 Linux 平台。 ```bash docker run --network=host my-django-app ``` --- #### 二、端口未暴露或绑定错误 即使容器正常运行,如果没有正确暴露端口或者绑定地址不匹配,也可能导致外部无法访问。例如,在 Django 应用中,开发服务器默认监听的是本地回环接口 (`localhost`) 而不是所有网卡 (`0.0.0.0`)。 解决方法: 1. 修改应用程序的配置文件,使其监听所有网卡。对于 Django 来说,可以通过命令指定监听地址: ```bash python manage.py runserver 0.0.0.0:8000 ``` 2. 确认容器日志是否有任何关于端口绑定的信息: ```bash docker logs <container_id> ``` --- #### 三、防火墙或安全组限制 某些操作系统上的防火墙可能会阻止来自外部的请求到达目标端口。此外,云环境下的虚拟机还可能存在额外的安全组规则。 解决方法: 1. 检查并调整宿主机的防火墙策略。例如在 CentOS 上允许特定端口通过: ```bash sudo firewall-cmd --add-port=8000/tcp --permanent sudo firewall-cmd --reload ``` 2. 对于 AWS EC2 实例或其他云计算平台,请确认实例对应的安全组已开放所需端口。 --- #### 四、Linux 内核版本与 Docker 版本不兼容 当使用的 Linux 内核版本较旧时,可能出现各种异常行为,包括容器无法正常工作或对外通信失败等问题[^1]。 解决方法: 升级内核至最新稳定版,并重新安装适配的新版本 Docker Engine。 --- #### 五、DNS 解析问题 有时由于 DNS 设置不当,容器内部的应用程序尝试解析域名时会发生延迟甚至完全失败,从而影响整体性能表现。 解决方法: 编辑 `/etc/docker/daemon.json` 文件来强制指定公共 DNS 服务器作为首选选项之一: ```json { "dns": ["8.8.8.8", "8.8.4.4"] } ``` 之后重启 Docker 服务使更改生效: ```bash sudo systemctl restart docker ``` --- #### 六、其他潜在因素 除了上述提到的主要方面外,还有可能是镜像本身存在问题,比如体积过于庞大造成加载缓慢;或者是应用本身的初始化过程耗时较长等原因所致[^2]^。 验证手段包括但不限于以下几点: - 查看当前正在运行的所有进程及其状态; - 测试从同一局域网内的另一设备能否顺利连接该服务; - 排除硬件资源不足的可能性——CPU 占用率过高、内存泄漏等情况均会影响响应速度及时效性。 --- ### 总结 针对 Docker 容器启动完成后无法被外界所触及的现象,需综合考虑多方面的可能性,逐一排查直至找到根本症结所在为止。以上列举了几种常见情形以及对应的处置措施供参考采用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值