您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

Docker容器网络实操教程

时间:2021-03-10 10:38:02  来源:今日头条  作者:虫虫安全

虚拟技术和云飞速发展的今天,云和容器已经深入人心,每个IT人都或多或少的使用容器和云。但是用归用,很多人对其底层的原理确实知之甚少。很多人想把容器当成虚拟机来用,却遭遇大大的阻碍,如果理解容器原理的话,你就会发现容器实际上是孤立且受限制的linux进程,和其他进程也一样。运行容器实际上并不需要镜像,相反,要构建镜像,则必须要运行一些容器。但是不敢怎么着,容器是要用来使用的,必然要联网的,所以容器联网的原理是有限需要了解的,为此本文我们就来一起学习容器的网络原理。

Docker容器网络实操教程

 

网络命名空间

大家可能都知道Linux网络实际上是在内存空间的堆栈数据,包括Linux网络设备的集合、路由规则、netfilter hook集等(包括iptables规则定义的)。为了获取Linux的这些网络堆栈数据,需要用到几个工具,包括netstat –ie ,ifconfig,ip link,ip route和iptables –list-rules等。

ip link

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000

link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000

link/ether 52:54:00:e3:2a:77 brd ff:ff:ff:ff:ff:ff

ip route

default via 10.0.2.2 dev eth0 proto dhcp metric 100

10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100

iptables –list-rules
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

用于容器隔离的Linux命名空间之一称为网络命名空间。从逻辑上讲,网络命名空间是网络堆栈的另一个副本,有其自己的路由,防火墙规则和网络设备。为了简单起见,这是我们将在本文中使用的唯一命名空间。与其创建完全隔离的容器,不如将范围限制为仅网络堆栈。ip工具在现在OS默认自带的iproute2集合的一部分,这些工具可以用来创建网络命名空间。

sudo ip netns add netns0
ip netns
netns0

为了使用这个刚新建的的命名空间netns0,可以使用Linux命令称nsenter。它输入一个或多个指定的命名空间,然后执行给定的程序:

sudo nsenter --net=/var/run/netns/netns0 bash
ip link
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

从上面的输出中可以明显看出,在命名空间内运行的bash进程netns0看到了完全不同的网络堆栈。没有路由规则,也没有自定义iptables链,只有一个环回网络设备。

Docker容器网络实操教程

 

链接容器网络和主机网络

如果不能与专用网络堆栈通信,那么容器也就没啥用。为此Linux提供了合适的工具,虚拟以太网设备veth,这个设备是虚拟以太网设备,可以用来充当网络命名空间之间的隧道,以创建到另一个命名空间中的物理网络设备的桥梁,但也可以用作独立的网络设备。”

虚拟以太网设备需要成对使用,用下面命令创建一组互连的虚拟以太网设备veth0和ceth0:

sudo ip link add veth0 type veth peer name ceth0

然后查看网络信息

ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:e3:27:77 brd ff:ff:ff:ff:ff:ff
5: ceth0@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 66:2d:24:e3:49:3f brd ff:ff:ff:ff:ff:ff
6: veth0@ceth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 96:e8:de:1d:22:e0 brd ff:ff:ff:ff:ff:ff

双方veth0并ceth0创建所在的主机的网络堆栈后(也称为根网络命名空间)。要将根命名空间与该netns0命名空间连接,需要将其中一台设备保留在根命名空间中,然后将另一台设备移至netns0:

sudo ip link set ceth0 netns netns0

网络信息:

ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:e3:27:77 brd ff:ff:ff:ff:ff:ff
6: veth0@if5: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
link/ether 96:e8:de:1d:22:e0 brd ff:ff:ff:ff:ff:ff link-netns netns0

启用设备并分配给予适当的IP地址,其中一个设备上发生的数据包都会立即在连接两个命名空间的对等设备接收到:

sudo ip link set veth0 up
sudo ip addr add 172.18.0.11/16 dev veth0
sudo nsenter --net=/var/run/netns/netns0
ip link set lo up
ip link set ceth0 up
ip addr add 172.18.0.10/16 dev ceth0

这时候的网络信息

ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
5: ceth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
link/ether 66:2d:24:e3:49:3f brd ff:ff:ff:ff:ff:ff link-netnsid 0

图示:

Docker容器网络实操教程

 

为了检查连接性,我们从netns0(172.18.0.11),ping veth0(172.18.0.10)

ping -c 2 172.18.0.11
PING 172.18.0.11 (172.18.0.11) 56(84) bytes of data.
64 bytes from 172.18.0.11: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 172.18.0.11: icmp_seq=2 ttl=64 time=0.040 ms
--- 172.18.0.11 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 58ms
rtt min/avg/max/mdev = 0.038/0.039/0.040/0.001 ms

从根命名空间ping ceth0(172.18.0.10)

ping -c 2 172.18.0.10
PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
64 bytes from 172.18.0.10: icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from 172.18.0.10: icmp_seq=2 ttl=64 time=0.046 ms
--- 172.18.0.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 0.046/0.059/0.073/0.015 ms

同时,如果尝试从netns0命名空间访问其他任何地址是ping不通的。

ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:e3:27:77 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute eth0
valid_lft 84057sec preferred_lft 84057sec
inet6 fe80::5054:ff:fee3:2777/64 scope link
valid_lft forever preferred_lft forever
sudo nsenter --net=/var/run/netns/netns0
ping 10.0.2.15
connect: Network is unreachable
ping 8.8.8.8
connect: Network is unreachable

这是显而易见的,因为netns0路由表中根本没有这类数据包的路由。唯一的条目显示了如何连接172.18.0.0/16网络:

ip route
172.18.0.0/16 dev ceth0 proto kernel scope link src 172.18.0.10

Linux有很多设置路由表的方法。其中之一是从直接连接的网络接口提取路由。请记住,netns0命名空间创建后,其中的路由表为空。但是随后在ceth0此处添加了设备并为其分配了IP地址172.18.0.10/16。由于使用的不是简单的IP地址,而是地址和网络掩码的组合,因此网络堆栈设法从中提取路由信息。每个发往172.18.0.0/16网络的数据包都将通过ceth0设备发送。但是任何其他数据包将被丢弃。同样,根命名空间中新增加了一条路由:

ip route
172.18.0.0/16 dev veth0 proto kernel scope link src 172.18.0.11

我们知道如何隔离、虚拟化和连接Linux网络堆栈。

通过网桥(虚拟路由器)容器互联

容器化的整个思想归结为有效的资源共享。也就是说,每台机器显然不可能只有一个容器。相反,会尽最大可能在共享环境中运行更多的容器。试想,按照同样步骤,在上面的基础上,再增加第二个容器:

sudo ip netns add netns1
sudo ip link add veth1 type veth peer name ceth1
sudo ip link set ceth1 netns netns1
sudo ip link set veth1 up
sudo ip addr add 172.18.0.21/16 dev veth1
sudo nsenter --net=/var/run/netns/netns1
ip link set lo up
ip link set ceth1 up
ip addr add 172.18.0.20/16 dev ceth1

然后,检查连通性:

从netns1 ping 根命名空间:

ping -c 2 172.18.0.21
PING 172.18.0.21 (172.18.0.21) 56(84) bytes of data.
From 172.18.0.20 icmp_seq=1 Destination Host Unreachable
From 172.18.0.20 icmp_seq=2 Destination Host Unreachable
--- 172.18.0.21 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 55ms
pipe 2

ping不通,看一下路由:

ip route:
172.18.0.0/16 dev ceth1 proto kernel scope link src 172.18.0.20

有路有!

从根命名空间ping netns1:

ping -c 2 172.18.0.20
PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
From 172.18.0.11 icmp_seq=1 Destination Host Unreachable
From 172.18.0.11 icmp_seq=2 Destination Host Unreachable
--- 172.18.0.20 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 23ms
pipe 2

从netns0可以ping通veth1

sudo nsenter --net=/var/run/netns/netns0
ping -c 2 172.18.0.21
PING 172.18.0.21 (172.18.0.21) 56(84) bytes of data.
64 bytes from 172.18.0.21: icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from 172.18.0.21: icmp_seq=2 ttl=64 time=0.046 ms
--- 172.18.0.21 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 33ms
rtt min/avg/max/mdev = 0.037/0.041/0.046/0.007 ms

但是,也ping不同通netns1

ping -c 2 172.18.0.20
PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
From 172.18.0.10 icmp_seq=1 Destination Host Unreachable
From 172.18.0.10 icmp_seq=2 Destination Host Unreachable
--- 172.18.0.20 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 63ms
pipe 2

显然有问题了,netns1 ping不同根命名空间。由于两个容器都位于同一IP网络中172.18.0.0/16,所以可以用veth1和netns0容器与主机进行对话。什么导致以上问题呢?对问题出在路由冲突了!

检查根命名空间中的路由表:

ip route
172.18.0.0/16 dev veth0 proto kernel scope link src 172.18.0.11
172.18.0.0/16 dev veth1 proto kernel scope link src 172.18.0.21

在添加了第二veth对之后,根网络堆栈也添加新路由172.18.0.0/16 dev veth1 proto kernel scope link src 172.18.0.21,但这和已有的路由冲突了。如果删除第一条路由sudo ip route delete 172.18.0.0/16 dev veth0 proto kernel scope link src 172.18.0.11并重新检查连接性, netns1将恢复连接的连通性,netns0会处于不确定状态。

Docker容器网络实操教程

 

线上用上述方法,veth行不通了。这是就需要另外的可行方法了。这方法就是Linux网桥,另外一个虚拟化网络工具。Linux网桥的行为上类似于网络交换机。它在与其连接的接口之间转发数据包。并且由于它是交换机,因此可以在L2(即以太网)级别上进行操作。我们就来尝试网桥来建容器网络,先清空之前的网络命名空间:

sudo ip netns delete netns0
sudo ip netns delete netns1
sudo ip link delete veth0
sudo ip link delete ceth0
sudo ip link delete veth1
sudo ip link delete ceth1

快速重新创建两个容器。

sudo ip netns add netns0
sudo ip link add veth0 type veth peer name ceth0
sudo ip link set veth0 up
sudo ip link set ceth0 netns netns0
sudo nsenter --net=/var/run/netns/netns0
ip link set lo up
ip link set ceth0 up
ip addr add 172.18.0.10/16 dev ceth0
sudo ip netns add netns1
sudo ip link add veth1 type veth peer name ceth1
sudo ip link set veth1 up
sudo ip link set ceth1 netns netns1
sudo nsenter --net=/var/run/netns/netns1
ip link set lo up
ip link set ceth1 up
ip addr add 172.18.0.20/16 dev ceth1

确保主机上没有新路由:

ip route
default via 10.0.2.2 dev eth0 proto dhcp metric 100
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 metric 100

最后,创建网桥接口:

sudo ip link add br0 type bridge
sudo ip link set br0 up

附加veth0和veth1到网桥br0:

sudo ip link set veth0 master br0
sudo ip link set veth1 master br0

新的网络拓扑图:

Docker容器网络实操教程

 

检查容器之间的连通性:

sudo nsenter --net=/var/run/netns/netns0
ping -c 2 172.18.0.20
PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
64 bytes from 172.18.0.20: icmp_seq=1 ttl=64 time=0.259 ms
64 bytes from 172.18.0.20: icmp_seq=2 ttl=64 time=0.051 ms
--- 172.18.0.20 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 0.051/0.155/0.259/0.104 ms
sudo nsenter --net=/var/run/netns/netns1
ping -c 2 172.18.0.10
PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
64 bytes from 172.18.0.10: icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from 172.18.0.10: icmp_seq=2 ttl=64 time=0.089 ms
--- 172.18.0.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 36ms
rtt min/avg/max/mdev = 0.037/0.063/0.089/0.026 ms

OK!一切正常。这种方法可行。由于还没有配置veth0和veth1。分配给ceth0和ceth1两个IP地址。由于它们都在同一以太网段上(请记住,我们已将它们连接到虚拟交换机),因此在L2级别具有连通性:

sudo nsenter --net=/var/run/netns/netns0
ip neigh
172.18.0.20 dev ceth0 lladdr 6e:9c:ae:02:60:de STALE

 

sudo nsenter --net=/var/run/netns/netns1
ip neigh
172.18.0.10 dev ceth1 lladdr 66:f3:8c:75:09:29 STALE

容器链接外网(IP路由和伪装)

现在容器可以互通互联。但是与主机(即根命名空间)还不能连通:

sudo nsenter --net=/var/run/netns/netns0
ping 10.0.2.15 # eth0 address
connect: Network is unreachable

查看路由:

ip route
172.18.0.0/16 dev ceth0 proto kernel scope link src 172.18.0.10

根命名空间无法与容器无路由:

ping -c 2 172.18.0.10
PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
From 213.51.1.123 icmp_seq=1 Destination Net Unreachable
From 213.51.1.123 icmp_seq=2 Destination Net Unreachable
--- 172.18.0.10 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 3ms
ping -c 2 172.18.0.20
PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
From 213.51.1.123 icmp_seq=1 Destination Net Unreachable
From 213.51.1.123 icmp_seq=2 Destination Net Unreachable
--- 172.18.0.20 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 3ms

为了在根和容器命名空间之间建立连接,需要将IP地址分配给网桥网络接口:

sudo ip addr add 172.18.0.1/16 dev br0

将IP地址分配给网桥接口后,便在主机路由表上获得了一条路由:

ip route
172.18.0.0/16 dev br0 proto kernel scope link src 172.18.0.1
ping -c 2 172.18.0.10
PING 172.18.0.10 (172.18.0.10) 56(84) bytes of data.
64 bytes from 172.18.0.10: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from 172.18.0.10: icmp_seq=2 ttl=64 time=0.049 ms
--- 172.18.0.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 11ms
rtt min/avg/max/mdev = 0.036/0.042/0.049/0.009 ms
ping -c 2 172.18.0.20
PING 172.18.0.20 (172.18.0.20) 56(84) bytes of data.
64 bytes from 172.18.0.20: icmp_seq=1 ttl=64 time=0.059 ms
64 bytes from 172.18.0.20: icmp_seq=2 ttl=64 time=0.056 ms
--- 172.18.0.20 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 4ms
rtt min/avg/max/mdev = 0.056/0.057/0.059/0.007 ms

容器也具有ping桥接接口的功能,但是仍然无法与主机的接口eth0连接,需要为容器添加默认路由:

sudo nsenter --net=/var/run/netns/netns0
ip route add default via 172.18.0.1
ping -c 2 10.0.2.15
PING 10.0.2.15 (10.0.2.15) 56(84) bytes of data.
64 bytes from 10.0.2.15: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from 10.0.2.15: icmp_seq=2 ttl=64 time=0.053 ms
--- 10.0.2.15 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 14ms
rtt min/avg/max/mdev = 0.036/0.044/0.053/0.010 ms

这配置更改基本上将主机变成了路由器,并且网桥接口成为了容器的默认网关,拓扑图示:

Docker容器网络实操教程

 

容器现在与根命名空间相连,接着我们配置让他们可以对外链接。默认情况下,在Linux中禁用数据包转发(即路由器功能),我们需要打开它:

sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

然后,检查连接性:

sudo nsenter --net=/var/run/netns/netns0
ping 8.8.8.8

好吧,有问题,仍然不通。由于容器的IP地址是私有的,容器可以数据包发送到外界,但是目标服务器将无法将数据包发送回容器。为了解决此问题,需要进行网络地址转换(NAT)。在进入外部网络之前,由容器发起的数据包将其源IP地址替换为主机的外部接口地址。主机还将跟踪所有现有的映射,并在到达主机时将还原IP地址,然后再将数据包转发回容器。听起来很复杂,但是做起来不难,可以使用iptables进行转化,只需要一个命令即可实现:

sudo iptables -t nat -A POSTROUTING -s 172.18.0.0/16 ! -o br0 -j MASQUERADE

该命令非常简单。在nat表的POSTROUTING链中添加了一条新规则,要求伪装源自172.18.0.0/16网络的所有数据包,但不伪装网桥接口。

再,检查连接性:

sudo nsenter --net=/var/run/netns/netns0
ping -c 2 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=61 time=43.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=61 time=36.8 ms
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 36.815/40.008/43.202/3.199 ms

注意,默认情况会遵循,允许采取策略,请不要实际生产环境中使用,这非常危险。Docker默认情况下限制所有内容,然后仅对已知路径启用路由。

配置对外访问(端口发布)

将容器端口发布到主机的某些(或全部)接口是一种已知的做法。但是端口发布的真正含义是什么?

假设有一个在容器中运行的服务器:

sudo nsenter --net=/var/run/netns/netns0
Python3 -m http.server --bind 172.18.0.10 5000

现在用curl尝试从主机向该服务器进程发送HTTP请求:

curl 172.18.0.10:5000
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

但是,要从外部访问该服务器,要怎么访问呢?现在对外唯一IP地址是主机的外部接口地址eth0:

curl 10.0.2.15:5000
curl: (7) Failed to connect to 10.0.2.15 port 5000: Connection refused

因此,需要找到一种方法,将到达主机eth0接口上端口5000的所有数据包转发到172.18.0.10:5000目的地。换句话说,需要在主机的接口上发布容器的端口5000 eth0。这也可以使用iptables。

sudo iptables -t nat -A PREROUTING -d 10.0.2.15 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 172.18.0.10:5000
sudo iptables -t nat -A OUTPUT -d 10.0.2.15 -p tcp -m tcp --dport 5000 -j DNAT --to-destination 172.18.0.10:5000

此外,还要启用iptables拦截桥接网络上的流量:

sudo modprobe br_netfilter

Try,again:

curl 10.0.2.15:5000
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

ok了

了解Docker网络驱动程序

现在,我们再深入一下,了解一些Docker网络模式。首先从--network host模式开始。尝试比较以下命令ip link和的输出sudo docker run -it --rm --network host alpine ip link。实际上,两者是完全一样的。即在该host模式下,Docker根本不使用网络命名空间隔离,并且容器在根网络命名空间中工作,并与主机共享网络堆栈。

下一个要检查的模式是--network none。该sudo docker run -it --rm --network none alpine ip link命令的输出仅显示单个环回网络接口。这与即在添加任何veth设备之前,新创建的网络命名空间非常相似。

最后但并非最不重要的一点是--network bridge(默认)模式。这就是本文中我们使用的方法。

无特权容器和网络

本文中我们使用了很多sudo操作,如果没有root特权就无法配置网络。另外一个云原生标准的容器管理器podman,可以作为docker管理器替换。虫虫之前的文章中对它做过专门介绍。podman一个不错的功能之一就是它专注于无root容器。podman建立根网络的方法非常接近docker,为了实现无root容器,podman依赖于slirp4netns项目:

从Linux 3.8开始,非特权用户可以与user_namespaces(7)一起创建network_namespaces(7)。但是,非特权网络命名空间并不是很有用,因为在主机和网络命名空间上创建veth(4)对仍然需要root特权。(即没有互联网连接)

slirp4netns允许通过将网络命名空间中的TAP设备连接到用户模式TCP / IP堆栈(“slirp”),以完全无特权的方式将网络命名空间连接到Internet。

结论

本文中,我们介绍了在容器网络的详细实现细节方法,了解这些细节对我们熟悉容器网络和排查容器网络相关故障时候非常有意义。当然组织容器网络的方法不可能的只有这种方法(当然,可能是使用最广泛的一种方法)。实际上,还有其他很多的实现方式方式,可以通过官方或第三方插件实现,有兴趣可以查看相关的文档。



Tags:Docker容器   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
对于初学者来说,刚刚接触docker会有点迷,特别是镜像与容器。其实我们可以理解镜像与容器为一对多的关系。下图错误的示范,为什么是错误的呢?因为可以通过一个镜像确实可以启动...【详细内容】
2021-06-09  Tags: Docker容器  点击:(136)  评论:(0)  加入收藏
Photo by William Warby on Unsplash您是否曾经想过为什么您的单应用程序Docker容器会增长到400 MB? 或者,也许为什么一个只有几十MB的应用程序二进制文件会生成一个MB的Docke...【详细内容】
2021-04-02  Tags: Docker容器  点击:(233)  评论:(0)  加入收藏
虚拟技术和云飞速发展的今天,云和容器已经深入人心,每个IT人都或多或少的使用容器和云。但是用归用,很多人对其底层的原理确实知之甚少。很多人想把容器当成虚拟机来用,却遭遇大...【详细内容】
2021-03-10  Tags: Docker容器  点击:(230)  评论:(0)  加入收藏
前言我之前发过几篇文章,比如搭建Zabbix监控系统、搭建ELK日志分析平台等,那有不少网友就给我留言了,说不用这么麻烦,用Docker部署就可以了,分分钟就搞定的事情。Docker真的有这...【详细内容】
2021-01-12  Tags: Docker容器  点击:(158)  评论:(0)  加入收藏
现在的项目部署运维中,使用Docker容器越来越多,Docker给我们提供创建容器的方式也有好几种,主要是docker run命令、Dockerfile文件、docker-compose三种方式,一个比一个方便。我...【详细内容】
2020-11-20  Tags: Docker容器  点击:(113)  评论:(0)  加入收藏
你是否还在大量控制台窗口中监控容器,还是对使用终端命令充满热情?而使用Docker的图形用户界面(GUI)工具,则可以更简单的对容器进行管理,并提高效率。而且它们都是免费的。Portain...【详细内容】
2020-11-16  Tags: Docker容器  点击:(114)  评论:(0)  加入收藏
本篇文章我们将讲解跨主机网络的容器通信实现,涉及到Docker overlay网络与MacVlan网络的解决方案,下面我们就一起来学习吧!01 Docker跨主机网络通信跨主机的容器网络方案主要有...【详细内容】
2020-10-26  Tags: Docker容器  点击:(92)  评论:(0)  加入收藏
接着文章「系统架构」如何使用Dockerfile制作Docker容器?(1)我们继续介绍ENV、ARG、VOLUME、EXPOSE、WORKDIR、USER、HEALTHCHECK、ONBUILD几个命令。7、ENV这个指令很简单,就...【详细内容】
2020-08-16  Tags: Docker容器  点击:(77)  评论:(0)  加入收藏
Docker让开发者可以打包应用程序及依赖包到可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。许多开发者关心如何在Docker容器中实现软件加密及授...【详细内容】
2020-08-07  Tags: Docker容器  点击:(98)  评论:(0)  加入收藏
1 前言了解Docker容器的运行环境非常重要,我们把应用放在容器里执行,环境变量会直接影响程序的执行效果。所以我们要知道容器内部的环境变量,也要知道如何改变这些环境变量。2...【详细内容】
2020-08-05  Tags: Docker容器  点击:(66)  评论:(0)  加入收藏
▌简易百科推荐
一、为什么要搭建主从架构呢1.数据安全,可以进行数据的备份。2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器。从而缓解数据...【详细内容】
2021-12-15  实战Java    Tags:Docker   点击:(10)  评论:(0)  加入收藏
在网页中渲染公式一直是泛学术工具绕不开的一个功能,最近更新产品功能,正巧遇到了这个需求,于是使用容器方式简单实现了一个相对靠谱的公式渲染服务。分享出来,希望能够帮到有类...【详细内容】
2021-12-01  编程菌zfn    Tags:Docker   点击:(10)  评论:(0)  加入收藏
1.1 docker命令直接部署1.1.1 拉取镜像docker pull wurstmeister/zookeeperdocker pull wurstmeister/kafka1.1.2 启动zookeeper容器docker run -d --name myzookeeper -p 2...【详细内容】
2021-11-15  无    Tags:docker   点击:(47)  评论:(0)  加入收藏
01 前言 顺着docker的发展,很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试,这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以...【详细内容】
2021-10-29  小码哥聊软件测试    Tags:Docker   点击:(42)  评论:(0)  加入收藏
因为你懂得的原因,下载docker镜像速度非常喜感,故收集几个国内常用的docker镜像。Docker中国区官方镜像地址:https://registry.docker-cn.com网易163的镜像http://hub-mirror.c...【详细内容】
2021-10-28  抓蛙程序猿    Tags:docker   点击:(48)  评论:(0)  加入收藏
环境:Spring5.3.10通常,应用程序开发人员不需要对ApplicationContext实现类进行子类化。相反,SpringIOC容器可以通过插入特殊集成接口的实现来扩展。使用BeanPostProcessor自定...【详细内容】
2021-10-26  Java网络研发架构师    Tags:Spring   点击:(33)  评论:(0)  加入收藏
我们在很多场景下都需要做笔记,来对抗遗忘,一份好的笔记不仅能在需要的时候供我们查阅,也能帮助我们归纳整理知识提高做事效率。 目前市面上有很多云笔记软件,体验上各有不同,但...【详细内容】
2021-10-11  运维贼船    Tags:docker   点击:(61)  评论:(0)  加入收藏
1. Nacos官网Nacos Docker 快速开始2. Clone 项目git clone https://github.com/nacos-group/nacos-docker.git3. cd 到nacos-docker 路径下 直接启动即可cd nacos-dockerdo...【详细内容】
2021-09-16  程序狗爱化妆    Tags:Nacos   点击:(109)  评论:(0)  加入收藏
今天不做保姆级教程,分享奶爸常用、好用的Docker应用。有了这些Docker,Nas的可玩性会大幅提高,有时候奶爸也在想,刨去官方套件不考虑的话,Nas真的是差不多。如果小伙伴们有需要,后...【详细内容】
2021-09-03  晋升奶爸的垃圾佬    Tags:Docker   点击:(167)  评论:(0)  加入收藏
环境要求 ubuntu系统:20.04 docker版本:20.10.7 redis版本:6.0.6步骤由于我这里已经有相应的redis镜像,这里就不记录了,关于docker一些基础知识可以看我以前的笔记开启3台re...【详细内容】
2021-07-26  石老师小跟班    Tags:Redis主从复制   点击:(117)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条