利用Docker容器实现代理转发和数据备份

咱们将应用以Docker容器的方式部署到服务器上的时候,一般须要考虑两个方面的的问题:网络和存储。html

网络方面,有些应用须要占用端口,而其中一部分应用甚至须要对外提供访问。 出于安全方面考虑,代理转发方式相对于直接开放防火墙端口方式更为合适。前端

存储方面,因为容器内部并不适合作数据持久化,因此通常经过挂载卷的方式将数据保存在服务器磁盘上。 可是服务器也不能保证绝对安全,因此数据也须要备份到云上。python

代理转发

默认状况下容器之间的网络是互相隔离的,可是对于一些有关联的应用而言(web前端容器和服务端容器以及数据库容器),通常会把它们划分到一个独立的桥接子网络(如下简称子网),使得这些容器之间能够相互通讯,但同时又与外部进行隔离。 对于须要对子网外部提供访问的容器,能够将端口映射到服务器主机上。整个结构大体以下:git

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

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

# 针对不一样路径进行转发
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容器的网络配置并重启容器。docker

**因此比较好的方式是将Nginx设置为HOST网络模式。**放弃Nginx容器与服务器的隔离性,直接与服务器共享网络和端口。那么Nginx容器便可直接访问全部映射了端口的容器。 以下图所示:数据库

数据备份

应用场景

考虑到速度和安全性方面的问题,一般公司会有一些只供内网访问的服务器。可是这些服务器上的数据包括服务器自己都是随时可能被修改或者发生故障的。 因此数据备份显得尤其重要。这里咱们讨论体积较小的数据备份。 以我最近为团队搭建的知识库服务器为例。 该web应用是一个小型的python服务,以容器的形式部署在内网服务器上,支持在线编辑功能,以md文件的形式保存数据。 由于容器一旦发生故障则内部数据没法再访问,因此直接放在容器中确定是不安全的,只能经过挂载文件的方式让容器和服务器共享数据读写。 那么经过什么方式对数据进行备份呢?这里咱们选择GitHub的私有仓库来进行保存。缘由有3个:安全

  1. 安全。数据不容易丢失和窃取。
  2. 方便,只须要经过git命令便可备份。
  3. 快速。因为备份的数据体积和数量并不大。

虽然方式已经肯定,但要实现还有两个问题:bash

  1. 向GitHub仓库须要进行权限认证。
  2. 如何定时或自动提交数据到GitHub。

实现方法

首先按照容器单一指责的原则,咱们应该建立一个新的容器用来执行备份任务。 这里咱们我可使用docker-compose或者其它编排工具来建立多个容器。 而后就是权限认证,在本机建立ssh key并加入到GitHub的设置中,这样使得容器能够推送文件到对应仓库。 不过如今只是服务器能够推送代码,容器还不行,因此还须要将.ssh文件拷贝到容器中。 最后是自动备份的实现,比较好的方式是每次文件有变更的时候提交并推送代码,可是目前并无找到在容器中监听文件的简单方式,因此退而求其次,采用定时任务的策略,即每隔5分钟执行对应的git命令来提交和推送文件到仓库。 这里可使用基于镜像busybox封装的轻量级的容器,将项目代码挂载到容器中保证文件的同步更新,而后启动cron服务来实现操做。

原文连接:tech.gtxlab.com/container-t…


做者信息:朱德龙,人和将来高级前端工程师。

相关文章
相关标签/搜索