Docker网络通讯

Docker网络通讯

我们要解决docker网络通讯,主要是解决以下三个问题:

  • 容器与容器之间进行通讯
  • 容器访问外部网络
  • 外部网络访问容器
docker网络的通讯模式

在通常情况下,docker使用网桥(Bridge)与NAT的通讯模式

在这里插入图片描述
这个图代表了什么样的含义呢?

对于我们本机来说,当我们安装完docker的时候,会出现一个网络环境也就是上面的host,本机会出现一个网卡也就是上图中的ETH0 10.1.1.10/8后会出现一个docker0,这相当于一个交换机,叫做网桥。

在docker0 上会出现许多相互隔离的network namespace,也就是图中的vethX,每一个namespace存在两端,一端固定在容器内部,成为一个虚拟网卡。另一端也就是之前说道的veth,这样起到了一个连通的作用。

那么既然不同容器之间同时存在在docker0上,也就是说不同容器之间就可以直接通过网桥进行连接。

那么容器之间的通讯方式我们已经了解了,那么接下来我们需要开始了解容器与外部网络之间的相互访问问题:

  1. 容器访问外部网络
    其实容器访问外部容器主要是通过SNAT转换,也就意味着容器访问外部网络借助的是防火墙的SNAT
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 -o docker0 -j MASQUERADE
  1. 外部网络访问容器
    外部网络访问容器其实是通过DNAT的方式
	docker run -d -p 80:80 apache
	iptables -t nat-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
    iptables -t nat-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j  DNAT --to-destination 172.17.0.2:80

这些值都是系统默认的值,那么我们可不可以根据使用习惯去自定义呢,答案是肯定的。

Docker网络模式的修改

Docker进程网络修改
  • –bridge=" " 指定Docker使用的网桥设备,默认情况下Docker会自动使用docker0网桥设备
  • –bip 指定Docker0的IP和掩码,使用标准的CIDR形式,如0.0.0.0/24
  • –dns 配置容器的DNS,在启动Docker进程时添加,所有容器全部生效
Docker容器网络修改
  • –dns 用于指定启动的容器的DNS
  • –net 用于指定容器的网络通讯方式,有以下四个值:
    bridge:Docker默认方式,网桥模式
    none:容器没有网络栈
    container:使用其他容器的网络栈,Docker容器会加入其他的容器的network namespace
    host:表示容器使用host的网络,没有自己独立的网络栈。容器可以完全访问host网络,不安全

给容器赋予一个独立IP

在这里我们需要用到pipework,需要通过GitHub来下载,因此我们需要先安装git

yum install -y git

cp pipework/pipework /usr/local/bin

chmod a+x /usr/local/bin/pipework

截图如下
在这里插入图片描述

docker run --name tomcat --net=none -d tomcat:v2.0

pipework br0 tomcat 0.0.0.16/24

修改成功!
在这里插入图片描述
通过前后两张图对比,可以发现,我们通过pipework给容器自定义了一个IP。
在这里插入图片描述

### 如何解决Docker容器的网络连接问题 #### 排查现有配置并确认网络环境 当面对Docker容器无法正常联网的情况时,首先要检查宿主机自身的网络状况。如果Ubuntu主机更换成NET模式之后能够连通外部网络Docker内部却不行,则可能是由于之前的手动代理设置影响到了新创建或已存在的容器[^1]。 对于这种情况的一个解决方案是清除旧有的代理设定或是调整其配置来适应新的网络条件。可以通过编辑`/etc/docker/daemon.json`文件移除任何特定于位置的HTTP(S)_PROXY变量定义,从而让所有的请求都直接发出而不是通过预设的中间节点转发。 #### 验证容器间通信状态 为了确保不同容器之间能互相访问各自的服务,比如Redis客户端尝试联系服务器实例的时候遇到了障碍,应该先验证它们确实位于同一逻辑子网内: ```bash docker network ls ``` 上述命令会列出当前系统中存在的所有自定义和默认网络名称及其ID;接着利用下面这条指令把目标容器加入指定的共享网络里头以便实现互通互联: ```bash docker network connect <network_name> <container_name> ``` 这一步骤有助于建立跨多个应用组件之间的稳定数据交换路径[^2]。 #### 构建适用于多台机器部署的应用架构 针对更复杂的场景——例如跨越数个物理计算资源分布式的应用程序集群而言,采用像Swarm这样的编排工具可以帮助简化管理流程,并提供更加灵活高效的路由机制支持容器间的远距离调用需求。官方文档提供了详细的指南说明如何基于overlay类型的虚拟化层构建此类拓扑结构[^3]。 #### 基础设施层面的基础保障措施 最后,在考虑以上高级特性前,请务必保证最底层的操作系统级参数正确无误。特别是有关Linux发行版自带的安全防护策略可能阻碍正常的业务运作。以Ubuntu为例,默认安装后的防火墙可能会阻止某些必要的入站流量到达预期的目的地端口(如Redis常用的6379)。因此适当放宽规则允许这些重要的通讯通道畅通无阻是非常有必要的: ```bash sudo ufw allow 6379 ``` 此操作开放了对外部世界暴露出来的监听接口使得其他地方发起的数据包得以顺利抵达目的地完成交互过程[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值