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)

相关推荐
大鹏说大话20 小时前
SSL证书自动化的未来:ACME协议与Let’s Encrypt实践
网络·安全
被摘下的星星21 小时前
网际协议(IP协议)
网络·tcp/ip
爱学习的小囧1 天前
ESXi VMkernel 端口 MTU 最佳设置详解
运维·服务器·网络·php·虚拟化
eRTE XFUN1 天前
docker 安装 mysql
mysql·adb·docker
eEKI DAND1 天前
对Docker部署的MySQL中的数据进行备份恢复
mysql·docker·容器
东北甜妹1 天前
Docker 瘦身
阿里云·docker·eureka
TechubNews1 天前
Base 发布首个独立 OP Stack 框架的网络升级 Azul,将是 L2 自主迭代的开端?
大数据·网络·人工智能·区块链·能源
旷世奇才李先生1 天前
Docker实战:容器化部署与Docker Compose集群管理(附企业级案例)
spring cloud·docker·eureka
多年小白1 天前
中科院 Ouroboros 晶圆级存算一体芯片深度解析
大数据·网络·人工智能·科技·ai
发光小北1 天前
IEC104 转 Modbus TCP 网关如何应用?
网络·网络协议·tcp/ip