利用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…


做者信息:朱德龍,人和將來高級前端工程師。

相關文章
相關標籤/搜索