在 Docker 中完整部署 Web 應用

2022-01-25 靈雀雲

一個完整的 Web 應用包含前端頁面、資料庫、後臺邏輯等,按照一般流程去構建需要配置 Nginx、MySQL,以及後臺伺服器,運維涉及到的部分十分複雜。而 Docker 可以將這些東西(數據+服務)封裝起來,雖然有些場合不建議數據和服務放在一起。本文就在一個 Docker 容器中完整部署整個 Web 應用的需求作詳細的介紹。

作者簡介:外號夫子,長於長江之上「梨花島」,總喜歡一個江湖的傳說,如果你偶然記起關於「桃花島」黃藥師的傳說,記得划船來找我。個人博客:fuzhii.com。其他博文《換個timeline看知乎》,《用機器學習的方法鑑別紅樓夢作者》。

本文舉例的 Web 應用為 『top-topic-Zhihu』(換個 timeline 看知乎),抓取「知乎」網站每天新提出的熱門 top10 問題聚合顯示,提供另一種看知乎的姿勢,不被紛繁的 timeline 所迷惑。

項目地址:https://github.com/Huangtuzhi/top-topic-Zhihu

Dockerfile 和依賴文件:https://github.com/Huangtuzhi/docker-toptopic

雲服務商選擇『靈雀雲』提供容器服務:http://www.alauda.cn/

鏡像地址:https://hub.alauda.cn/repos/huangtuzhi/docker-toptopic

Web頁面展示:http://toptopic-huangtuzhi.myalauda.cn:19991/

需要這幾步來完成目標:

抓取 ——> 存儲(數據持久化) ——> 分析 ——> 展示

抓取:抓取部分主要是爬蟲,先手動輸入驗證碼獲取登錄 Cookie。然後帶著該 Cookie 模擬發出 Get 請求來獲得網頁數據。思路是從自己的個人主頁開始爬,先爬出現在主頁 timeline 上的所有人,再爬這些人主頁上的其他人...,直到數據量足夠大。把人的 ID 存儲在 people 中。接著繼續爬 people 中所有人主頁上提出的問題,並獲得問題的關注人數和提問時間。把抓取到的問題存儲在 question 中。

存儲:存儲可以把上面的 people,question 寫入文本或者 MySQL 資料庫。中間數據也應該放到資料庫中,不然內存會被無窮多的遞歸生成的中間數據填滿。本項目使用帶主鍵的 MySQL 表模擬內存 set 來存儲 people。

分析:網站目的是獲取每天或者一個時間段內新提出的 top10 熱門問題,所以需要對時間過濾,對關注人數排序。這都可以在 SQL 查詢中完成。

展示:展示包括後臺和前端兩部分,後臺需要在 DB 中取得數據構造成 JSON 格式以 CGI 的形式提供給前端調用。這裡使用 Python Flask 框架提供 CGI 後臺服務。前端頁面主要是跨域 AJax 請求後臺 CGI 來獲得數據,結合定義的模板來展示頁面。在版本 V1 中使用 AngularJS 來簡單的編寫模板及 AJax 請求的邏輯部分,在版本 V2 中使用 artTemplate 和封裝原生的 JS 來滿足需求。

整個 Web 應用的目錄結構如下所示:


Dockerfile 描述了容器的依賴和進行構建的步驟,下面會逐步解釋語句的含義。

MySQL 伺服器只需要用包管理器安裝 mysql-server-5.6,因為後臺使用 Python 作為伺服器語言,還需要安裝 MySQL 對 Python 語言的支持。需要使用 apt 安裝 python ,libmysqlclient-dev 和 python-dev,然後使用 pip 管理器安裝 MySQL-python。

MySQL 的默認字符集為 latin1,而網頁顯示一般是 utf8 字符集,需要將 MySQL 的配置文件的字符集置為 utf8。

使用命令


將本地已修改好的配置文件覆蓋 Docker 中的 MySQL 配置文件。查看字符集


若字符集如上所示,則說明已經修改成功。

在上面的 Dockerfile 中看到分別給'root'@'127.0.0.1'和'root'@'localhost'都加了權限,'root'@'localhost'的權限在 SQL 語句最後才加上。這是因為

Access denied for user 'root'@'localhost' (using password: No)

Access denied for user 'root'@'localhost' (using password: YES)

於是這裡用'root'@'127.0.0.1'來建資料庫和表,最後再用'root'@'localhost'來連接資料庫。

Nginx 在這裡作為靜態頁面的伺服器,安裝只需要用 apt 管理器安裝即可。

Nginx 需要配置 root 目錄來指定網站的文件位置,把本地的 global.conf和nginx.conf文件覆蓋到 Docker 中。

在 global.conf 中我們指明伺服器根目錄為/usr/share/nginx/html/www


在 Docker 中,我們將網站文件放到新建的 /home/toptopic/web/www目錄。這裡建立一個軟連結將它們關聯起來,便於修改和維護。


EXPOSE 在 Docker 中用來限制開放的埠。我們使用 Nginx 來提供靜態頁面訪問,使用 Flask 框架來提供動態頁面數據的獲取,所以需要開放兩個埠。



查詢埠狀態,可以看到宿主機 2333 埠被映射到 Docker 的 2333 埠,宿主機 5000 埠被映射到 Docker 的 5000 埠。


2223 埠與上節中的 Nginx 中設定的埠必須保持一致,因為 Nginx 使用 2223 埠提供服務,Docker 剛好必須把這個埠開放出去。

在基於 Flask 框架寫的後臺服務 dataCGI.py 中,伺服器對應的監聽地址為

host 必須設置為 0.0.0.0,表示監聽所有的 IP 地址。如果 host 使用 127.0.0.1,在容器外將無法訪問服務。同時,這裡的埠 5000 和 Dockerfile 中開放的另一個埠一致。

在 Dockerfile 中的 CMD 中可以指定 Docker 運行時執行一些命令。


這三行分別啟動 MySQL,Nginx 和後臺服務。

構建 Docker 容器


運行容器


需要注意的是若使用



無法啟動 CMD 中的腳本命令,這是因為在 docker run 後指定了 /bin/bash 後會覆蓋 CMD 中的命令。

在「靈雀雲」上部署一個 Docker 應用需要兩步:構建——創建服務。


點擊「構建」——「創建鏡像構建倉庫」,然後選擇 Github 倉庫源。需要把預先寫好的 Dockerfile 放在 Github中。


構建好倉庫之後,點擊「創建服務」。


進行服務的設置,高級設置中服務地址類型選為 tcp-endpoint 即可(外部用戶可以直接通過 TCP 方式訪問這個服務地址,服務地址的埠是隨機分配的,一般會大於 10000 小於 65535)。

最後點擊最下方的「創建服務」完成部署。新建的服務如下所示:



在瀏覽器中輸入http://toptopic-huangtuzhi.myalauda.cn:19991/ ,或點擊『閱讀原文』即可訪問網站。

www.alauda.cn
長按二維碼,關注靈雀雲,關注Container/Docker技術!

相關焦點

  • 用Docker部署SpringBoot應用程式
    Docker是一個用於創建容器的流行平臺--一組標準化的軟體單元,它們在單個包中組裝代碼、運行時、依賴項、設置和初始化,您可以從一個計算環境可靠地運行到另一個包。將應用程式部署為Docker容器可以幫助您在多個環境(即dev、QA、暫存、生產)中順利地行動應用程式。
  • 實戰 Windows Server Docker :Docker化現有 IIS 應用的正確姿勢 (2)
    這一篇,我們來填一些稍大一些的坑:如何docker化一個現有的iis應用。問題分析聽說Windows支持原生docker了,大家一定都很興奮。然而,大家想過沒有,Windows Server Docker最適合什麼場景呢?部署.NET Core應用?為什麼不選擇Linux下的docker?
  • Flask + Docker 無腦部署新手教程
    基礎介紹•Flask :python最流行的兩個框架之一(django、flask),輕量級是最大的特點•Gunicorn:只熟悉熟悉用 java 或者 PHP 做開發的可能對 python 的部署一開始不太理解,Flask應用是一個符合WSGI規範的Python應用,不能獨立運行(類似app.run的方式僅適合開發模式),需要依賴其他的組件提供伺服器功能
  • 30分鐘帶你了解Web工程師必知的Docker知識
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言筆者之前和朋友一直在討論web技術方向的話題,也一直想了解web運維方面的知識,所以特意請教了一下我的朋友老胡,他對web運維和後端技術有非常多的實戰經驗,所以在本文中他也提供了不少幫助
  • 老司機實戰Windows Server Docker:2 docker化現有iis應用的正確姿勢
    這一篇,我們來填一些稍大一些的坑:如何docker化一個現有的iis應用。問題分析聽說Windows支持原生docker了,大家一定都很興奮。然而,大家想過沒有,Windows Server Docker最適合什麼場景呢?部署.NET Core應用?為什麼不選擇Linux下的docker?
  • 微服務部署到docker中
    打開Visual Studio 2019,創建一個ASP.NET Core Web應用程式2.使用ASP.NET Core 5.0創建一個ASP.NET Core WebAPI3. 右鍵選擇項目,選擇「添加」->「Docker支持...」
  • 如何使用 Docker 部署容器
    而不是安裝作業系統,然後安裝伺服器軟體,然後部署精心設計的應用程式或站點,您可以簡單地在一個獨立的包中開發所有內容,並使用單個命令將其推出。這是使用容器的眾多好處之一。它們使開發和部署周期變得異常高效。但是你如何部署這些容器?我想在這裡指導你完成這個過程。我們將專注於在Ubuntu Server 18.04上部署基本的NGINX Web伺服器作為容器。
  • 如何使用MongoDB和Docker運行Flask應用
    作為Python平臺的一個微型框架,Flask通過可以集成到項目中的插件,為開發者提供了一種可擴展的方式。為了擴展開發者的技術棧,MongoDB是為處理大規模和多變數據提供而設計的一種NoSQL資料庫。開發者可以利用Docker技術簡化應用的打包和部署工作。
  • 基於Docker部署 Tomcat集群、 Nginx負載均衡
    博文主要介紹了Tomcat 集群+ Ngixn 負載的Docker環境部署。五,擴展上面的部署方式,在宿主機一樣可以通過埠訪問到應用。考慮安全問題,我希望不能通過宿主機訪問到應用,要求只能通過 Nginx 反向代理到上遊應用伺服器,即tomcat的容器埠不映射給宿主機。那這個這麼處理。
  • 【基礎教程】Docker基礎及應用
    Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。
  • 使用Docker和Codeship來裝運Node.js應用
    如今設置Node.js應用持續部署環境已經變得比以前簡單多了。我們有Jenkis, Strider, Travis或者Codeship這樣的工具。 在本文中我們將要討論的是使用Codeship和Docker來部署我們的Node.js應用。在深入討論之前,有一點原則是我想要聲明的——不可變的基礎結構(infrastructures),那麼它具體指的是什麼?
  • Docker集群管理之Docker Compose
    預告:9月1日晚上8點整,杜航將通過在線培訓的方式詳細探討《Docker集群管理三劍客》,報名地址請點擊這裡與容器技術同樣受到關注的微服務架構也在潛移默化的改變著應用的部署方式,其提倡將應用分割成一系列細小的服務,每個服務專注於單一業務功能,服務之間採用輕量級通信機制相互溝通。
  • 使用 Docker 讓部署 Django 項目更加輕鬆
    最後就是把應用的 nginx 配置複製到容器中 nginx 的 conf.d 目錄下。裡面的內容和直接在系統中配置 nginx 是一樣的。由於 docker 容器是一個隔離環境,一旦容器被刪除,容器內的文件就會一併刪除。試想,如果我們啟動了博客應用的容器並運行,一段時間後,容器中的資料庫就會產生數據。後來我們更新了代碼或者修改了容器的鏡像,這個時候就要刪除舊容器,然後重新構建新的容器並運行,那麼舊容器中的資料庫就會連同容器一併刪除,我們辛苦寫的博客文章付之一炬。
  • 生產中的NLP:創建Docker鏡像
    市場發布管理(Marketing release management)觸發了從stage到Prod存儲庫的推送和半自動連續部署(CD)的推出。什麼是Docker每個項目中有四個不同的版本控制中心:Dev,Test和Stage,Prod。只有需要支持三個不同的Docker鏡像,因為最終階段版本被推送到Prod,一旦Stage版本通過了安全和驗收測試。
  • 分享用Docker部署大桌子協同辦公平臺的一些經驗
    找到方向後,然後就是開始安裝和部署了,因為我的FTP伺服器用的win10的系統,所以考慮加個虛擬機,把onlyoffice用docker打包部署到Linux虛擬機,大桌子的PHP應用部署在真實伺服器上,用XAMPP集成的Apache+MySql+Php環境調用虛擬機上的onlyoffice服務(當然大家也可以不用集成環境,去獨立安裝環境組建也是一樣的;如果使用人數較多
  • Docker中部署TensorFlow GPU
    Docker中部署TensorFlow GPUDocker 是在 Linux 上啟用 TensorFlow GPU 支持的最簡單方法,因為只需在主機上安裝
  • docker容器的啟動方式
    1.Docker  優勢:    .更高效利用系統資源:由於容器不需要進行硬體虛擬以及運行完整作業系統等額外開銷,Docker 對系統資源的利用率更高。無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效。
  • docker是個什麼東西,幹什麼用?
    docker 是啥? docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。
  • 通過容器化一個Python Web應用學習Docker容器技術
    容器是鏡像的動態表現,本質是一個的進程,鏡像啟動成為進程時,Docker引擎藉助Linux Namespace 技術修改了應用進程看待作業系統的「視圖」,只能「看到」某些指定的內容,並自以為自己是PID=1的1號進程。Docker引擎還利用Linux Cgroups技術對容器進程能夠使用的系統資源,比如CPU、內存等進行了限制。因此,容器就是被Docker引擎加了很多限制的進程。
  • 看完這篇,Docker你就入門了
    每一臺虛擬機包括應用,必要的二進位和庫,以及一個完整的用戶作業系統。而容器技術是和我們的宿主機共享硬體資源及作業系統,可以實現資源的動態分配。容器包含應用和其所有的依賴包,但是與其他容器共享內核。容器在宿主機作業系統中,在用戶控制項以分離的進程運行。容器技術是實現作業系統虛擬化的一種途徑,可以讓您在資源受到隔離的進程中運行應用程式及其依賴關係。