如何利用Docker容器实现代理转发与数据备份详解

2020-06-17 06:52:48易采站长站整理

前言

我们将应用以Docker容器的方式部署到服务器上的时候,通常需要考虑两个方面的的问题:网络和存储。

网络方面,有些应用需要占用端口,而其中一部分应用甚至需要对外提供访问。

出于安全方面考虑,代理转发方式相对于直接开放防火墙端口方式更为合适。

存储方面,由于容器内部并不适合做数据持久化,所以一般通过挂载卷的方式将数据保存在服务器磁盘上。

但是服务器也不能保证绝对安全,所以数据也需要备份到云上。

代理转发

默认情况下容器之间的网络是互相隔离的,但是对于一些有关联的应用而言(web前端容器和服务端容器以及数据库容器),一般会把它们划分到一个独立的桥接子网络(以下简称子网),使得这些容器之间可以相互通信,但同时又与外部进行隔离。

对于需要对子网外部提供访问的容器,可以将端口映射到服务器主机上。整个结构大致如下:

上面的端口映射只解决了服务器(宿主机)访问容器网络服务的问题,如果我们要从本地机器上通过因特网访问服务器上的容器,一般是不行的,因为服务器除了安全考虑,默认情况下会启用防火墙,并只开放22等少数几个端口。

对于传统的网络进程,实现方式就是通过反向代理服务器来对网络请求进行转发,比如使用Nginx配置如下代理:


# 针对不同路径进行转发
server {
listen 80;
server_name www.xx.com;

location /a {
proxy_pass localhost:1234;
}
location /b {
proxy_pass localhost:2234;
}
}
# 针对不同域名进行转发
server {
listen 80;
server_name www.yy.com;

location / {
proxy_pass localhost:1234;
}
}

那么此时问题似乎是解决了,但是如果Nginx也是在容器中运行呢?

刚才我们提到子网对于外部的容器是隔离的,那么Nginx容器将无法访问这些对外服务。

你可能很容想到把Nginx容器划分到对应的子网络这种方式,容器的确支持多个子网的配置,但是这种操作方式的麻烦在于,每次新增子网时都需要修改Nginx容器的网络配置并重启容器。

所以比较好的方式是将Nginx设置为HOST网络模式。放弃Nginx容器与服务器的隔离性,直接与服务器共享网络和端口。那么Nginx容器即可直接访问所有映射了端口的容器。

如下图所示:

数据备份

应用场景

考虑到速度和安全性方面的问题,通常公司会有一些只供内网访问的服务器。但是这些服务器上的数据包括服务器本身都是随时可能被修改或者发生故障的。