VOOZH about

URL: https://read01.com/2DLOgE.html

⇱ 使用Docker構建高效Web開發環境 - 壹讀


Sunday, Apr 12, 2026

使用Docker構建高效Web開發環境

2016/11/22 來源:編程派

本文介紹如何使用 Docker 構建一個高效的 Web 開發環(Linux+Docker+Python+JavaScript),這也是我的日常開發環境。

準備Docker

  1. 安裝Docker

    不要漏了閱讀Create a Docker group部分。
  2. 安裝Docker Compose

    也可以使用pip install docker-compose安裝。
  3. Docker Compose快捷命令

    $ which docker-compose /usr/bin/docker-compose $ cp /usr/bin/docker-compose /usr/bin/dc

    因為在我的系統(Arch Linux)上,dc是一個系統自帶的任意精度的計算器,所以直接覆蓋它。

    如果你的系統沒有自帶dc,你也可以在~/.bashrc文件中添加alias dc=docker-compose實現。

  4. 用Google搜Docker教程,趕緊入門吧。另外,Docker官網的教程最新,最準確,最全面,非常值得去看。

Docker鏡像加速

剛開始使用Docker時最煩的就是下載鏡像,太!慢!了!

現在DaoCloud和阿里雲都有提供免費的鏡像加速服務,逐漸也有其他一些服務商提供鏡像加速。

首先,需要獲取一個鏡像加速地址(registry-mirror),需註冊後打開下面連結。

如果您的系統是 Ubuntu 12.04 14.04,Debain 8 等系統,Docker 1.9 以上,編輯文件,添加或修改registry-mirror:DOCKER_OPTS="$DOCKER_OPTS --registry-mirror=https://xxxxxx.mirror.aliyuncs.com"

重啟Docker:

如果你的系統使用 systemd 作為系統和服務管理器,Docker 1.9 以上,編輯/usr/lib/systemd/system/docker.serviceExecStart=/usr/bin/dockerd -H fd:// --registry-mirror=https://xxxxxx.mirror.aliyuncs.com

重啟Docker:

sudo systemctl daemon-reload sudo systemctl restart docker

可以使用服務商提供的腳本一鍵配置(不一定能配成功)。

推薦豆瓣的鏡像,速度很快。

命令行使用,全局配置,編輯~/.config/pip/pip.conf文件:ini [global] index-url = https://pypi.douban.com/simplenpm鏡像加速

推薦淘寶鏡像

命令行使用:

npm --registry=https://registry.npm.taobao.org

全局設置:

把依賴裝進Docker

Web開發,基本上都會用到資料庫,緩存等等。使用Docker可以輕鬆的安裝和控制這些依賴,這也是高效測試的基礎。

通常項目結構如下(這裡只介紹開發環境,生產環境以後再補充):

app/ 項目代碼 docker/ 容器的初始配置 data/ 數據,日誌等等 manage.py 啟動腳本 Dockerfile 生產環境鏡像 docker-compose.yml 生產環境 docker-compose-dev.yml 開發環境docker-compose-dev.yml文件,這裡假設依賴 MySQL 5.7 和 Redis:version: '2' services: mysql: image: mysql:5.7 environment: - MYSQL_ROOT_PASSWORD=root volumes: - ./docker/mysql/init.sql:/docker-entrypoint-initdb.d/init.sql - ./data/mysql:/var/lib/mysql ports: - "3306:3306" redis: image: redis:3 volumes: - ./data/redis:/data ports: - "6379:6379"./docker/mysql/init.sql是用於創建資料庫的腳本(參考:),為了與線上資料庫編碼保持一致,內容大致如下:create database if not exists mydb character set utf8mb4 collate utf8mb4_unicode_ci;

運行以下命令,稍等片刻,所有依賴就啟動好了:

dc -f docker-compose-dev.yml up

如果需要操作資料庫:

dc -f docker-compose-dev.yml exec mysql mysql -uroot -proot mydbMakefile快捷命令

Make是Linux下最常用的構建工具,構建規則都寫在Makefile文件裡面,主要用於C語言的項目。這裡只用到它的一小部分功能:快捷命令,其他功能可參考Make 命令教程

然後執行也可以在命令前面加上然後執行,命令本身就不會顯示出來了:$ make dev docker is awesome!

最終版本:

dev: @docker-compose -f docker-compose-dev.yml up mysql: @docker-compose -f docker-compose-dev.yml exec mysql mysql -uroot -proot mydbPython高效測試

我是單元測試的忠實擁護者,因為我意識到單元測試能極大的減少調試,修改BUG,重構的時間和痛苦。

當我重構一個 Python 2 的庫時,因為有完善的單元測試,所有我能放心大膽的修改代碼,修改之後我只需運行一下測試就知道哪裡還有問題需要修改,而不用去猜測和仔細檢查代碼以避免疏漏。

當全部測試通過之後,我就有信心這個庫不會出大的Bug,至少能和上一個版本差不多穩定。

另一方面,我也意識到不能過度追求測試的數量和覆蓋率。

過度的測試需要花費太多的時間和精力,而收到的效果甚微,95% 和 99%的測試覆蓋率其實差別不大,99% 和 100% 的差別就更小了,但是為了達到更高的測試覆蓋率,卻需要仔細的構造測試用例才能執行到未測試的代碼。

測試的付出和收益中有個平衡點,達到預期目標即可,簡言之,點到為止:

my philosophy is to test as little as possible to reach a given level of confidence

這兩篇問答很值得一讀:

上面介紹的是測試之道,下面說的是測試之術。

對接口做測試,不對具體實現做測試

接口是供其他模塊調用的最小單元,參數,返回值,可能拋出的異常這些都比較明確,接口也較少出現改動。這意味著對接口做測試的優勢:

  • 有價值,不測別人不用的代碼

  • 容易測,接口文檔明確

  • 不用改,接口較少改動

開發人員自測,先寫具體實現後寫測試

自己的代碼自己測,一方面自己對自己寫的接口會更熟悉,容易編寫測試用例。

另一方面是自己的屁股自己擦,自己寫的代碼理應保證邏輯正確,如果測試中發現Bug自己可以及時改,

不用等測試人員告訴你:大哥,你屁股沒擦乾淨!

先寫具體實現後寫測試是因為如果先寫測試,就要求接口設計非常完善,不然寫具體實現時發現

接口設計不合理,再去修改測試代碼就浪費了時間和精力。另外,測試是為了檢驗邏輯是否正確,如果只有測試沒有具體實現,難以判斷測試寫的對不對,看不到測試覆蓋率,就難以判斷測試完不完善。

用Docker運行測試資料庫

業務代碼很多都是增刪查改,所以不可能mock一個資料庫。

另外測試過程中會產生很多垃圾數據,絕對不能用生產環境的資料庫去測。

用Docker運行測試資料庫是一個非常好的解決辦法,啟動停止都非常簡單。

如果項目比較大,測試時間較長,還可以用內存來存儲資料庫數據(使用宿主機的/tmp目錄):

volumes: - /tmp/mysql:/var/lib/mysql

這樣測試速度能提高10倍左右。

測試之間相互獨立,可以按模塊單獨運行

測試開始前創建表,寫入初始數據,測試結束清空資料庫,這樣就能保證資料庫裡面的數據是確定的。

使用pytest執行測試,它可以控制執行。

哪些測試,不必每次都執行全部測試,插件也很豐富,非常方便。

藉助ipdbpdb進行調試

掃碼關注編程派

您可能感興趣
免責聲明:本文內容來源于編程派,文章觀點不代表壹讀立場,如若侵犯到您的權益,或涉不實謠言,敬請向我們提出檢舉
最新文章 / 服務條款 / 私隱保護 / DMCA / 聯絡我們

壹讀/READ01.COM