Always keep|

wtdata

园龄:2年4个月粉丝:3关注:1

六_docker网络之跨主机网络通信(1)

Docker跨主机网络通信

常见的跨主机通信方案主要有以下几种:

形式 描述
Host模式 容器直接使用宿主机的网络,这样天生就可以支持跨主机通信。这样方式虽然可以解决跨主机通信的问题,但应用场景很有限,容易出现端口冲突,也无法做到隔离网络环境,一个容器崩溃很可能引起整个宿主机的崩溃。
端口绑定 通过绑定容器端口到宿主机端口,跨主机通信时使用:主机IP:端口的方式访问容器中的服务。显然,这种方式仅能支持网络栈的4层及以上的应用,并且容器与宿主机紧耦合,很难灵活的处理问题,可扩展性不佳。
定义容器网络 使用Open vSwitch或Flannel等第三方SDN工具,为容器构建可以跨主机通信的网络环境。 这类方案一般要求各个主机上的Dockero网桥的cidr不同,以避免出现IP冲突的问题,限制容器在宿主机上可获取的IP范围。并且在容器需要对集群外提供服务时,需要比较复杂的配置,对部署实施人员的网络技能要求比较高。

容器网络发展到现在,形成了两大阵营:

  1. Do``c``k``e``rC``NM;
  2. Goo``g``leCo``r``e``o``sKuberenetes主导的CNI
    CNMCNI是网络规范或者网络体系,并不是网络实现因此并不关心容器网络的实现方式( Flannel或者Calico等), CNM和CNI关心的只是网络管理。
网络类型 描述
CNM (Container Network Model) CNM的优势在于原生,容器网络和Docker容器,生命周期结合紧密;缺点是被Docker “绑架”。支持CNM网络规范的容器网络实现包括:Docker Swarm overlay, Macvlan & IP networkdrivers, Calico, Contiv, Weave等。
CNI ( Container Network Interface) CNI的优势是兼容其他容器技术(如rkt)及上层编排系统(Kubernetes&Mesos),而且社区活跃势头迅猛;缺点是非Docker原生。支持CNI网络规范的容器网络实现包括: Kubernetes、 Weave,Macvlan, Calico, Flannel, Contiv.Mesos CNI等。

但从 网络****实现角度,又可分为:

网络实现角度 描述
隧道方案 隧道方案在laas层的网络中应用也比较多,它的主要缺点是随着节点规模的增长复杂度会提升,而且出了网络问题后跟踪起来比较麻烦,大规模集群情况下这是需要考虑的一个问题。
路由方案 一般是基于3层或者2层实现网络隔离和跨主机容器互通的,出了问题也很容易排查。
Calico :基于BGP协议的路由方案,支持很细致的ACL控制,对混合云亲和度比较高。
Macvlan:从逻辑和Kernel层来看,是隔离性和性能最优的方案。基于二层隔离,所以需要一层路由器支持,大多数云服务商不支持,所以混合云上比较难以实现。

Docker主机之间容器通信解决方案:

  • 桥接宿主机网络
  • 端口映射
  • docker网络驱动:
    1、 Overlay:基于VXLAN封装实现Docker原生Overlay网络。

2、Macvlan:Docker主机网卡接口逻辑上分为多个子接口,每个子接口标识一个VLAN。容器接口直接连接Docker主机网卡接口,通过路由策略转发到另一台Docker主机。

第三方网络项目:

隧道方案:

Flannel:支持UDP和VXLAN封装传输方式

Weave:支持UDP(sleeve模式)和VXLAN(优先fastdp模式)

OpenvSwitch:支持VXLAN和GRE协议

路由方案:

Calico:支持BGP协议和IPIP隧道。每台宿主机作为虚拟路由,通过BGP协议实现不同主机容器间通信。

(1)overlay网络模式

在早期的docker版本中,是不支持跨主机通信网络驱动的,也就是说如果容器部署在不同的节点(公网或局域网里不同的主机)上面,只能通过暴露端口到宿主机上,在通过宿主机之间进行通信。随着dockerswarm集群的推广,docker有了自己的跨主机通信的网络驱动,名叫overlay,overlay网络模型是swarm集群容器通信的载体,将服务加入到同一个网段的overlay网络上,服务与服务之间就能够通信。所以,Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。

内置跨主机的网络通信一直是Docker备受期待的功能,在1.9版本之前,社区中就已经有许多第三方的工具或方法尝试解决这个问题,例如Macvlan、Pipework、Flannel、Weave等。虽然这些方案在实现细节上存在很多差异,但其思路无非分为两种: 二层VLAN网络和Overlay网络.

简单来说,二层VLAN网络解决跨主机通信的思路是把原先的网络架构改造为互通的大二层网络,通过特定网络设备直接路由,实现容器点到点的之间通信。这种方案在传输效率上比Overlay网络占优,然而它也存在一些固有的问题。这种方法需要二层网络设备支持,通用性和灵活性不如后者。由于通常交换机可用的VLAN数量都在4000个左右,这会对容器集群规模造成限制,远远不能满足公有云或大型私有云的部署需求; 大型数据中心部署VLAN,会导致任何一个VLAN的广播数据会在整个数据中心内泛滥,大量消耗网络带宽,带来维护的困难。相比之下,Overlay网络是指在不改变现有网络基础设施前提下,通过某种约定通信协议,把二层报文封装在IP报文之上新的数据格式。这样不但能够充分利用成熟的IP路由协议进程数据分发;而且在Overlay技术中采用扩展的隔离标识位数能够突破VLAN的4000数量限制支持高达16M的用户,并在必要时将广播流量转化为组播流量,避免广播数据泛滥。

因此,Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。

按照实现原理即可分为直接路由方式、桥接方式(例如pipework)、Overlay隧道方式(如flannel、ovs+gre)****等。

1、直路由

通过在Docker主机上添加静态路由实现跨宿主机通信:

图片

容器在两个跨主机进行通信的时候,是使用overlay network这个网络模式进行通信;如果使用host也可以实现跨主机进行通信,直接使用这个物理的ip地址就可以进行通信。overlay它会虚拟出一个网络比如10.0.2.3这个ip地址。在这个overlay网络模式里面,有一个类似于服务网关的地址,然后把这个包转发到物理服务器这个地址,最终通过路由和交换,到达另一个服务器的ip地址。

图片

实验:

如下图所示,我们有两个物理主机1和主机2,我们在宿主机上启动一个centos容器,启动成功之后,两个容器分别运行在两个宿主机上,默认的IP地址分配如图所示。这也是docker自身的默认网络。

图片

此时两台主机上的Docker容器可以通过各自主机中添加路由的方式来实现两个centos容器之间的通信。由于使用容器的IP进行路由,就需要便面不同主机上的容器使用相同的IP,为此我们应该为不同的主机分配不同的子网来保证。于是我们构造两个容器之间通信的路由方案:

图片

各项配置如下:

  • 主机1的IP地址为:192.168.72.130

  • 主机2的IP地址为:192.168.72.137

  • 为主机1上的Docker容器分配的子网:10.0.128.0/24

  • 为主机2上的Docker容器分配的子网:10.0.129.0/24
    这样配置之后,两恶搞主机山过的Docker容器就肯定不会使用相同的IP地址从而避免了IP冲突。之后我们需要定义路由规则:

  • 所有目的地址为10.0.128.0/24的包都被转发到主机1上

  • 所有目的地址为10.0.129.0/24的包都被转发到主机2上
    综上所述:数据包在两个容器间的通信过程如下:

从主机1的容器发往主机2的容器的数据包,首先发往container1的网关docker0,然后通过查找主机1的路由得知需要将数据包发给主机2,数据包到达主机2后再转发给主机2的docker0,最后将器数据包转发到container1里,反向原理相同。

实验环境:

操作系统 服务器地址 container地址
centos7 192.168.72.130 10.0.128.2
centos7 192.168.91.137 10.0.129.2

由于docker默认的网关地址为172.17.0.0/24,我们需要配置两台主机的网段必须为10.0.128.2和10.0.129.2。有2种方式:

一、将两台主机的ip地址改为静态ip地址

主机1:
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.72.130
NETMASK=255.255.255.0
GATEWAY=192.168.72.2
DNS1=114.114.114.114
:wq
[root@localhost ~]# systemctl restart network
主机2:
[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.72.137
NETMASK=255.255.255.0
GATEWAY=192.168.72.2
DNS1=114.114.114.114
:wq
[root@localhost ~]# systemctl restart network

二、修改docker0的默认网段

修改方式有两种:

1、创建一个docker网桥

主机1:
docker network create --driver bridge --subnet 10.0.128.0/24 --gateway=10.0.128.1 mynetwork
主机2:
docker network create --driver bridge --subnet 10.0.129.0/24 --gateway=10.0.129.1 mynetwork

2.修改docker0的网段(我们选用这种)

1、编辑 /etc/docker/daemon.json
主机1:
{
        "bip":"10.0.128.1/24"

}
:wq
主机2:
{
        "bip":"10.0.129.1/24"

}
:wq
2、将我们设置的参数生效并重启docker
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start docker
3、查看两个主机的IP地址是否改变。
主机1:
[root@localhost ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.0.128.1  netmask 255.255.255.0  broadcast 10.128.0.255
        ether 02:42:3c:c9:45:0d  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
主机2:
[root@localhost ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 10.0.129.1  netmask 255.255.255.0  broadcast 10.129.0.255
        ether 02:42:e2:09:e3:ec  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

三、添加路由规则

1.查看路由表
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.72.2    0.0.0.0         UG    100    0        0 ens33
10.128.0.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
192.168.72.0    0.0.0.0         255.255.255.0   U     100    0        0 ens33
默认只有自己本身的路由,如果需要访问10.0.129.0/24网段,需要添加路由。
2.添加路由规则
2.1.主机1添加路由规则
route add -net 10.0.129.0/24 gw 192.168.72.137
gw表示下一跳地址,这里的地址就是主机2的IP地址
2.2.主机2添加路由规则
route add -net 10.0.128.0/24 gw 192.168.72.130
2.3路由持久化(防止主机重启路由丢失)
vi /etc/rc.local
主机1:route add -net 10.0.129.0/24 gw 192.168.72.137
主机2:route add -net 10.0.128.0/24 gw 192.168.72.130
:wq
3.进行ping测试
主机1ping主机2
[root@localhost ~]# ping 10.0.129.1
PING 10.0.129.1 (10.0.129.1) 56(84) bytes of data.
64 bytes from 10.0.129.1: icmp_seq=1 ttl=64 time=0.852 ms
64 bytes from 10.0.129.1: icmp_seq=2 ttl=64 time=4.89 ms
64 bytes from 10.0.129.1: icmp_seq=3 ttl=64 time=1.28 ms
主机2ping主机1
[root@localhost ~]# ping 10.0.128.1
PING 10.0.128.1 (10.0.128.1) 56(84) bytes of data.
64 bytes from 10.0.128.1: icmp_seq=1 ttl=64 time=0.824 ms

四、跨主机容器之间通信测试

在主机1和主机2各启动一台busybox然后进行互相ping,两台主机都拉取busybox并且启动busybox
[root@localhost ~]# docker pull busybox
[root@localhost ~]# docker run -it busybox
/ # ping 10.0.129.2
PING 10.0.129.2 (10.0.129.2): 56 data bytes
可以发现ping不通

通过上面我们可知:docker0之间是可以ping通的,但是两个容器之间是ping不通的。这是为什么?
Docker Brige创建的过程:

图片

1)首先宿主机上创建一对虚拟网卡veth pair设备,veth设备总是成对出现的,形成了一个通信通道,数据传输就是基于这个链路的,veth设备总用来连接两个网络设备****。

(2)Docker将vethpair设备的一端放在容器中,并命名为eth0,然后将另一端加入到docker0网桥中,可以通过brctl show命令查看。

例如我们上面创建的主机1的busybox

[root@localhost ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.02423cc9450d       no              veth5e3c6a9
在容器里将veth5e3c6a9重命名为了eth0.我们可以吧docker0看成交换机,veth5e3c6a9看成这个交换机(docker0)上的某个接口
[root@localhost ~]# docker exec -it e96db30bbfb6 sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
    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
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
    link/ether 02:42:0a:00:80:02 brd ff:ff:ff:ff:ff:ff
    inet 10.0.128.2/24 brd 10.0.128.255 scope global eth0
       valid_lft forever preferred_lft forever

(3)此时容器IP与宿机的可以互通的,在bridge模式下,连接在同一网桥的容器之间可以通信,同时容器可以访问外网,但是其他物理机不能访问docker容器ip,需要通过NAT将容器的IP的port映射为宿主机的IP和port。

现在我们执行ifconfig

7: veth5e3c6a9@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
    link/ether 9e:66:f3:ba:22:39 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::9c66:f3ff:feba:2239/64 scope link
       valid_lft forever preferred_lft forever

会发现一个veth5e3c6a9的网卡设备。这个是我们在运行容器的时候出现的。那么什么是vteth
Linux container中用到一个叫做veth的东西,这是一种新的设备,专门为container所建。veth从名字上来看是VittualETHernet的缩写,它的作用很简单,就是要从一个network namespace发出的数据包转发到另一个namespace。veth是成对出现的,一端请求发送的数据总是从另一端以请求接收的形式出现。创建并配置正确后,向其一端输入数据,veth会改变数据的方向并将其送入内核网络子系统,完成数据的注入,而在另一端则能读到此数据。

关键词:

RX==receive,接收,从开启到现在接收封包的情况,是下行流量(Downlink)。

TX==Transmit,发送,从开启到现在发送封包的情况,是上行流量(Uplink)。

图片

(Namespace,其中往veth设备上任意一端上RX到的数据,都会在另一端上以TX的方式发送出去)veth工作在L2数据链路层,veth-pair设备在转发数据包过程中并不串改数据包内容。

图片
显然,仅有veth-pair设备,容器是无法访问网络的。因为容器发出的数据包,实质上直接进入了veth1设备的协议栈里。如果容器需要访问网络,需要使用bridge等技术,将veth1接收到的数据包通过某种方式转发出去 。

因此,如果要多台主机之间的docker通信,需要使用数据转发功能。那么接下来,就是设置数据转发。

五、配置数据转发功能

两台主机都要开数据转发功能
vim /etc/sysctl.d/99-sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

至此实验完成。其实

三台主机测试

环境介绍:

操作系统 服务器地址 Dockerd地址
centos 192.168.72.130 10.0.128.2
centos 192.168.72.137 10.0.129.2
centos 192.168.72.131 10.0.130.2

拓扑图:

图片

上面已经实现了2台docker之间的通信,如果是3台呢?怎么搞?还是一样的。只不过每台主机都要增加2条路由规则以及开启数据转发功能.

路由添加:

主机1:
route add -net 10.0.129.0/24 gw 192.168.72.137
route add -net 10.0.130.0/24 gw 192.168.72.131
主机2:
route add -net 10.0.128.0/24 gw 192.168.72.130
route add -net 10.0.130.0/24 gw 192.168.72.131
主机3:
route add -net 10.0.128.0/24 gw 192.168.72.130
route add -net 10.0.129.0/24 gw 192.168.72.137

2、桥接方式

Pipework是一个简单易用的Docker容器网络配置工具。由200多行shell脚本实现。通过使用ip、brctl、ovs-vsctl等命令来为Docker容器配置自定义的网桥、网卡、路由等。

使用新建的bri0网桥代替缺省的docker0网桥(docker0也可以继续保留,常规容器还是用docker0,而需要互通的容器可以借助于pipework这个工具给docker容器新建虚拟网卡并绑定IP桥接到br0)。bri0网桥与缺省的docker0网桥的区别:bri0和主机eth0之间是veth pair

图片

自建网桥的优点:

(1)每个容器都有独立ip,对外提供服务,如nginx+php,nginx+resin,都可以使用默认的80端口

(2)由于容器暴露端口都可以使用80端口,因此前端路由层nginx配置(proxy_pass)里可以使用dns的方式。

(3)无需为了后期端口映射添加而烦恼

(4)桥接支持websocket。

实验:

图片

一、配置固定IP地址

主机1:
 vim /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.72.130
NETMASK=255.255.255.0
GATEWAY=192.168.72.2
DNS1=114.114.114.114
:wq
systemctl restart network
主机2:
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.72.131
NETMASK=255.255.255.0
GATEWAY=192.168.72.2
DNS1=114.114.114.114
:wq
systemctl restart network

二、更改主机名

主机1:
[root@localhost ~]# hostnamectl set-hostname docker1
主机2:
[root@localhost ~]# hostnamectl set-hostname docker2
exit    //重新登陆即可

三、关闭防火墙和selinux

两个都要关闭
systemctl stop firewalld
systemctl disable firewalld
vim /etc/sysconfig/selinux
SELINUX=disabled
:wq
reboot

四、同步系统时间

两个都要设置
yum -y install ntp    
systemctl enable ntpd.service
ntpdate cn.pool.ntp.org //同步时间
hwclock -w   //使得同步的时间生效
crontab -e   //计划任务
0 2 * * * ntpdate ntpdate cn.pool.ntp.org  && hwclock -w
crontab -l
0 2 * * * ntpdate ntpdate cn.pool.ntp.org  && hwclock -w

5、配置路由转发

两个主机都要配置
 vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
:wq
sysctl -p

6、跨主机通信之配置br0网卡

docker1:
1.停止docker服务
[root@docker1 ~]# systemctl stop docker.socket
2.安装网桥并删除docker0网卡
[root@docker1 ~]#  yum -y install bridge-utils
[root@docker1 ~]# ifconfig docker0 down
[root@docker1 ~]# brctl delbr docker0
4.新建桥接物理网络虚拟网卡br0
[root@docker1 ~]# ping www.baidu.com
[root@docker1 ~]#  brctl addbr br0
[root@docker1 ~]# ip link set dev br0 up
4.1、注意: 下条命令意思是删除宿主机网卡,若是使用的192.168.72.130地址连接到这台服务器,此操作会中断连接;若使用的是公网地址进行的连接,则连接不会中断。
[root@docker1 ~]#  ip addr del 192.168.72.130/24 dev ens33
由于我的是虚拟机所以不用管。
4.2、将宿主机的ip设置到br0
ip addr add 192.168.72.130/24 dev br0
brctl addif br0 ens33
4.3、删除原默认路由
ip route del default 
4.4、将br0设置为默认路由
ip route add default via 192.168.72.2 dev br0
4.5、测试是否可以ping外网
[root@docker1 ~]# ping 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=128 time=60.7 ms
4.6修改docker.service 文件,让docker服务启动时使用br0网卡进行桥接。记得将原ExecStart删除!
 vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --selinux-enabled -b=br0
:wq
4.7、载入新配置的参数然后启动docker
systemctl daemon-reload
systemctl restart docker

docker2:
1.停止docker服务
[root@docker1 ~]# systemctl stop docker.socket
2.安装网桥并删除docker0网卡
[root@docker1 ~]#  yum -y install bridge-utils
[root@docker1 ~]# ifconfig docker0 down
[root@docker1 ~]# brctl delbr docker0
4.新建桥接物理网络虚拟网卡br0
[root@docker1 ~]# ping www.baidu.com
[root@docker1 ~]#  brctl addbr br0
[root@docker1 ~]# ip link set dev br0 up
4.1、注意: 下条命令意思是删除宿主机网卡,若是使用的192.168.72.131地址连接到这台服务器,此操作会中断连接;若使用的是公网地址进行的连接,则连接不会中断。
[root@docker1 ~]#  ip addr del 192.168.72.131/24 dev ens33
由于我的是虚拟机所以不用管。
4.2、将宿主机的ip设置到br0
ip addr add 192.168.72.131/24 dev br0
brctl addif br0 ens33
4.3、删除原默认路由
ip route del default 
4.4、将br0设置为默认路由
ip route add default via 192.168.72.2 dev br0
4.5、测试是否可以ping外网
[root@docker1 ~]# ping 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=128 time=60.7 ms
4.6修改docker.service 文件,让docker服务启动时使用br0网卡进行桥接。记得将原ExecStart删除!
 vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --selinux-enabled -b=br0
:wq
4.7、载入新配置的参数然后启动docker
systemctl daemon-reload
systemctl restart docker

7、安装pipwork并配置

两个主机都要配置:
[root@docker1 ~]# mkdir /root/docker
[root@docker1 ~]# cd docker/
[root@docker1 docker]# git clone https://github.com/jpetazzo/pipework
[root@docker1 docker]# cp pipework/pipework /usr/local/bin/

8、启动一个手动设置网络的容器并配置网络

docker1:
1.手动设置网络
[root@docker1 docker]# docker run -dit --name test01 --net=none busybox
2.为test01容器设置一个与桥接物理网络同地址段的ip@网关
pipework br0 test01 192.168.72.132/24@192.168.72.2
docker2:
1.手动设置网络
[root@docker1 docker]# docker run -dit --name test02 --net=none busybox
2.为test02容器设置一个与桥接物理网络同地址段的ip@网关
pipework br0 test02 192.168.72.133/24@192.168.72.2

9、测试两个容器是否可以互通

test01的IP地址为:192.168.72.132
test02的IP地址为:192.168.72.133
进入test01 ping test02
[root@docker1 docker]# docker exec -it test01 sh
/ # ping 192.168.72.133
PING 192.168.72.133 (192.168.72.133): 56 data bytes
64 bytes from 192.168.72.133: seq=0 ttl=64 time=4.163 ms
进入test02 ping test01
[root@docker2 docker]# docker exec -it test02 sh
/ # ping 192.168.72.132
PING 192.168.72.132 (192.168.72.132): 56 data bytes
64 bytes from 192.168.72.132: seq=0 ttl=64 time=0.911 ms
至此实验完成。

此方法的缺点:

  1. 此方法配置的时候有时容器之间不能访问,容器内无法ping通外网(宿主机可以ping通)。重启服务器后,同样的操作,重新配置一遍后,然后就可以了。。。

  2. pipework 分配静态ip是暂时的,重启之后就会失效。并且使用pipework绑定的ip 物理机,虚拟机,docker容器的ip都在同一网段,这在实际生产环境中是很难实现的。

本文作者:wtdata123

本文链接:https://www.cnblogs.com/wtdata123/p/16908693.html

版权声明:本作品采用WTdata知识共享署名-许可协议进行许可。

posted @   wtdata  阅读(613)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.

作词 : Victor Thell/Maria Smith/Darin Zanyar

作曲 : Victor Thell/Maria Smith/Darin Zanyar

Går genom staden tittar i marken

Vill lyfta blicken men ser bara oss två

I alla andra de som ser färger

Lever i nuet men jag lever då

Står här tung som bly

Förstelnad grå staty

Du var så fin

Att du fått allting annat att kännas som en mardröm

Som en mardröm

När du var min

Det var så vackert men nu känns allting som en mardröm

Som en mardröm

Vi var det som lyste mitt i det gråa

Vi va de färger du sa att du aldrig sett

Jag minns det vi hade som ljusa pasteller

Nu suddar du bort det och du tror det är lätt

Försöker springa fram

Kommer ingenstans

Du var så fin

Att du fått allting annat att kännas som en mardröm

Som en mardröm

När du var min

Det var så vackert men nu känns allting som en mardröm

Som en mardröm

Du gav ett hederligt perspektiv

På hur fint livet kunde bli

Jag saknar dig

Du gav ett hederligt perspektiv

På hur fint livet kunde bli

Jag saknar dig

Du var så fin

Att du fått allting annat att kännas som en mardröm

Som en mardröm

När du var min

Det var så vackert men nu känns allting som en mardröm

Som en mardröm

Bara du kan väcka mig

Bara du kan väcka mig

Bara du kan väcka mig ur denna mardröm

Bara du bara du kan väcka mig

Bara du bara du kan väcka mig

Bara du bara du kan väcka mig ur denna mardröm