(第一篇)記一次python分散式web開發(利用docker)
- 2020 年 12 月 23 日
- 筆記
作者:落陽
日期:2020-12-23
在一次項目開發中,決定使用docker+nginx+flask+mysql的技術棧來開發,用此系列文章記錄開發的過程。
系列文章,當前為第一篇,記錄一次python分散式web開發過程。
一、docker的安裝
作為學生,想找到合適數量的電腦部署分散式系統是一個令人頭疼的問題。所以打算在虛擬機上利用docker來部署偽分散式的系統,方便環境搭建、開發和二次部署。
docker定義如下(摘自百度百科):
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發布到任何流行的 Linux或Windows 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。
docker的安裝可參見官網:docker官方安裝教程
安裝完成後,運行下面的命令驗證是否安裝成功:
docker version
# 或者
docker info
docker安裝完成之後,每一次使用docker命令都需要sudo許可權,可以考慮把當前用戶加入docker用戶組或者進入sudo su
模式,這裡採用第二種方法。
二、拉取所需的鏡像
根據採用的技術棧,目前確定需要拉取的鏡像有nginx、python、mysql。
含flask框架的鏡像可以在python鏡像的基礎上製作。
拉取鏡像的命令如下:
docker pull mysql
# 拉取比較穩定的3.8版本的python即可
docker pull python:3.8
docker pull nginx
之後輸入命令
docker images
即可查看拉取下來的鏡像。
三、啟動容器
由於這個分散式的項目需要啟動多個容器,所以這裡使用了docker-compose來配置和啟動多個容器,docker-compose解釋如下(摘自菜鳥教程):
Compose 是用於定義和運行多容器 Docker 應用程式的工具。通過 Compose,您可以使用 YML 文件來配置應用程式需要的所有服務。然後,使用一個命令,就可以從 YML 文件配置中創建並啟動所有服務。
windows和mac上在安裝docker的同時會一起安裝了docker-compose,linux需要額外安裝。如果你電腦上有pip的話可以利用pip很容易的安裝:
pip install docker-compose
之後docker-compose命令會默認處於環境變數之下,可以輸入
docker-compose --help
檢查是否安裝成功。
之後就是配置docker-compose.yml文件,關於docker-compose的使用和配置文件的配置教程可以參考//vuepress.mirror.docker-practice.com/compose/
目前配置如下:
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 //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 //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配置如下:
[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文件會被自動執行,詳情參考官方文檔//hub.docker.com/_/mysql。這裡將建庫建表文件放到mymysql文件夾下並將/docker-entrypoint-initdb.d掛載到此文件夾,在mysql容器初始化時便自動建表,且方便二次修改。
其次,為了避免mysql容器每次啟動會自動重新分配ip地址,docker-compose配置中創建了一個網路並為mysql固定了它的ip地址以便flask可以順利穩定的連接上。
四、初步效果
通過上面的一系列配置,在虛擬機上輸入url來查看效果//127.0.0.1:8080/
效果如圖
以上是初步搭建出來的效果。