1. 程式人生 > >記一次python分散式web開發(利用docker)

記一次python分散式web開發(利用docker)

作者:落陽 日期:2020-12-23 在一次專案開發中,決定使用docker+nginx+flask+mysql的技術棧來開發,用此係列文章記錄開發的過程。 系列文章,當前為第一篇,記錄一次python分散式web開發過程。 ## 一、docker的安裝 --- 作為學生,想找到合適數量的計算機部署分散式系統是一個令人頭疼的問題。所以打算在虛擬機器上利用docker來部署偽分散式的系統,方便環境搭建、開發和二次部署。 docker定義如下(摘自百度百科): > Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的[映象](https://baike.baidu.com/item/映象/1574)中,然後釋出到任何流行的 [Linux](https://baike.baidu.com/item/Linux)或[Windows](https://baike.baidu.com/item/Windows/165458) 機器上,也可以實現[虛擬化](https://baike.baidu.com/item/虛擬化/547949)。容器是完全使用[沙箱](https://baike.baidu.com/item/沙箱/393318)機制,相互之間不會有任何介面。 docker的安裝可參見官網:[docker官方安裝教程](https://docs.docker.com/engine/install/) 安裝完成後,執行下面的命令驗證是否安裝成功: ```bash docker version # 或者 docker info ``` docker安裝完成之後,每一次使用docker命令都需要sudo許可權,可以考慮把當前使用者加入docker使用者組或者進入`sudo su`模式,這裡採用第二種方法。 ## 二、拉取所需的映象 --- 根據採用的技術棧,目前確定需要拉取的映象有nginx、python、mysql。 含flask框架的映象可以在python映象的基礎上製作。 拉取映象的命令如下: ```bash docker pull mysql # 拉取比較穩定的3.8版本的python即可 docker pull python:3.8 docker pull nginx ``` 之後輸入命令 ```bash docker images ``` 即可檢視拉取下來的映象。 ## 三、啟動容器 由於這個分散式的專案需要啟動多個容器,所以這裡使用了docker-compose來配置和啟動多個容器,docker-compose解釋如下(摘自菜鳥教程): > Compose 是用於定義和執行多容器 Docker 應用程式的工具。通過 Compose,您可以使用 YML 檔案來配置應用程式需要的所有服務。然後,使用一個命令,就可以從 YML 檔案配置中建立並啟動所有服務。 windows和mac上在安裝docker的同時會一起安裝了docker-compose,linux需要額外安裝。如果你電腦上有pip的話可以利用pip很容易的安裝: ```bash pip install docker-compose ``` 之後docker-compose命令會預設處於環境變數之下,可以輸入 ```bash docker-compose --help ``` 檢查是否安裝成功。 之後就是配置docker-compose.yml檔案,關於docker-compose的使用和配置檔案的配置教程可以參考[https://vuepress.mirror.docker-practice.com/compose/](https://vuepress.mirror.docker-practice.com/compose/) 目前配置如下: ```yml version: "3.2" services: flask1: image: python:3.8 container_name: flask1 restart: always volumes: - /root/myflask/estateProject:/estateProject - /root/myflask/uwsgi1:/uwsgi working_dir: /uwsgi command: /bin/bash -c "pip install -r /estateProject/requirements.txt -i https://pypi.douban.com/simple && uwsgi --ini uwsgi.ini" flask2: image: python:3.8 container_name: flask2 restart: always volumes: - /root/myflask/estateProject:/estateProject - /root/myflask/uwsgi2:/uwsgi working_dir: /uwsgi command: /bin/bash -c "pip install -r /estateProject/requirements.txt -i https://pypi.douban.com/simple && uwsgi --ini uwsgi.ini" nginx: image: nginx container_name: nginx restart: always ports: - "127.0.0.1:8080:80" - "127.0.0.1:8081:443" volumes: - /root/mynginx/html:/usr/share/nginx/html - /root/mynginx/conf:/etc/nginx depends_on: - flask1 - flask2 mysql: image: mysql container_name: mysql restart: always command: --default-authentication-plugin=mysql_native_password networks: my-net: ipv4_address: 172.21.0.2 volumes: - /root/mymysql:/docker-entrypoint-initdb.d environment: - MYSQL_DATABASE=estate_db - MYSQL_ROOT_PASSWORD=123456 networks: my-net: driver: bridge name: my-net ipam: driver: default config: - subnet: 172.21.0.0/16 gateway: 172.21.0.1 ``` 目前建立了四個容器一個網路。 兩個flask容器都是用python:3.8基礎上安裝requirements.txt文件中的庫。並且掛載了目錄到宿主機上,避免在容器中的資料層的修改(在docker中不提倡直接修改容器中的資料層)。flask外面套了一層中間層uwsgi目的是讓flask和反向代理nginx連線上,並且增加flask的穩定性。uwsgi.ini配置如下: ```ini [uwsgi] socket = 0.0.0.0:8080 chdir = /estateProject/ wsgi-file = run.py callable = app processes = 2 threads = 2 ``` 由於uwsgi不直接做伺服器,而是作為一個類似中介般的存在,所以這裡開放socket埠與nginx作連線以增加安全性和速度。 在mysql容器中的/docker-entrypoint-initdb.d目錄下的sql、sh檔案會被自動執行,詳情參考官方文件[https://hub.docker.com/_/mysql](https://hub.docker.com/_/mysql)。這裡將建庫建表文件放到mymysql資料夾下並將/docker-entrypoint-initdb.d掛載到此資料夾,在mysql容器初始化時便自動建表,且方便二次修改。 其次,為了避免mysql容器每次啟動會自動重新分配ip地址,docker-compose配置中建立了一個網路併為mysql固定了它的ip地址以便flask可以順利穩定的連線上。 ## 四、初步效果 --- 通過上面的一系列配置,在虛擬機器上輸入url來檢視效果http://127.0.0.1:8080/ 效果如圖 ![初步效果](https://img-blog.csdnimg.cn/20201223130047814.png) 以上是初步搭建出來的效果。