翼度科技»论坛 云主机 LINUX 查看内容

Docker网络

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
Docker网络是Docker容器间以及容器与宿主机之前通信的基础,它提供了一套灵活的网络配置方案,允许用户自定义网络拓扑,从而满足不同应用场景的需求。
一、Docker网络基础

Docker提供了多种网络模式,每种模式有不同的网络隔离和连接方式,主要包括:
1、Bridge(桥接模式,默认,常用)


  • 为每个容器分配一个网络桥接接口,容器间通信通过Docker内置的虚拟网桥(通常是docker0)进行。
  • 容器可以与宿主机直接通信,外部网络通过端口映射访问容器内部服务。
  • 使用iptables的NAT地址转换实现容器与宿主机的通信。
2、Host


  • 容器共享宿主机的网络命名空间,直接使用宿主机的网络堆栈,容器的网络配置与宿主机相同。
  • 容器端口直接映射到宿主机的端口,无需额外配置。
  • 降低了网络隔离性,但提高了性能。
3、None


  • 不为容器配置网络,容器没有网络连接能力。
  • 通常用于不需要网络连接的容器。
4、Container(用得少,局限大)


  • 容器和容器之间公用一个IP和端口。
  • 通常用于测试场景。
5、User-Defined Networks(用户自定义网络)


  • 可以配置网络驱动、子网、IP范围等,为容器提供更灵活的网络配置。
  • 包括overlay(用于跨多个宿主机的容器通信)和macvlan(为容器提供与宿主机同层的网络接口)等类型。
二、容器访问外网

容器要想访问外部网络,需要本地系统的转发支持。
在 Linux 系统中,检查转发是否打开:
  1. sysctl net.ipv4.ip_forward
复制代码
  1. [root@localhost ~]# sysctl net.ipv4.ip_forward
  2. net.ipv4.ip_forward = 1
复制代码
如果为 0,说明没有开启转发,则需要手动打开。
  1. sysctl -w net.ipv4.ip_forward=1
复制代码
  1. [root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
  2. net.ipv4.ip_forward = 1
复制代码
如果在启动 Docker 服务的时候设定 --ip-forward=true,那么 Docker 就会自动设定系统的 ip_forward 参数值 为 1。 
三、Docker网络配置

在Docker中,可以使用以下命令来进行网络配置:
  1. # 查看网络列表
  2. docker network ls
  3. # 查看一个Docker网络的详细信息
  4. docker network inspect [网络名称]
  5. # 断开容器与网络的连接
  6. docker network disconnect [网络名称] [容器名称或ID]
  7. # 删除一个已存在的Docker网络
  8. docker network rm [网络名称]
  9. # 创建一个名为 my-bridge-network 的Docker桥接网络,并指定子网和网关
  10. docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 my-bridge-network
  11. # 启动容器时指定网络(--net [网络名称])
  12. docker run -d -p 8090:80 --mount type=volume,source=nginx_volume,target=/usr/share/nginx/html --name nginx-container --net my-bridge-network nginx:latest
  13. # 启动容器时指定网络和固定IP地址
  14. docker run -d --net [网络名称] --ip [新的IP地址] --name [容器名称] [镜像名称]
  15. # 将容器连接到一个已存在的Docker网络
  16. docker network connect [网络名称] [容器名称或ID]
复制代码
示例:
1)创建自定义桥接网络
  1. [root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 my-bridge-network
  2. cf8f2d55247f6c854dae9241858455445e1e1cad7c82a8bec47265fac9275122
  3. [root@localhost ~]# docker network ls
  4. NETWORK ID     NAME                DRIVER    SCOPE
  5. 592cddf71fad   bridge              bridge    local
  6. c1993b581192   host                host      local
  7. cf8f2d55247f   my-bridge-network   bridge    local
  8. c21728fbfa4d   none                null      local
复制代码
2)启动容器时指定网络
  1. [root@localhost ~]# docker run -itd --net my-bridge-network --name busybox-container-1 busybox
  2. ea264b47898086b2209686fef01e07c5981704dcaab28e8eba833da2ddaff74d
  3. [root@localhost ~]# docker ps
  4. CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
  5. ea264b478980   busybox   "sh"      4 seconds ago   Up 3 seconds             busybox-container-1
复制代码
3)启动容器时指定网络和固定IP地址
  1. [root@localhost ~]# docker run -itd --net my-bridge-network --ip 192.168.4.110 --name busybox-container-2 busybox
  2. cc10a9bb6f9514eb2182cae9973dc6e1a63421f80d42af909b36aa108f03f83d
  3. [root@localhost ~]# docker ps
  4. CONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
  5. cc10a9bb6f95   busybox   "sh"      8 seconds ago   Up 7 seconds             busybox-container-2
  6. ea264b478980   busybox   "sh"      3 minutes ago   Up 3 minutes             busybox-container-1
复制代码
4)检查两个容器间的网络是否能连通
  1. [root@localhost ~]# docker exec -it busybox-container-1 ping busybox-container-2
  2. PING busybox-container-2 (192.168.4.110): 56 data bytes
  3. 64 bytes from 192.168.4.110: seq=0 ttl=64 time=0.209 ms
  4. 64 bytes from 192.168.4.110: seq=1 ttl=64 time=0.354 ms
  5. 64 bytes from 192.168.4.110: seq=2 ttl=64 time=0.218 ms
  6. 64 bytes from 192.168.4.110: seq=3 ttl=64 time=0.141 ms
  7. 64 bytes from 192.168.4.110: seq=4 ttl=64 time=0.104 ms
  8. ^C
  9. --- busybox-container-2 ping statistics ---
  10. 5 packets transmitted, 5 packets received, 0% packet loss
  11. round-trip min/avg/max = 0.104/0.205/0.354 ms
复制代码
可以看出这两个容器间的网络是连通的。
5)启动一个容器但不指定网络
  1. [root@localhost ~]# docker run -itd --name busybox-container-3 busybox
  2. 55ef9654c71a499dec30b7f0ad30ede6db819cbe5c32c4b2cb27597337ca6833
  3. [root@localhost ~]# docker ps
  4. CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES
  5. 55ef9654c71a   busybox   "sh"      3 seconds ago    Up 3 seconds              busybox-container-3
  6. cc10a9bb6f95   busybox   "sh"      12 minutes ago   Up 12 minutes             busybox-container-2
  7. ea264b478980   busybox   "sh"      15 minutes ago   Up 15 minutes             busybox-container-1
  8. [root@localhost ~]# docker exec -it busybox-container-1 ping busybox-container-3
  9. ping: bad address 'busybox-container-3'
复制代码
可以发现不同网络下的两个容器间是 ping 不通的。
6)使用 docker network connect 命令可以使得原本不在同一网络下的容器之间也能够互相通信
在 Docker 中,docker network connect [网络名称] [容器名称或ID] 命令主要用于将一个已存在的容器连接到另一个已存在的网络上。
  1. [root@localhost ~]# docker network connect my-bridge-network busybox-container-3
  2. [root@localhost ~]# docker exec -it busybox-container-1 ping busybox-container-3
  3. PING busybox-container-3 (192.168.0.3): 56 data bytes
  4. 64 bytes from 192.168.0.3: seq=0 ttl=64 time=0.102 ms
  5. 64 bytes from 192.168.0.3: seq=1 ttl=64 time=0.090 ms
  6. 64 bytes from 192.168.0.3: seq=2 ttl=64 time=0.098 ms
  7. ^C
  8. --- busybox-container-3 ping statistics ---
  9. 3 packets transmitted, 3 packets received, 0% packet loss
  10. round-trip min/avg/max = 0.090/0.096/0.102 ms
复制代码
可以发现这时候就可以 ping 的通了。
7)查看容器的 /etc/hosts 信息
  1. [root@localhost ~]# docker exec -it busybox-container-3 cat /etc/hosts
  2. 127.0.0.1       localhost
  3. ::1     localhost ip6-localhost ip6-loopback
  4. fe00::0 ip6-localnet
  5. ff00::0 ip6-mcastprefix
  6. ff02::1 ip6-allnodes
  7. ff02::2 ip6-allrouters
  8. 172.17.0.2      55ef9654c71a
  9. 192.168.0.3     55ef9654c71a
复制代码
8)查看一个Docker网络的详细信息
  1. [root@localhost ~]# docker network inspect my-bridge-network
  2. [
  3.     {
  4.         "Name": "my-bridge-network",
  5.         "Id": "cf8f2d55247f6c854dae9241858455445e1e1cad7c82a8bec47265fac9275122",
  6.         "Created": "2024-09-12T22:38:26.886089982+08:00",
  7.         "Scope": "local",
  8.         "Driver": "bridge",
  9.         "EnableIPv6": false,
  10.         "IPAM": {
  11.             "Driver": "default",
  12.             "Options": {},
  13.             "Config": [
  14.                 {
  15.                     "Subnet": "192.168.0.0/16",
  16.                     "Gateway": "192.168.0.1"
  17.                 }
  18.             ]
  19.         },
  20.         "Internal": false,
  21.         "Attachable": false,
  22.         "Ingress": false,
  23.         "ConfigFrom": {
  24.             "Network": ""
  25.         },
  26.         "ConfigOnly": false,
  27.         "Containers": {
  28.             "55ef9654c71a499dec30b7f0ad30ede6db819cbe5c32c4b2cb27597337ca6833": {
  29.                 "Name": "busybox-container-3",
  30.                 "EndpointID": "c7f81f20348469749fdd7a23e29d2be939c2c71d75d6149565c4d59ed4f93ab3",
  31.                 "MacAddress": "02:42:c0:a8:00:03",
  32.                 "IPv4Address": "192.168.0.3/16",
  33.                 "IPv6Address": ""
  34.             },
  35.             "cc10a9bb6f9514eb2182cae9973dc6e1a63421f80d42af909b36aa108f03f83d": {
  36.                 "Name": "busybox-container-2",
  37.                 "EndpointID": "1922c8921cbe099cc4104a54810978a953e082de17a465a0376add21810e3749",
  38.                 "MacAddress": "02:42:c0:a8:04:6e",
  39.                 "IPv4Address": "192.168.4.110/16",
  40.                 "IPv6Address": ""
  41.             },
  42.             "ea264b47898086b2209686fef01e07c5981704dcaab28e8eba833da2ddaff74d": {
  43.                 "Name": "busybox-container-1",
  44.                 "EndpointID": "fd28ba7d898d5b431d58efa9dcfab07fb505bbdba34dc78ad8ac299e20800a74",
  45.                 "MacAddress": "02:42:c0:a8:00:02",
  46.                 "IPv4Address": "192.168.0.2/16",
  47.                 "IPv6Address": ""
  48.             }
  49.         },
  50.         "Options": {},
  51.         "Labels": {}
  52.     }
  53. ]
复制代码
 
至此本文就全部介绍完了,希望对您有所帮助!

来源:https://www.cnblogs.com/xyh9039/p/18405348
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具