利用Docker容器化開發環境

虛擬化雲和容器機器的發展,給我們帶來了極大的方便,尤其是開發環境,開發、測試、驗證環境的維護和一致化一直困擾著開發和測試人員,為了配置一個環境往往需要花費大量的精力,而且還無法解決環境一致性問題,由於環境差異導致的Bug問題也讓開發人員和測試耗費大量的精力。如何解決這種問題?那就是利用神器Docker容器了。本文蟲蟲將實例演示如何使用將Docker來輕鬆地建立一個高效的本地開發環境。

利用Docker容器化開發環境

開發環境架構

我們假設開發組使用了下面一個典型的多餘系統架構,其中涉及了NodeJS、Python、Golang、數據還有Web前端JS等應用,架構圖如下:

利用Docker容器化開發環境

架構組成

構成部分由:

NJS1:NodeJS服務,監聽端口7000,連接數據庫Db1(Psql數據庫,監聽端口5433)。

Py1: Python服務,監聽端口9000,連接數據庫Db1。

Go1: Golang服務,監聽端口5000,連接數據庫Db1。

NJS2: NodeJS服務,監聽端口8000,連接數據庫Db2(Psql數據庫,監聽端口5432)。

Web服務: webpack的開發前端服務器,監聽端口8080。

以上環境可以通過監聽的端口互相通訊和數據交流。

問題分析

管理繁瑣

要管理這些服務,需要打開大量終端窗口,然後單獨運行,雖然可以使用screen和tmux這樣的神器來幫助我們使用多窗口,甚至工作界面的共享等,但是隨著要管理不斷增長,管理會相當繁瑣耗時。

利用Docker容器化開發環境

不一致的依賴環境

假設服務依賴於不同開發語言的版本(比如Python 2和Python 3 )。我們就需要在運行服務之前手動切換環境中語言版本,當然可以用多語言版本管理器比如pyenv我們服務業有可能需要多個數據庫服務器,那麼在運行服務之前,我們需要確保數據庫服務器運行無誤,並且數據庫連接配置都無誤。還有更多的是開發應用的基礎類庫版本的依賴問題。

基於Docker的開發環境

Docker容器是一種完美的工具,可以輕鬆地一鍵創建,部署和運行應用程序。通過容器可以將所有需要的環境打包到一個鏡像中,然後通過鏡像一鍵生成開發容器允。

Docker容器

理想的docker容器是一個超輕量級的linux的虛擬機,在它上面運行的應用程序服務。容器中有應用代碼及其所有依賴環境(系統庫,工具等)。我們上面提到的架構,容器化後如下圖所示:

利用Docker容器化開發環境

容器管理Docker Compose

Docker Compose是一個用於管理和編排容器定義和運行的多應用程序的工具(類似的流行工具還有谷歌的K8s)。通過Compose,可以使用YAML文件來配置應用程序的服務。然後可以一鍵創建和運行所有的服務。Docker Compose也提供Web UI管理界面和容器監控系統等。。

Docker Compose由一下部分構成

服務:服務是可以用Compose工具運行的各個docker容器列表。通過服務我們來定義各個容器名稱、端口以及其他配置。

網絡:網絡組件提供了服務之間互相連接的通道。各個容器可以將自身附加到網絡,相同網絡內的所有容器可以彼此通信。

:默認情況下,Docker容器不包含任何類型的持久性存儲。如果一個docker容器被關掉,那麼其內存中的所有數據都會丟掉。為了持久性保存一些數據,我們需要數據捲來掛載到數據機硬盤上。

利用Docker容器化開發環境

實戰配置

docker-compose.yml配置

我們上述典型環境的docker-compose.yml如下:

利用Docker容器化開發環境

利用Docker容器化開發環境

其中一個服務(njs1)的部分代碼如下:

利用Docker容器化開發環境

服務運行

配置好docker-compose.yml後,可以通過下面命令啟動

docker-compose up

如果配置無誤,比如njs1成功啟動後,將顯示:

利用Docker容器化開發環境

在瀏覽器通過localhost:7000分文該服務。

常見docker-compose命令

build dockerfile的路徑。注意:可以指定包含Dockerfile的文件夾,也可以指定Dockerfile本身的完整路徑。

command 啟動docker容器時運行的命令。

environment 需要設置的所有環境變量。

ports 指定容器內端口與主機端口的映射關係。

working_dir 這是希望運行上面指定的命令的容器內部的路徑。

啟動所有服務

docker-compose start

該命令會啟動docker-compose文件中的所有服務並以demon方式啟動,在後臺運行。

停止所有服務

docker-compose start

停止所有服務

重啟服務

docker-compose restart njs1

啟動特定服務

docker-compose up njs1

在docker-compose.yml服務列表中只啟動njs1

查看特定服務的日誌

docker-compose logs -f njs1

該命令將會在終端打印njs1的日誌。

ssh連接到特定容器

docker-compose exec njs1 bash

總結

本文我們利用docker容器的方式來簡化開發環境的架構,解決典型開發環境中管理繁瑣,環境一致性等問題,為了簡潔我們只以Docker Compose為例進行了架構重建。其實基於Docker編排管理系統K8S,結合Gitlab CI/CD功能,可以實現版本管理、測試、安全掃描、驗證、發佈等一鍵自動化DevOps架構,以後我們會深入探索。

相關推薦

推薦中...