Docker网络

docker网络的5种模式
none

在使用 none 模式后,Docker 容器不会进行任何网络配置,没有网卡、没有IP也没有路由,因此默认无法与外界通信,需要手动添加网卡配置IP等,所以极少使用

none网络特点

复制代码
使用参数 --network none 指定
默认无网络功能,无法和外部通信
无法实现端口映射
适用于测试环境
host

直接使用宿主机的网卡和IP地址, 此模式由于直接使用宿主机的网络无需转换,网络性能最高,但是各容器内使用的端口不能相同,适用 于运行容器端口比较固定的业务

host网络特点

复制代码
使用参数 --network host 指定
共享宿主机网络
各容器网络无隔离
网络性能无损耗
网络故障排除相对简单
容易产生端口冲突
网络资源无法分别统计
不支持端口映射

[root@kv1 ~]#docker run -it --rm  --network host alpine:20240329
/ #
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP qlen 1000
    link/ether 00:0c:29:a5:08:ac brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.100/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.10/24 scope global secondary etho:1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fea5:8ac/64 scope link
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP qlen 1000
    link/ether 00:0c:29:a5:08:b6 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.100/24 brd 192.168.10.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fea5:8b6/64 scope link
       valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
    link/ether 02:42:99:0f:fd:03 brd ff:ff:ff:ff:ff:ff
    inet 172.27.0.1/24 brd 172.27.0.255 scope global docker0
       valid_lft forever preferred_lft forever
bridge

默认模式

会创建容器为每一个容器分配自己的网络信息,并将容器连接到一个虚拟网桥与外界通信,可以和外部网络之间进行通信,通过SNAT访问外网,使用DNAT可以让容器被外部主机访问

此模式宿主机需要启动ip_forward功能

bridge网络特点:

复制代码
网络资源隔离: 不同宿主机的容器无法直接通信,各自使用独立网络
无需手动配置: 容器默认自动获取172.17.0.0/16的IP地址,此地址可以修改
可访问外网: 利用宿主机的物理网卡,SNAT连接外网
外部主机无法直接访问容器: 可以通过配置DNAT接受外网的访问
低性能较低: 因为可通过NAT,网络转换带来更的损耗
端口管理繁琐: 每个容器必须手动指定唯一的端口,容器产生端口冲容

修改Docker网络地址

方式一1.修改桥接地址

复制代码
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 
--bip=10.100.0.1/24 

方式二2.修改Bridge网络配置

复制代码
[root@ubuntu1804 ~]#vim /etc/docker/daemon.json
{
  "hosts": ["tcp://0.0.0.0:2375", "fd://"],
  "bip": "192.168.100.100/24",         #分配docker0网卡的IP,24是容器IP的netmask
  "fixed-cidr": "192.168.100.128/26", #分配容器IP范围,26不是容器IP的子网掩码,只表示地址范围
  "fixed-cidr-v6": "2001:db8::/64",
  "mtu": 1500,
  "default-gateway": "192.168.100.200",  #网关必须和bip在同一个网段
  "default-gateway-v6": "2001:db8:abcd::89",
  "dns": [ "1.1.1.1", "8.8.8.8"]
}
container

用此模式创建的容器需指定和一个已经存在的容器共享一个网络,而不是和宿主机共享网络,新创建的容器不会创建自己的网卡也不会配置自己的IP,而是和一个被指定的已经存在的容器共享IP和端口范围,因此这个容器的端口不能和被指定容器的端口冲突,除了网络之外的文件系统、进程信息等仍然保 持相互隔离,两个容器的尽程可以通过lo网卡进行通信

container模式特点

  • 使用参数 ---network container:名称或ID 指定
  • 与宿主机网络空间隔离
  • 空器间共享网络空间,直接使用对方的网络 第一个容器的网络可能是bridge,或none,或者host,而第二个容器模式依赖于第一个容器,它们共享网络
  • 如果第一个容器停止,将导致无法创建第二个容器
  • 第二个容器可以直接使用127.0.0.1访问第一个容器
  • 适合频繁的容器间的网络通信
  • 默认不支持端口映射,较少使用
自定义网络模式

使用自定义的网段地址,网关等信息,实现不用集群应用的独立网络管理,在同一个网络内,可以直接使用容器名相互访问,非常便利

注意:自定义网络内的容器可以直接通过容器名进行相互的访问,无需使用--link

复制代码
[root@master1 ~]#docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks

Run 'docker network COMMAND --help' for more information on a command.

创建自定义网络

复制代码
docker network create -d <mode> --subnet <CIDR> --gateway <网关> <自定义网络名称>
#注意mode不支持host和none,默认是bridge模式
-d <mode> 可省略,默认为bridge

查看自定义网络信息

复制代码
docker network inspect <自定义网络名称或网络ID>

引用自定义网络

复制代码
docker run --network <自定义网络名称> <镜像名称>
docker run --net <自定义网络名称> --ip <指定静态IP> <镜像名称>
#注意:静态IP只支持自定义网络模型
#指定自定义网络中的容器的别名
docker run --network <自定义网络名称> --network-alias list <镜像名称>

删除自定义网络

复制代码
doccker network rm <自定义网络名称或网络ID>

注意:内置的三个网络无法删除

同一个宿主机之间不同网络的容器通信

开两个容器,一个使用自定义网络容器,一个使用默认bridge网络容器,默认因iptables 规则导致无法通信

复制代码
1.修改iptables实现同意宿主机上的不同网络的容器间通信
2.使用docker network connect命令实现同一宿主机不同网络的容器间相互通信,将container连入指定的network中,使此container可以与network中的其他容器进行通信
docker network connect [OPTIONS] NETWORK CONTAINER
Connect a container to a network
Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings     driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string             IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container
将container与指定的network断开连接,使此container可以与container中的其他容器进行无法通信
如果将容器从自定义的网络删除,将加入默认的网络,即docker0网桥中,获取172.17.0.0/16
docker network disconnect [OPTIONS] NETWORK CONTAINER
Disconnect a container from a network
Options:
  -f, --force   Force the container to disconnect from a network

例如test1和test2容器默认无法通信,让默认网络中容器test1可以连通自定义网络test-net的容器test2,之后在test1容器内可以看到新添加了一个网卡,并且分配了test-net网络中的IP信息,test1可以连接test2容器,但test2容器没有变化,仍然无法连接test1,将自定义网络中的容器test2也加入到默认网络中,使之和默认网络中的容器test1通信 ,确认自定义网络的容器test2中添加了新网卡,并设置默认网络的IP信息 ,相当于test1和test2各添加了新网卡。

实现跨宿主机的容器之间网络互联

同一个宿主机之间的各个容器之间是可以直接通信的,但是如果访问到另外一台宿主机的容器,默认是不能通信的 利用桥接实现跨宿主机的容器间互联 利用NAT实现跨主机的容器间互联,在宿主机上做一个网络路由就可以实现A宿主机的容器访问B主机的容器的目的(此方式只适合小型网络,复杂的网络可以使用其他网络插件:flannel和calico)

相关推荐
老前端的功夫13 分钟前
HTTP 协议演进深度解析:从 1.0 到 2.0 的性能革命
前端·网络·网络协议·http·前端框架
一夜空中最亮的星一1 小时前
【Linux】ubuntu24.04 安装docker
linux·docker·eureka
赖small强1 小时前
【Linux 网络基础】libwebsockets 技术文档
linux·网络·https·tls·lib·websockets
炸裂狸花猫1 小时前
开源域名证书工具 - cert-manager
云原生·容器·kubernetes·开源·cert-manager
TT哇2 小时前
消息推送机制——WebSocket
java·网络·websocket·网络协议
会飞的小蛮猪2 小时前
Ubuntu24.04基于Docker部署K8s(使用私服部署)
经验分享·docker·云原生·容器·kubernetes
wadesir4 小时前
当前位置:首页 > 服务器技术 > 正文Linux网络HSRP协议(实现路由器热备份与高可用性的实用指南)
linux·服务器·网络
带土14 小时前
4. 两台win11 笔记本局域网内文件传输
网络
weixin_436525074 小时前
使用 idea 命令行构建 Docker 镜像并部署到云服务器
linux·docker·github
xixixi777775 小时前
“C2隐藏”——命令与控制服务器的隐藏技术
网络·学习·安全·代理·隐藏·合法服务·c2隐藏