做者:落陽html
日期:2020-12-23vue
在一次項目開發中,決定使用docker+nginx+flask+mysql的技術棧來開發,用此係列文章記錄開發的過程。python
系列文章,當前爲第一篇,記錄一次python分佈式web開發過程。mysql
做爲學生,想找到合適數量的計算機部署分佈式系統是一個使人頭疼的問題。因此打算在虛擬機上利用docker來部署僞分佈式的系統,方便環境搭建、開發和二次部署。linux
docker定義以下(摘自百度百科):nginx
Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的鏡像中,而後發佈到任何流行的 Linux或Windows 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口。web
docker的安裝可參見官網:docker官方安裝教程sql
安裝完成後,運行下面的命令驗證是否安裝成功:docker
docker version # 或者 docker info
docker安裝完成以後,每一次使用docker命令都須要sudo權限,能夠考慮把當前用戶加入docker用戶組或者進入sudo su
模式,這裏採用第二種方法。flask
根據採用的技術棧,目前肯定須要拉取的鏡像有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的使用和配置文件的配置教程能夠參考https://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 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配置以下:
[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。這裏將建庫建表文件放到mymysql文件夾下並將/docker-entrypoint-initdb.d掛載到此文件夾,在mysql容器初始化時便自動建表,且方便二次修改。
其次,爲了不mysql容器每次啓動會自動從新分配ip地址,docker-compose配置中建立了一個網絡併爲mysql固定了它的ip地址以便flask能夠順利穩定的鏈接上。
經過上面的一系列配置,在虛擬機上輸入url來查看效果http://127.0.0.1:8080/
效果如圖
以上是初步搭建出來的效果。