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

前言

我们将应用以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容器即可直接访问所有映射了端口的容器。

如下图所示:

数据备份

应用场景

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

所以数据备份显得尤为重要。这里我们讨论体积较小的数据备份。

以我最近为团队搭建的知识库服务器为例。

该web应用是一个小型的python服务,以容器的形式部署在内网服务器上,支持在线编辑功能,以md文件的形式保存数据。

因为容器一旦发生故障则内部数据无法再访问,所以直接放在容器中肯定是不安全的,只能通过挂载文件的方式让容器和服务器共享数据读写。

那么通过什么方式对数据进行备份呢?这里我们选择GitHub的私有仓库来进行保存。原因有3个:

  • 安全。数据不容易丢失和窃取。
  • 方便,只需要通过git命令即可备份。
  • 快速。由于备份的数据体积和数量并不大。

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

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

实现方法

首先按照容器单一指责的原则,我们应该创建一个新的容器用来执行备份任务。

这里我们我可以使用docker-compose或者其它编排工具来创建多个容器。

然后就是权限认证,在本机创建ssh key并加入到GitHub的设置中,这样使得容器可以推送文件到对应仓库。

不过现在只是服务器可以推送代码,容器还不行,所以还需要将.ssh文件拷贝到容器中。

最后是自动备份的实现,比较好的方式是每次文件有变动的时候提交并推送代码,但是目前并没有找到在容器中监听文件的简单方式,所以退而求其次,采用定时任务的策略,即每隔5分钟执行对应的git命令来提交和推送文件到仓库。

这里可以使用基于镜像busybox封装的轻量级的容器,将项目代码挂载到容器中保证文件的同步更新,然后启动cron服务来实现操作。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 详解Docker中容器的备份、恢复和迁移

    今天,我们将学习如何快速地对docker容器进行快捷备份.恢复和迁移.Docker是一个开源平台,用于自动化部署应用,以通过快捷的途径在称之为容器的轻量级软件层下打包.发布和运行这些应用.它使得应用平台独立,因为它扮演了 Linux上一个额外的操作系统级虚拟化的自动化抽象层.它通过其组件cgroups和命名空间利用Linux内核的资源分离特性,达到避免虚拟机开销的目的.它使得用于部署和扩展web应用.数据库和后端服务的大规模构建组件无需依赖于特定的堆栈或供应者. 所谓的容器,就是那些创建自Do

  • Docker网络代理设置详解

    背景 在一些实验室环境,服务器没有直接连接外网的权限,需要通过网络代理.我们通常会将网络代理直接配置在/etc/environment./etc/profile之类的配置文件中,这对于大部分操作都是可行的.然而,docker命令却使用不了这些代理. 比如docker pull时需要从外网下载镜像,就会出现如下错误: $ docker pull hello-world Unable to find image 'hello-world:latest' locally Pulling reposit

  • Linux下使用docker搭建Openvpn代理的方法

    说明 openvpn方式与pptpd方式对比(个人感觉): 复杂度:openvpn>pptpd 安全性:openvpn>pptpd 稳定性:openvpn>pptpd 1.安装 1.下载 docker pull kylemanna/openvpn 2.全局变量(方便设置) OVPN_DATA="/root/ovpn-data" // 下面的全局变量换成你的服务器的外网ip IP="xxx.xxx.xxx.xxx" 3.创建文件目录 mkdir ${

  • 详解为 Docker 设置代理

    因为众所周知的原因,Docker在国内的使用举步维艰.于是,很多组织在国内提供了mirror或者叫加速器. 甚至在1.13的release note中提到微软提供了官方的中国镜像,然后我并没有找到怎么启用,找到了再写. 使用这些镜像或者加速器,拉取各种官方镜像是ok了,自有的镜像也可以放在国内的registry. 但是官方镜像只是沧海一粟,大量的组织或个人的镜像都在docker hub,这一部分并没有被镜像同步. 于是,你还是需要一个代理. 本文假设: 你已经有一个http代理了 Linux发行

  • Docker配置HTTP/HTTPS代理的方法

    起因 我在使用Docker的pull命令拉取ELK官方提供的镜像时,会出现无法连接的情况,并且会出现TLS handshake timeout的错误.在搜索相关文章之后得出结论:国内的网络环境不好,导致连接docker.elastic.co失败或无法连接.于是我第一时间想到了代理的方式,好在Docker支持设置代理来访问其他Registry,下面记录整个配置过程. 准备工作 首先,你的机器上需要安装好Docker,当我写这篇文章时,Docker的版本为18.03,对于后续版本,本文章的配置方法可

  • 利用python自动生成docker nginx反向代理配置

    利用python自动生成docker nginx反向代理配置 由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候,自动生成nginx反向代理,然后reload nginx 我的原则是尽量简单,轻量,内存占用少 目标很明确,只要能监听到docker的容器启动/停止事件,即可 网上查了一下可以用docker events来监听docker事件,试了一下

  • Docker设置代理的方法教程

    在一些实验环境,服务器没有直接连接万网的权限,需要通过网络代理:通常情况下将网络代理直接配置在/etc/envrionment./etc/profile之类的配置文件中,这对于大部分操作都是可行的.然而,docker命令却不能使用这些代理.最典型场景就是docker需要从外网pull镜像: 下面推荐一种方法,修改后会一直生效,该方法覆盖了默认的docker.service文件: 1.为docker服务创建一个内嵌的systemd目录 mkdir -p /etc/systemd/system/do

  • Ubuntu 16.04中Docker的安装和代理配置教程

    前言 最近想在测试环境下快速搭建一套gitlab ci环境,推进下项目组内规范化开发管理.自己在家里的nas上是用docker部署的gitlab,体验非常的好,正好ubuntu 16.04 lts发布了,也想借此机会接触下新版内核和systemd. Ubuntu的安装 这里就省略不介绍了.唯一的问题是当前版本的官方镜像,选中文在安装阶段会报一个busybox的错误,换成英文就好了. 大家也可以参考这篇文章:http://www.jb51.net/article/100919.htm,里面介绍的也

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

    前言 我们将应用以Docker容器的方式部署到服务器上的时候,通常需要考虑两个方面的的问题:网络和存储. 网络方面,有些应用需要占用端口,而其中一部分应用甚至需要对外提供访问. 出于安全方面考虑,代理转发方式相对于直接开放防火墙端口方式更为合适. 存储方面,由于容器内部并不适合做数据持久化,所以一般通过挂载卷的方式将数据保存在服务器磁盘上. 但是服务器也不能保证绝对安全,所以数据也需要备份到云上. 代理转发 默认情况下容器之间的网络是互相隔离的,但是对于一些有关联的应用而言(web前端容器和服务

  • Docker容器互相连接三种实现方法详解

    docker容器间的互连通信有三种方法: docker内部网络:不够灵活强大,不推荐 docker networking:1.9或更新版本,推荐使用 docker链接:1.9之前版本适用. 1.docker内部网络 涉及docker自己的网络栈. 安装docker后,系统会创建一个新的网络接口,名字是docker0,用于连接容器和宿主机,IP范围是172.16-172.30, 每个docker容器都会在这个接口上分配一个IP地址. docker每创建一个容器就会创建一组互联的网络接口,一端是容器

  • 利用Nginx实现反向代理Node.js的方法详解

    前言 公司有项目前端是用node.js进行服务器渲染,然后再返回给浏览器,进而解决单页面的SEO问题.项目部署的时候,使用Nginx反向代理Node.js.具体的步骤如下: (Nginx.Node.js的安装和基本配置直接跳过) 首先我们要在nginx.cnf文件中的http节点打开下面的配置: http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_by

  • 群晖NAS利用Docker容器搭建KMS激活服务器实现激活windows系统和office(操作步骤)

    前言 Windows系统中能够通过KMS进行激活的一般称为VL版,即VOLUME授权版.我们可以自行搭建KMS激活服务器,实现每180天一次的自动激活,使得系统一直保持激活状态.这次就跟大家分享一下如何利用群晖NAS的Docker容器套件搭建KMS服务器,并演示如何利用我们自己的KMS服务器激活Windows操作系统与Microsoft Office. 操作步骤 先到套件中心安装Docker套件 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZCVBfkb9-15

  • docker容器与宿主机的数据交互方式总结

    前言 在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 方式一.Docker cp命令 docker cp :用于容器与主机之间的数据拷贝. 语法 # 容器内文件 copy to 宿主机 docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- # 宿主机文件 copy to 容器内 docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_

  • Docker中容器数据卷详解

    目录 什么是容器数据卷 数据的覆盖问题 使用数据卷 方式一:直接使用命令挂载 -v 测试挂载卷 方式二:Dockerfile文件 数据卷命令 查看数据卷 方式一:docker inspect 容器ID 方式二:docker volume inspect juming-nginx 挂载三种方式 扩展 什么是容器数据卷 从docker的理念说起,docker将应用和环境打包成一个镜像,运行镜像(生成容器)就可以访问服务了. 如果数据都存在容器中,那么删除容器,数据就会丢失!需求:数据可以持久化 My

  • docker中的run/cmd/entrypoint的区别详解

    Dockerfile中run.cmd和entrypoint都能够用于执行命令,下面是三者的主要用途: run命令执行命令并创建新的镜像层,通常用于安装软件包 cmd命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换 entrypoint配置容器启动时的执行命令,不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令. Shell格式和Exec格式运行命令 我们可以用下面两种格式指定run.cmd和entrypoint要

  • Java动态代理(设计模式)代码详解

    基础:需要具备面向对象设计思想,多态的思想,反射的思想: Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架.通过阅读本文,读者将会对Java动态代理机制有更加深入的理解.本文首先从Java动态代理的运行机制和特点出发,对其代码进行了分析,推演了动态生成类的内部实现. 代理模

  • 利用CDN加速react webpack打包后的文件详解

    此文不介绍webpack基本配置,如果对基本配置有疑问请查阅官方文档. 1.配置webpack.config.js 将output.publicPath改成上传到的cdn地址, 例(对应上面上传配置): publicPath: "https://your_base_cdn_url" + process.env.NODE_ENV + "/cdn/" 打包 NODE_ENV=production node_modules/webpack/bin/webpack.js -

  • React为 Vue 引入容器组件和展示组件的教程详解

    如果你使用过 Redux 开发 React,你一定听过 容器组件(Smart/Container Components) 或 展示组件(Dumb/Presentational Components),这样划分有什么样的好处,我们能否能借鉴这种划分方式来编写 Vue 代码呢?这篇文章会演示为什么我们应该采取这种模式,以及如何在 Vue 中编写这两种组件. 为什么要使用容器组件? 假如我们要写一个组件来展示评论,在没听过容器组件之前,我们的代码一般都是这样写的: components/Comment

随机推荐