【docker】容器内部的网络,docker 容器网络

【docker】容器内部的网络1.查看容器内部的IP地址
[rootes1 nginx]# iptables -t nat -vnL
Chain PREROUTING (policy ACCEPT 587 packets, 32505 b

1.显示容器内的IP地址

[root@es1 nginx]# iptables -t nat -vnL

Chain PREROUTING(策略接受587个数据包,32505字节)

pkts 字节目标proto optin 源目标

2975 152K DOCKER 全部– * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE 匹配dst 类型LOCAL

Chain INPUT(策略接受587个数据包,32505字节)

pkts 字节目标proto optin 源目标

链输出(策略接受25个数据包,1704字节)

pkts 字节目标proto optin 源目标

19 1132 DOCKER all — * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE 匹配dst 类型LOCAL

链式后路由(策略接受30 个数据包,1972 字节)

pkts 字节目标proto optin 源目标

5 335 全部伪装– * !docker0 172.17.0.0/16 0.0.0.0/0

2 182 返回全部– * * 192.168.122.0/24 224.0.0.0/24

0 0 返回全部– * * 192.168.122.0/24 255.255.255.255

0 0 伪装TCP — * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535

0 0 伪装udp — * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535

0 0 伪装全部– * * 192.168.122.0/24 !192.168.122.0/24

0 0 伪装TCP — * * 172.17.0.2 172.17.0.2 tcp dpt:80

0 0 伪装TCP — * * 172.17.0.3 172.17.0.3 tcp dpt:80

0 0 伪装TCP — * * 172.17.0.4 172.17.0.4 tcp dpt:80

0 0 伪装TCP — * * 172.17.0.5 172.17.0.5 tcp dpt:80

0 0 伪装TCP — * * 172.17.0.6 172.17.0.6 tcp dpt:80

0 0 伪装TCP — * * 172.17.0.7 172.17.0.7 tcp dpt:8080

Chain Docker(参考2)

pkts 字节目标proto optin 源目标

0 0 返回全部– docker0 * 0.0.0.0/0 0.0.0.0/0

9 492 DNAT tcp –!docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8009 至:172.17.0.2:80

11 612 DNAT tcp –!docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8008 至:172.17.0.3:80

5 284 DNAT tcp –!docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8010 至:172.17.0.4:80

2 104 DNAT tcp — !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8007 至:172.17.0.5:80

5 268 DNAT tcp –!docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8006 到:172.17.0.6:80

3 164 DNAT tcp –!docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:58080 到:172.17.0.7:8080

2. 找到Docker 服务器的IP 地址。

[root@es1 nginx]# ip a

1: lo: LOOPBACK,UP,LOWER_UP mtu 65536 qdisc noqueue 状态未知组默认qlen 1000

链路/环回00:00:00:00:00:00 brd 00:00:00:00:00:00

inet 127.0.0.1/8 范围主机lo

永远有效_lft 永远首选_lft

inet6 :1/128 范围主机

永远有效_lft 永远首选_lft

2: ens33: 广播、组播、UP、LOWER_UP mtu 1500 qdisc fq_codel 状态UP 组默认qlen 1000

链接/以太网00:0c:29:c9:37:69 brd ff:ff:ff:ff:ff:ff

inet 192.168.1.7/24 brd 192.168.1.255 范围全局noprefixroute ens33

永远有效_lft 永远首选_lft

inet6 240e:39a:343:e210:3ac8:dbde:394:4899/64 范围全局noprefixroute 动态

effective_lft 259092 秒Priority_lft 172692 秒

inet6 fe80:80bb:bb62:b853:5e38/64范围链接noprefixroute

永远有效_lft 永远首选_lft

3: virbr0: 无载波、广播、组播、UP mtu 1500 qdisc noqueue 状态DOWN 组默认qlen 1000

链接/以太网52:54:00:3e:ae:4a brd ff:ff:ff:ff:ff:ff

inet 192.168.122.1/24 brd 192.168.122.255 范围全局virbr0

永远有效_lft 永远首选_lft

4: virbr0-nic: 广播、多播mtu 1500 qdisc fq_codel 主控virbr0 状态DOWN 组默认qlen 1000

链接/以太网52:54:00:3e:ae:4a brd ff:ff:ff:ff:ff:ff

5: tunl0@NONE: NOARP mtu 1480 qdisc noop 状态DOWN 组默认qlen 1000

链接/ipip 0.0.0.0 brd 0.0.0.0

6: docker0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue 状态UP 组默认值

链接/以太网02:42:85:9a:57:33 brd ff:ff:ff:ff:ff:ff

inet 172.17.0.1/16 brd 172.17.255.255 范围全局docker0

永远有效_lft 永远首选_lft

inet6 fe80:42:85ff:fe9a:5733/64 范围链接

永远有效_lft 永远首选_lft

70: veth497bffd@if69: 广播、组播、UP、LOWER_UP mtu 1500 qdisc noqueue master docker0 状态UP 组默认值

链接/以太网66:77:37:75:58:ca brd ff:ff:ff:ff:ff:ff 链接网络ID 0

inet6 fe80:6477:37ff:fe75:58ca/64 范围链接

永远有效_lft 永远首选_lft

72: vethe3f93fe@if71: 广播、组播、UP、LOWER_UP mtu 1500 qdisc noqueue 主docker0 状态UP 组默认值

链接/以太网4e:77:4f:8f:75:fa brd ff:ff:ff:ff:ff:ff 链接网络ID 1

inet6 fe80:4c77:4fff:fe8f:75fa/64 范围链接

永远有效_lft 永远首选_lft

74: veth6fdd7a0@if73: 广播、组播、UP、LOWER_UP mtu 1500 qdisc noqueue master docker0 状态UP 组默认值

链接/以太网2e:c4:d8:79:49:9b brd ff:ff:ff:ff:ff:ff 链接网络ID 2

inet6 fe80:2cc4:d8ff:fe79:499b/64 范围链接

永远有效_lft 永远首选_lft

76: vethcf862c9@if75: 广播、组播、UP、LOWER_UP mtu 1500 qdisc noqueue master docker0 状态UP 组默认

链接/以太网7e:6e:25:8d:81:37 brd ff:ff:ff:ff:ff:ff link-netnsid 3

inet6 fe80:7c6e:25ff:fe8d:8137/64 范围链接

永远有效_lft 永远首选_lft

78: veth32a1f06@if77: 广播、组播、UP、LOWER_UP mtu 1500 qdisc noqueue master docker0 状态UP 组默认值

链接/以太网52:f7:4e:7f:b9:38 brd ff:ff:ff:ff:ff:ff 链接-netnsid 4

inet6 fe80:50f7:4eff:fe7f:b938/64 范围链接

永远有效_lft 永远首选_lft

82: veth3c53cfd@if81: 广播、组播、UP、LOWER_UP mtu 1500 qdisc noqueue master docker0 状态UP 组默认值

链接/以太da:1c:ea:53:32:37 brd ff:ff:ff:ff:ff:ff 链接-netnsid 5

inet6 fe80:d81c:eaff:fe53:3237/64 范围链接

永远有效_lft 永远首选_lft

3.Docker网络

Docker 是一种轻量级容器化技术,允许您在操作系统之上隔离操作系统级虚拟化。

运行多个应用程序。网络是Docker 的一个非常重要的组件,它允许容器之间进行通信。

互联网。本文介绍了Docker网络的基础知识,包括网络类型、网络驱动和网络配置。

(1)Docker网络概述

Docker 网络具有三个基本元素:网络类型、网络驱动程序和网络配置。

Docker 支持四种类型的网络。

桥接:这是默认的网络类型,构建在主机的网络接口之上。容器默认使用此网络类型。

Host:该网络类型直接使用主机的网络堆栈,容器和主机共享网络堆栈。

Overlay:这种网络类型可以通过内置的DNS 服务跨越多个Docker 守护进程。

允许容器在主机之间进行通信。

macvlan:这种方法允许容器拥有自己的MAC地址,允许它们直接与物理网络中的设备通信。

(2)Docker网络驱动

Docker支持多种网络驱动程序,每种驱动程序都有不同的实现方法。

下面列出了Docker 支持的网络驱动程序。

1. Bridge 驱动程序:该驱动程序是安装Docker 时的默认设置。

Docker0的Linux Bridge,新创建的容器会自动桥接到这个接口。

但使用NAT与外界通信,通信变得复杂,在复杂场景下使用也有很多限制。

2. 主机驱动程序:通过此驱动程序,Docker 容器和主机共享相同的驱动程序。

使用主机的网卡、IP、端口等信息配置网络命名空间。

然而,容器的其他方面,例如文件系统和进程列表,仍然与主机隔离。

在托管模式下,虚拟化网络不会造成任何额外的性能负担。但主机驱动程序也

减少容器之间以及容器与主机之间的网络级隔离。

造成网络资源的争夺和争用。

3. Overlay 驱动程序:该驱动程序遵循IETF 标准VXLAN 方法,并被VXLAN 普遍认可。

SDN控制器模式非常适合大规模云计算虚拟化环境。在使用过程中,

需要额外的配置存储服务,并且必须在启动Docker 守护进程时添加。

指定要使用的配置存储服务的地址的参数。

4.远程驱动程序:该驱动程序实际上并不实现任何真正的网络服务。

相反,它调用用户实现的网络驱动程序插件,使libnetwork 驱动程序可插入。

5.空驱动程序:有了这个驱动程序,Docker容器就有了自己的网络命名空间。

但是,没有为Docker 容器执行网络配置。换句话说,这个Docker 容器:

除了网络命名空间附带的环回网卡之外,没有其他网卡、IP、路由或其他信息。

用户需要给Docker容器添加网卡、配置IP等。如果没有特定配置,该模式不可用

虽然这很常用,但它还有一个优点是允许用户非常自由地定制容器的网络环境。

每种网络类型都有自己的特点和适用场景,根据自己的实际需求选择合适的网络创建方式非常重要。

此外,还有其他网络驱动程序和插件可以满足不同环境的需求。

例如印花布、梭织布等。

(3)创建Docker网络

安装docker 时,会自动创建三种类型的网络:桥接网络、主机网络和无网络。

您可以使用命令docker network ls 来查看它。

[root@es1 nginx]# docker 网络ls

网络ID 名称驱动程序范围

f3d67f7b1cca 桥桥本地

e4fab055f716 主机主机本地

6c755811646c 无空本地

Docker网络配置包括以下几个方面:

使用网络:容器可以连接到多个网络。

IP 地址:容器可以使用静态或动态IP 地址。

网络别名:容器可以使用多个别名访问网络。

网络范围:容器可以选择使用全局或本地范围网络。

Docker 允许您使用以下命令配置网络:

1.`docker network create`:创建一个新的Docker网络。

示例:“docker 网络创建我的网络”

目的:创建一个名为“my-network”的Docker 网络以与容器一起使用。

83: br-e4570a3521b6: NO-CARRIER、BROADCAST、MULTICAST、UP mtu 1500 qdisc noqueue 状态DOWN 组默认值

链接/以太网02:42:e3:b1:a8:9c brd ff:ff:ff:ff:ff:ff

inet 172.18.0.1/16 brd 172.18.255.255 范围全局br-e4570a3521b6

永远有效_lft 永远首选_lft

2. `docker network connect`:将容器连接到现有的Docker 网络。

示例:`docker 网络连接我的网络我的容器`

目的:将名为“my-container”的容器连接到名为“my-network”的Docker 网络。

允许容器与该网络中的其他容器通信。

[root@es1 nginx]# docker 网络连接my-network 2084fabb416f

83: br-e4570a3521b6: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue 状态UP 组默认值

链接/以太网02:42:e3:b1:a8:9c brd ff:ff:ff:ff:ff:ff

inet 172.18.0.1/16 brd 172.18.255.255 范围全局br-e4570a3521b6

永远有效_lft 永远首选_lft

inet6 fe80:42:e3ff:feb1:a89c/64 范围链接

永远有效_lft 永远首选_lft

85: vethda06f85@if84: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue master br-e4570a3521b6 状态UP 组默认值

链接/以太网6e:84:62:f7:14:10 brd ff:ff:ff:ff:ff:ff 链接网络ID 1

inet6 fe80:6c84:62ff:fef7:1410/64 范围链接

永远有效_lft 永远首选_lft

3.“docker网络检查”:检查Docker网络的详细信息。

示例:“docker 网络检查my-network”

目的:获取名为“my-network”的Docker 网络的详细信息。

这包括网络标识符、有关容器所连接的网络的信息等。

[root@es1 nginx]# docker 网络检查my-network

[

{

\’名称\’: \’我的网络\’,

\’id\’: \’e4570a3521b62469239f9a0a883abd67b7c58c8bdae813e189416995f4a4d910\’,

\’C

reated\”: \”2024-07-03T18:09:46.89449804+08:00\”,
\”Scope\”: \”local\”,
\”Driver\”: \”bridge\”,
\”EnableIPv6\”: false,
\”IPAM\”: {
\”Driver\”: \”default\”,
\”Options\”: {},
\”Config\”: [
{
\”Subnet\”: \”172.18.0.0/16\”,
\”Gateway\”: \”172.18.0.1\”
}
]
},
\”Internal\”: false,
\”Attachable\”: false,
\”Ingress\”: false,
\”ConfigFrom\”: {
\”Network\”: \”\”
},
\”ConfigOnly\”: false,
\”Containers\”: {
\”2084fabb416f715dbaac2d417da30d580103566cd083d7f7f4f5ec957138352b\”: {
\”Name\”: \”sspuweb_8008\”,
\”EndpointID\”: \”5d7ddf1d91fc17970a9bf0ea94f64e02e8e282f2a48303e9c29c3662d5134bd8\”,
\”MacAddress\”: \”02:42:ac:12:00:02\”,
\”IPv4Address\”: \”172.18.0.2/16\”,
\”IPv6Address\”: \”\”
}
},
\”Options\”: {},
\”Labels\”: {}
}
]
4. `docker network rm`:删除一个已存在的Docker网络。
例如:`docker network rm my-network`
用途:删除名为\”my-network\”的Docker网络,该网络及其相关联的容器将被移除,停止容器之间的通信和连接。
(4)docker容器网络配置
#参数
host模式:使用 –net=host 指定。
none模式:使用 –net=none 指定。
bridge模式:使用 –net=bridge 指定,默认设置,不需要加。
container模式:使用 –net=container:NAME_or_ID 指定。
1、bridge驱动
Bridge 网络 (桥接网络):
– 适用环境:默认情况下,在单个 Docker 主机上运行的容器之间的通信。
– 创建方法:Bridge 网络是 Docker 默认的网络类型,当创建容器时,
如果不指定网络类型,则会自动创建一个桥接网络并将容器连接到该网络上。
Docker默认网络模式是bridge模式, docker0网桥是在docker daemon启动时自动创建的,
之后创建的docker容器都会在docker0子网范围内选取一个未占用的ip并连接到docker0网桥上,
docker0以 veth pair 连接各容器的网络,容器中的数据通过docker0网桥转发到eth0网卡上。
veth pair:就是一对的虚拟设备接口,它都是成对出现的。一端连着协议栈,一端彼此相连着。
docker0 网桥的概念等同于交换机,为连在其上的设备转发数据帧。
网桥上的 veth 网卡设备相当于交换机上的端口,可以将多个容器或虚拟机连接在其上,
这些端口工作在二层(数据链路层),所以是不需要配置IP信息的。
下图docker0网桥就为连在其上的容器转发数据帧,使得同一台宿主机上的Docker 容器
之间可以相互通信。docker0是普通的Linux网桥,它是可以在上面配置IP的,
可以认为其内部有一个可以用于配置IP信息的网卡接口。在Docker的桥接 网络模式中,
docker0的IP地址作为连于之上的容器的默认网关地址存在。
外面的机器是如何访问Docker容器的服务?
创建一个web应用的容器,将容器的80端口映射到主机的80端口
docker run –name=nginx_bridge –net=bridge -p 80:80 -d nginx
–查看Iptable规则的变化:
-A DOCKER ! -i docker0 -p tcp -m tcp –dport 80 -j DNAT –to-destination 172.17.0.2:80
此条规则就是对主机eth0收到的目的端口为80的tcp流量进行DNAT转换,
将流量发往172.17.0.2:80,也就是我们上面创建的Docker容器。
所以,外界只需访问10.10.101.105:80就可以访问到容器中的服务。
无需加–net=bridge参数。
创建容器方法
docker run -dit -p 3306:3306 –name imagename –restart always imagename:tag(版本号)
访问方式:宿主机IP:映射端口
–2、host驱动
Host 网络 (主机网络):
– 适用环境:希望容器与主机共享网络栈,容器需要直接访问主机网络接口的场景。
– 创建方法:在创建容器时,使用 `–network=host` 参数将容器连接到主机网络。
host模式可以让容器共享宿主机网络栈,外部主机与容器直接通信,
但是容器的网络缺少隔离性。
host网络模式在创建时需指定: –network=host
##创建容器,指定参数
docker run -dit –network host –name imagesname
–3、none
None 网络:
– 适用环境:不希望容器连接到任何网络的场景,容器内部只使用本地回环地址进行通信。
– 创建方法:在创建容器时,使用 `–network=none` 参数将容器连接到无网络环境。
none模式是指禁用网络功能,只有lo接口,在容器创建时使用。
##创建容器,指定参数–network=none
docker run -it –rm –network none busybox
–4、自定义网络(Custom Network)
– 创建自定义网络(也属于bridge模式):
docker network create my-custom-network
还可以自定义Docker使用的IP地址、DNS信息、网桥等
–##指定网关以及IP范围
docker network create –subnet=192.168.1.0/24 –gateway=192.168.1.1 image-network
–##指定子网以及IP范围
docker network create –subnet 172.20.0.0/16 –ip-range 172.20.240.0/20 image-network
–在自定义网络上启动容器:
docker run -d –name imagename –network images-network imagename:tag
–5、Overlay网络(Overlay Network)
Overlay 网络 (覆盖网络):
– 适用环境:在多个 Docker 主机上运行的容器之间的跨主机通信,
如容器集群或分布式应用程序。
– 创建方法:使用 `docker network create` 命令并选择 `–driver overlay`
参数来创建 Overlay 网络。
–创建覆盖网络:
docker network create –driver overlay my-overlay-network
–在覆盖网络上启动容器:
docker run -d –name my-container –network my-overlay-network my-image
6、 MACVLAN网络(MACVLAN Network)
Macvlan 网络:
– 适用环境:希望容器能够直接与物理网络接口进行通信,或希望每个容器
具有独立的 IP 地址的场景。
– 创建方法:使用 `docker network create` 命令并选择
`–driver macvlan` 参数来创建 Macvlan 网络。
Macvlan是一个新的尝试,是真正的网络虚拟化技术的转折点。
Linux实现非常轻量级,因为与传统的Linux Bridge隔离相比,
它们只是简单地与一个Linux以太网接口或子接口相关联,以实现网络之间的分离
和与物理网络的连接。
Macvlan提供了许多独特的功能,并有充足的空间进一步创新与各种模式。
这些方法的两个高级优点是绕过Linux网桥的正面性能以及移动部件少的简单性。
删除传统上驻留在Docker主机NIC和容器接口之间的网桥留下了一个非常简单的设置,
包括容器接口,直接连接到Docker主机接口。由于在这些情况下没有端口映射,
因此可以轻松访问外部服务。
– 创建MACVLAN网络:
docker network create -d macvlan –subnet=192.168.1.0/24 –gateway=192.168.1.1 -o parent=eth0 my-macvlan-network
– 在MACVLAN网络上启动容器:
docker run -d –name my-container –network my-macvlan-network my-image
(6)docker删除网路重新连接服务
在docker中,无法直接重启一个已经创建的网络,但可以通过以下步骤间接地
重新创建和连接网络来实现类似的效果:
1. 断开容器与网络的连接:首先,要断开当前连接到该网络的容器,可以使用以下命令:

docker network disconnect <网络名称> <容器名称或ID>
##例如
docker network disconnect zabbix-network zabbix-mysql
docker network disconnect zabbix-network zabbix-server
docker network disconnect zabbix-network zabbix-web
docker network disconnect zabbix-network zabbix-java-gateway
2. 删除网络:接下来,删除该网络:

docker network rm <网络名称>
–##例如
docker network rm zabbix-network
3. 重新创建和连接网络:最后,重新创建网络并将容器连接到该网络:
docker network create <网络名称>
docker network connect <网络名称> <容器名称或ID>
–##例如
docker network connect zabbix-network zabbix-mysql
docker network connect zabbix-network zabbix-server
docker network connect zabbix-network zabbix-web
docker network connect zabbix-network zabbix-java-gateway
请注意,此过程中断开的连接和重新创建的网络可能会导致与网络相关的服务中断和清除,
因此在执行此操作之前,请确保已了解相关的服务和应用程序的影响以及可能需要
重新配置和启动。
此外,重启Docker守护程序或重启Docker服务并不会直接重启现有的网络,
因此无法实现直接重启网络的操作。
4.修改容器IP
在Docker中,可以通过以下方法修改Docker容器中服务的IP地址:
1. 停止并移除容器:首先,要修改容器的IP地址,需要先停止并移除容器。
可以使用以下命令:
docker stop <容器名称或ID>
docker rm <容器名称或ID>
2. 创建具有固定IP的新容器:接下来,创建一个新的容器,并指定固定的IP地址。
可以使用以下命令:
docker run -d –net=<网络名称> –ip=<新的IP地址> –name=<容器名称> <镜像名称>
在上述命令中,将 `<网络名称>` 替换为容器应连接的网络名称,
`<新的IP地址>` 替换为要为该容器分配的新IP地址,
`<容器名称>` 替换为新容器的名称,
`<镜像名称>` 替换为要使用的镜像名称。
3. 配置服务的IP地址:根据您的具体服务和配置方式,在容器中相应地修改服务的IP地址设置。
这可能涉及到编辑配置文件、运行特定的命令或使用相关工具来更改服务配置。
4. 启动新容器:完成对服务IP地址的修改后,使用以下命令启动新容器:
docker start <容器名称>
请注意,确保新的IP地址并不与网络中的其他设备发生冲突,并在修改配置时,
根据具体的服务要求进行相应的调整。
(6)查看docker中的容器使用的是哪种网络
要查看Docker容器使用的网络,可以使用以下命令:
1. 首先,列出当前正在运行的Docker容器。可以使用以下命令:
docker ps
这将列出所有正在运行的Docker容器,包括容器的ID和名称。
2. 然后,查看具体容器的网络信息。选择要查看的容器的ID或名称,然后运行以下命令:
docker inspect <container_id_or_name> | grep \”NetworkMode\”
这将返回有关容器网络的信息,其中包括“NetworkMode”字段
该字段指示容器正在使用的网络模式,例如“bridge”、“host”或“none”。
另外,可以替代使用`grep`命令查找容器网络模式的“NetworkMode”字段,使用以下命令:
docker inspect –format=\'{{.HostConfig.NetworkMode}}\’ <container_id_or_name>
这将直接返回容器的网络模式。
通过以上命令,您可以查看Docker容器使用的网络模式。
#以上关于【docker】容器内部的网络的相关内容来源网络仅供参考,相关信息请以官方公告为准!

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92905.html

Like (0)
CSDN的头像CSDN
Previous 2024年7月4日
Next 2024年7月4日

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注