作者:落阳

日期:2020-12-23

在一次项目开发中,决定使用docker+nginx+flask+mysql的技术栈来开发,用此系列文章记录开发的过程。

系列文章,当前为第一篇,记录一次python分布式web开发过程。

一、docker的安装


作为学生,想找到合适数量的计算机部署分布式系统是一个令人头疼的问题。所以打算在虚拟机上利用docker来部署伪分布式的系统,方便环境搭建、开发和二次部署。

docker定义如下(摘自百度百科):

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 LinuxWindows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

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的使用和配置文件的配置教程可以参考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/

效果如图

以上是初步搭建出来的效果。

(第一篇)记一次python分布式web开发(利用docker)的更多相关文章

  1. 如何用Python做Web开发?——Django环境配置

    用Python做Web开发,Django框架是个非常好的起点.如何从零开始,配置好Django开发环境呢?本文带你一步步无痛上手.     概念 最近有个词儿很流行,叫做“全栈”(full stack ...

  2. spring 第一篇(1-1):让java开发变得更简单(下)转

    spring 第一篇(1-1):让java开发变得更简单(下) 这个波主虽然只发了几篇,但是写的很好 上面一篇文章写的很好,其中提及到了Spring的jdbcTemplate,templet方式我之前 ...

  3. 在 Windows 上使用 Python 进行 web 开发

    本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上一篇我们介绍了在Windows 10下进行初学者入门开发Python的指 ...

  4. Python分布式爬虫开发搜索引擎 Scrapy实战视频教程

    点击了解更多Python课程>>> Python分布式爬虫开发搜索引擎 Scrapy实战视频教程 课程目录 |--第01集 教程推介 98.23MB |--第02集 windows下 ...

  5. 基于gin的golang web开发:docker

    Golang天生适合运行在docker容器中,这得益于:Golang的静态编译,当在编译的时候关闭cgo的时候,可以完全不依赖系统环境. 一些基础 测试容器时我们经常需要进入容器查看运行情况,以下命令 ...

  6. 开博客这么久以来,第一篇技术文章,python与c的接口对接

    在博客园开博客已经有了蛮长时间了,但是从来只是看别人的文章,自己却从未写过一篇技术文章,深表惭愧.内心还是希望能够给大家提供一些帮助的,希望这第一篇技术博客,能够给大家一些帮助.闲话少叙,开始正文. ...

  7. [python] python django web 开发 —— 15分钟送到会用(只能送你到这了)

    1.安装python环境 1.1 安装python包管理器: wget https://bootstrap.pypa.io/get-pip.py sudo python get-pip.py   1. ...

  8. Python的web开发

    一.Web开发 Tcp   udp       Cs即客户端.服务器端编程,客户端和服务器端之间需要使用socket,约定协议.版本(协议使用的是tcp或者udp).Tcp协议和udp协议,指定地址和 ...

  9. 【python】 web开发入门

    进入Web开发 现在你完成了Python忍者训练,准备深入Ptyhon的Web开发,但现在的问题是有很多的框架,从中选择最好的框架非常困难,但从初学者的角度出发,Flask基本Web框架将非常适合We ...

随机推荐

  1. 苹果电脑中怎么快速卸载Flash Player和浏览器扩展应用插件

    Adobe Flash Player是一款轻量级浏览器插件,帮助你在网页浏览过程中享受更广泛的多媒体体验.是一种拓展,与Java一样,成为安全和隐私问题的重要来源.这些都需要手动删除的Flash是令人 ...

  2. 【linux】串口通讯工具-minicom简介+简单操作

    目录 前言 简介 尝试运行 配置 minicom 运行 minicom minicom 其它操作 前言 windows 上有不少的串口通信工具了,今天介绍一个linux下的一个串口通信工具-minic ...

  3. 关于UILabel标签控件的使用小节

    前段时间一直想停下来,总结一下近期在开发中遇到的一些问题顺便分享一下解决问题的思路和方法,无奈人生就像蒲公英,看似自由却身不由己.太多的时间和精力被占用在新项目的开发和之前项目的维护中,总之一句话外包 ...

  4. LeetCode周赛#206

    1583. 统计不开心的朋友 #模拟 #暴力 题目链接 题意 有n为朋友,对每位朋友i,preference[i]包含 按亲密度从大到小 的朋友编号. 朋友们会被分为若干对,配对情况由pairs数组给 ...

  5. (1)Consul在linux环境的集群部署

    1.Consul概念 1.1什么是Consul? Consul是一种服务网格解决方案,是HashiCorp公司推出的开源组件,由Go语言开发,部署起来很容易,只需要极少的可执行程序和配置.同时Cons ...

  6. Beego框架学习--(核心:数据交互)

    Beego框架学习记录 1.beego简介 beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计 ...

  7. CenOS下载离线依赖包神器--yumdownloader

    Blog:博客园 个人 本文只总结一些常用的用法,更详细的说明见man yumdownloader和 info yumdownloader. 概述 有时候所在服务器环境不能访问外网,yum安装会感到非 ...

  8. Spring Cloud 学习 (一) Eureka

    微服务的功能主要有以下几个方面: 服务的注册和发现 服务的负载均衡 服务的容错 服务网关 服务配置的统一管理 链路追踪 实时日志 服务注册是指向服务注册中心注册一个服务实例,服务提供者将自己的服务信息 ...

  9. springmvc<二> 一些配置

    1.1.3. Web MVC Config    1.1.2中的解析器可以自定义实现,DispatcherServlet检查每个特殊bean的WebApplicationContext,如果没有匹配的 ...

  10. 第3.8节 Python百分号占位符的字符串格式化方法

    一.    概念         格式化字符串就是将一些变量转换为字符串并按一定格式输出字符串,包括指定字符的位置.对齐方式.空位补充方式等.Python提供了多种字符串格式设置方法.本节先介绍一种简 ...