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)

相关推荐
颜淡慕潇10 分钟前
【K8S问题系列 | 20 】K8S如何删除异常对象(Pod、Namespace、PV、PVC)
后端·云原生·容器·kubernetes
__zhangheng12 分钟前
Mac 查询IP配置,网络代理
linux·服务器·网络·git
lmxnsI13 分钟前
docker使用笔记
笔记·docker·容器
木卫二号Coding19 分钟前
Docker-构建自己的Web-Linux系统-镜像webtop:ubuntu-kde
linux·ubuntu·docker
IT 古月方源44 分钟前
ospf 的 状态机详解
运维·网络·tcp/ip·智能路由器
dog2501 小时前
UDP 比 TCP 更快吗?
网络·tcp/ip·udp
一勺汤1 小时前
YOLO11改进-模块-引入星型运算Star Blocks
网络·yolo·目标检测·改进·魔改·yolov11·yolov11改进
ChennyWJS1 小时前
03.HTTPS的实现原理-HTTPS的工作流程
网络·网络协议·http·https
Hacker_Oldv1 小时前
网络安全攻防学习平台 - 基础关
网络·学习·web安全
木卫二号Coding2 小时前
宝塔-firefox(Docker应用)-构建自己的Web浏览器
linux·docker·开源