虛擬化云和容器機器的發展,給我們帶來了極大的方便,尤其是開發環境,開發、測試、驗證環境的維護和一致化一直困擾著開發和測試人員,為了配置一個環境往往需要花費大量的精力,而且還無法解決環境一致性問題,由于環境差異導致的Bug問題也讓開發人員和測試耗費大量的精力。如何解決這種問題?那就是利用神器Docker容器了。本文蟲蟲將實例演示如何使用將Docker來輕松地建立一個高效的本地開發環境。
開發環境架構
我們假設開發組使用了下面一個典型的多余系統架構,其中涉及了NodeJS、Python、Golang、數據還有Web前端JS等應用,架構圖如下:
架構組成
構成部分由:
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這樣的神器來幫助我們使用多窗口,甚至工作界面的共享等,但是隨著要管理不斷增長,管理會相當繁瑣耗時。
不一致的依賴環境
假設服務依賴于不同開發語言的版本(比如Python 2和Python 3 )。我們就需要在運行服務之前手動切換環境中語言版本,當然可以用多語言版本管理器比如pyenv我們服務業有可能需要多個數據庫服務器,那么在運行服務之前,我們需要確保數據庫服務器運行無誤,并且數據庫連接配置都無誤。還有更多的是開發應用的基礎類庫版本的依賴問題。
基于Docker的開發環境
Docker容器是一種完美的工具,可以輕松地一鍵創建,部署和運行應用程序。通過容器可以將所有需要的環境打包到一個鏡像中,然后通過鏡像一鍵生成開發容器允。
Docker容器
理想的docker容器是一個超輕量級的linux的虛擬機,在它上面運行的應用程序服務。容器中有應用代碼及其所有依賴環境(系統庫,工具等)。我們上面提到的架構,容器化后如下圖所示:
容器管理Docker Compose
Docker Compose是一個用于管理和編排容器定義和運行的多應用程序的工具(類似的流行工具還有谷歌的K8s)。通過Compose,可以使用YAML文件來配置應用程序的服務。然后可以一鍵創建和運行所有的服務。Docker Compose也提供Web UI管理界面和容器監控系統等。。
Docker Compose由一下部分構成
服務:服務是可以用Compose工具運行的各個docker容器列表。通過服務我們來定義各個容器名稱、端口以及其他配置。
網絡:網絡組件提供了服務之間互相連接的通道。各個容器可以將自身附加到網絡,相同網絡內的所有容器可以彼此通信。
卷:默認情況下,Docker容器不包含任何類型的持久性存儲。如果一個docker容器被關掉,那么其內存中的所有數據都會丟掉。為了持久性保存一些數據,我們需要數據卷來掛載到數據機硬盤上。
實戰配置
docker-compose.yml配置
我們上述典型環境的docker-compose.yml如下:
其中一個服務(njs1)的部分代碼如下:
服務運行
配置好docker-compose.yml后,可以通過下面命令啟動
docker-compose up
如果配置無誤,比如njs1成功啟動后,將顯示:
在瀏覽器通過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架構,以后我們會深入探索。