网易首页 > 网易号 > 正文 申请入驻

【蓝因子教育】部署你的Python项目Python-JackPython-Jack​

0
分享至



今天我们来聊一个让很多开发者都比较头疼的问题,这个问题就是项目部署。传统的项目部署,开发团队和运维团队的职责划分并不是特别清楚,开发团队通常要产出可以部署到生产环境的项目,还要负责向运维团队提供相应的文档,文档中必须要对项目所依赖的底层库、三方模块、数据持久化方案、缓存、消息队列、环境参数等一系列的内容加以说明。首选这些工作本身就不是很轻松,而且最为关键的问题是无法保证开发环境和运行环境是一致的。面试的时候也经常有面试官问“有没有遇到项目在开发环境能运行,到了生产环境就出问题的情况,你是如何解决的”之类的问题。

开发环境和生产环境的不一致,还会随着应用的复杂性而加剧,尤其是在将原来的单体应用改造成微服务架构的时候。微服务架构对部署提出了更高的要求,因为每个微服务使用的编程语言、技术栈、依赖的其他服务都可能完全不同,这些都会给部署带来更大的难度。所以,我们需要虚拟化容器技术来解决这些问题,而在所有的容器化技术中,Docker可能是目前最为流行的方案。

简单的说,基于Docker的虚拟化容器技术最为关键的地方在于,我们可以将需要部署的项目做成一个镜像,而这个镜像中包含了项目所依赖的全部内容。将来我们只需要把一个镜像交给运维团队,而运维团队通过这个镜像可以创建一个或多个容器来运行我们的项目,再对这些容器进行管理就可以了。

Docker简介

在介绍Docker之前,我们要先来解释一个叫“LXC”的名词。维基百科上对LXC的解释是:“LXC是Linux软件容器的缩写,是一种操作系统层虚拟化技术,它是Linux内核容器功能的一个用户空间接口。在Linux内核中,提供了功能来达成资源的区隔化,与此同时也提供了名称空间区隔化的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括进程树、网络、用户ID以及挂载的文件系统”。Docker是基于Go语言开发的开源应用容器引擎,对LXC做了进一步的封装,可以管理LXC的环境并提供了简单易用的使用接口,是目前最为流行的Linux容器解决方案。

cgroups

目前,Docker主要被用在以下几个领域:

  1. 提供一次性的环境,容器是即用即删不需要保留的东西。
  2. 提供弹性的云服务,利用Docker可以很轻松的实现系统的伸缩性,也就是说扩容非常容易。
  3. 实践微服务架构,隔离真实环境,可以让服务在容器中运行。

安装Docker

可以按照下面描述的步骤来安装Docker,我们以CentOS为例。

第1步:确定操作系统内核版本(CentOS 7要求64位,内核版本3.10+;CentOS 6要求64位,内核版本2.6+)。

uname -r

第2步:更新系统底层的库文件(建议一定要执行,否则在使用Docker时可能会出现莫名其妙的问题)。

yum update

第3步:移除可能存在的旧的Docker版本。

yum erase -y docker docker-common docker-engine

第4步:安装yum工具包和Docker底层依赖项。

yum install -y yum-utils device-mapper-persistent-data lvm2

第5步:通过yum工具包添加yum安装docker-ce的源。

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

第6步:在CentOS下使用yum安装docker-ce并启动。

yum -y install docker-ce

第7步:启动Docker服务。

systemctl start docker

第8步:查看Docker版本和信息。

docker versiondocker info

创建并运行容器

下面我们带着大家一起来创建几个容器,先感受一下虚拟化容器技术的魅力。

通过容器运行Nginx

Nginx是高性能的Web服务器,同时也是做反向代理服务器的上佳选择,使用Docker可以帮助我们用极为简单的方式创建出运行Nginx的容器。

首先,我们来下载Nginx的官方镜像。如果你有安装操作系统或大型软件的系经验,对镜像这个词一定不会陌生,镜像就类似于我们安装软件时使用的光盘或者ISO文件。我们可以通过下面的命令从Docker仓库中下载Nginx的官方镜像。

docker pull nginx:latest

如果没有特殊说明,默认是从官方提供的镜像仓库来下载该镜像,在我是用的阿里云服务器上,该命令连接的是阿里云提供的官方仓库的替代,因为国内的仓库下载速度更快。当然,如果愿意也可以通过修改目录下的文件来指定下载镜像时所使用的镜像仓库,如下所示。

/etc/docker

daemon.json

{ "registry-mirrors": [ "http://hub-mirror.c.163.com" ]}

提示:修改了配置文件之后,需要重新启动Docker服务。

可以使用来查看所有下载过的镜像,也可以使用命令通过镜像的ID来删除指定的镜像。通过镜像创建容器可以使用命令,如果没有提前使用下载指定的镜像文件,那么在的时候也会先下载该镜像文件,然后再基于该镜像创建容器。

docker images

docker rmi

docker run

docker pull

docker run

docker container run -d -p 80:80 --rm --name webserver nginx:latest

说明:上面的参数是的缩写,表示容器在后台运行并显示容器的ID;是的缩写,用来映射容器的端口到宿主机的端口,冒号前面是宿主机的端口,冒号后面是容器内部使用的端口;表示容器停止后自动删除容器,执行命令后,容器就不复存在了;后面是自定义容器的名字;在创建容器的过程中,需要用到nginx的镜像文件,镜像文件的下载是自动完成的,如果没有指定版本号,默认是。

--detach
-p
--publish
--rm
docker stop webserver
--name
latest

如果需要将自己的Web项目部署到Nginx上,可以使用容器拷贝命令将指定路径下所有的文件和文件夹拷贝到容器的指定目录中。

docker cp /root/web/index.html mynginx:/usr/share/nginx/html

如果不愿意拷贝文件,可以在创建容器时用数据卷操作实现目录映射,通过或将指定的文件夹映射到容器的目录,如下所示。

--volume

-v

/usr/share/nginx/html

docker run -d -p 80:80 --rm --name webserver -v /root/html:/usr/share/nginx/html nginx:latest

提示:如果要重新创建名为的容器,需要先删除之前创建的容器。可以通过来停掉它使其自动删除,也可以通过来强行删除运行中的容器。
webserver
docker stop webserver
docker rm -f webserver

至此,我们可以打开浏览器来查看部署到容器中的Web项目了。如果需要查看运行中的容器,可以使用命令;如果希望看到所有的容器,可以使用命令。

docker ps

docker container ls -a

运行MySQL

通过上面的例子,相信大家已经感受到了容器的便捷性,我们再来尝试用Docker创建运行MySQL服务的容器。

这次我们首先来确认一下有没有名为MySQL的镜像。

docker search mysqlINDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATEDdocker.io docker.io/mysql MySQL is a ... 8486 [OK]...

说明:上面查询结果的列依次代表索引、镜像名、镜像描述、用户评价、是否官方镜像、自动构建。

下载MySQL镜像并指定镜像的版本号。

docker pull mysql:5.7

创建并运行MySQL容器。

docker run -d -p 3306:3306 --name mysql57 -v /root/mysql/conf:/etc/mysql/mysql.conf.d -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

注意:在创建容器时我们使用了数据卷操作,那是因为容器通常是即用即删的,而数据库中的数据却是需要保留下来的。上面的命令中,我们执行了两个数据卷操作,一个是映射了MySQL配置文件所在的文件夹,一个是映射了MySQL数据文件所在的文件夹。在创建该容器的时候,我们还用了参数来指定环境参数,通过来为MySQL指定超级管理员账号对应的口令。当然,在实际应用中,不建议大家使用像这样的弱口令,因为它会给你的系统带来潜在的风险。
-e
MYSQL_ROOT_PASSWORD=123456
root

创建自己的镜像

到此为止,我们已经掌握了如何通过官方提供的镜像来创建并运行容器。如果愿意,我们也可以创建自己的镜像甚至将这些镜像发布到官方镜像仓库或者是自己的私有仓库中。推荐大家使用Dockerfile的方式来构建自己的镜像,下面我们通过例子来说明Dockerfile的使用。

我们首先来编写如下所示的Dockerfile文件,Dockerfile文件是用DSL(领域特定语言)描述的构建一个Docker镜像的指令清单,只要编辑好了这个文件,就可以通过来构建我们自己的镜像了。

docker build

# 指定基础镜像FROM python:3.7# 指定镜像的维护者MAINTAINER jackfrued "jackfrued@126.com"# 设置工作目录WORKDIR /root# 从版本控制克隆代码RUN git clone https://gitee.com/jackfrued/apidemo.git# 设置工作目录WORKDIR /root/apidemo# 安装项目依赖项RUN pip install -r requirements.txt -i https://pypi.doubanio.com/simple/# 为启动脚本添加执行权限RUN chmod 755 start.sh# 容器启动时要执行的命令ENTRYPOINT ["./start.sh"]# 暴露端口EXPOSE 8000

Dockerfile中使用的指令对于懂英语的人来说并不难理解,我们在后续的文章中会为大家专门讲解Dockerfile中的指令。上面的代码通过执行命令从Git仓库克隆了代码,这里我们先简单介绍一个这个项目。这个项目非常简单,由三个文件构成,分别是项目的代码、依赖项清单和启动脚本。

git clone

apidemo

文件是我们用Flask编写的提供API接口的Web后端服务,简单起见并没有使用数据库而是将数据放在了一个列表容器中,代码如下所示。

app.py

from flask import Flaskfrom flask_restful import Resource, Apifrom flask_cors import CORSapp = Flask(__name__)CORS(app, resources={r'/api/*': {'origins': '*'}})api = Api(app)class Product(Resource): def get(self): products = ['Ice Cream', 'Chocolate', 'Coca Cola', 'Hamburger'] return {'products': products}api.add_resource(Product, '/api/products')

文件是项目的依赖项清单,有Python开发经验的对这个文件一定不会陌生。其中,是用来简化API接口开发的三方库,而是用来解决跨域数据请求的三方库,是我们运行Python项目的WSGI服务器,由于添加了库,在启动该服务器时,通过参数和参数可以改善服务器的性能,因为解决了Python中通过线程的方式来无感知使用协程的问题。

requirements.txt

flask-restful

flask-cors

gunicorn

gevent

--worker-class=gevent

--woker-connections=xxx

gevent

flaskflask-restfulflask-corsgunicorngevent

在说一下文件,它是项目的启动脚本,用来启动Gunicorn服务器,代码如下所示。

start.sh

#!/bin/bashexec gunicorn -w 4 -b 0.0.0.0:8000 --worker-class=gevent --worker-connections=512 app:app

接下来我们可以使用命令来创建镜像,如下所示。

docker build

docker build -t "jackfrued/myapp" .

提示:上面的命令中,参数用来指定镜像的名字;最后面的表示从当前路径下寻找Dockerfile。当然,如果你的Dockerfile文件并不在当前路径下,也可以通过绝对路径或相对路径的方式指出Dockerfile文件的位置。
-t

到这里,我们可以使用指令看看我们自己的镜像是否已经创建好了。

docker images

部署Python项目

接下来我们就可以在容器中部署Python项目了,因为有了我们自己定制的镜像,部署项目的工作就变成了一条非常简单的命令

docker run -d -p 8000:8000 --name myapp jackfrued/myapp:latest

执行完上面的命令后,就可以打开浏览器访问服务器的8000端口了,因为上面的项目没有前端页面,我们直接访问API接口,对应的URL路径是。

/api/products

总结

至此,我们已经完成了通过容器部署Python项目的工作,大家一定感受到了容器的简单和强大。但是目前我们使用的这个项目过于简单,甚至没有数据库和缓存,也没有部署前端页面。在后续的文章中,我们会实现项目的前后端分离,把项目需要用到的数据库服务器、缓存服务器、消息队列服务器等全部加入进来,并为大家介绍如何实现多个容器的管理多个容器能够协同工作才能支撑起一个真正意义上的项目,这些内容会在后续更新的文章中为大家阐述,也希望大家能够点赞支持我继续创作

apidemo

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
印度第一夫人:17岁嫁给莫迪,被迫禁欲55年,天天带12个保镖放牛

印度第一夫人:17岁嫁给莫迪,被迫禁欲55年,天天带12个保镖放牛

说历史的老牢
2024-06-17 15:06:39
妖星身价飞涨国米遭遇幸福的烦恼,今年的欧洲杯你看了吗?

妖星身价飞涨国米遭遇幸福的烦恼,今年的欧洲杯你看了吗?

狗哥是一名三十年内拉
2024-06-18 17:25:43
倒反天罡!央视“打假”广州假皮包市场,评论区却都在“求情”

倒反天罡!央视“打假”广州假皮包市场,评论区却都在“求情”

童童聊娱乐啊
2024-06-18 17:08:49
1948年粟裕向中央汇报抗命缘由,主席大惊:你想灭掉450万国军?

1948年粟裕向中央汇报抗命缘由,主席大惊:你想灭掉450万国军?

可乐88
2024-05-31 16:13:16
皇马实惨!一夜间连伤2人,姆巴佩鼻梁骨折,17岁天才训练受伤

皇马实惨!一夜间连伤2人,姆巴佩鼻梁骨折,17岁天才训练受伤

周佳骅
2024-06-18 14:46:33
南海最新消息,中菲在仁爱礁海域发生激烈冲突,两船发生擦碰!

南海最新消息,中菲在仁爱礁海域发生激烈冲突,两船发生擦碰!

青年的背包
2024-06-18 00:44:39
中国外贸发生大变化!高中低端市场全部失守,依赖我国消费者?

中国外贸发生大变化!高中低端市场全部失守,依赖我国消费者?

科普六点半
2024-06-04 09:27:58
为什么所有军旅剧中,营长和排长基本没有出现?网友:怪不得!

为什么所有军旅剧中,营长和排长基本没有出现?网友:怪不得!

文雅笔墨
2024-06-18 11:36:08
大虎睡女演员

大虎睡女演员

霹雳炮
2024-06-12 23:40:59
男人想长寿,尽量少碰这些东西,看完涨知识了!

男人想长寿,尽量少碰这些东西,看完涨知识了!

好笑娱乐君每一天
2024-06-18 22:12:17
他是国歌的词作者,1975年被永远开除党籍,死后骨灰下落不明

他是国歌的词作者,1975年被永远开除党籍,死后骨灰下落不明

老闫侃史
2024-06-17 16:00:03
张维为被殴打?是夜郎自大还是不懂“国情”?

张维为被殴打?是夜郎自大还是不懂“国情”?

兵叔评说
2024-06-13 13:02:56
金莎在被拍到脸上有很多斑点还有法令纹,网友:41岁这样不错了

金莎在被拍到脸上有很多斑点还有法令纹,网友:41岁这样不错了

帝天宇
2024-06-18 18:10:03
中方登上菲船并收缴枪支,菲快艇也被击毁,菲媒:菲海警遭遇惨败

中方登上菲船并收缴枪支,菲快艇也被击毁,菲媒:菲海警遭遇惨败

文雅笔墨
2024-06-18 22:56:10
姚迪:我知道朱婷的水平有多高,相信中国女排会在巴黎大放异彩

姚迪:我知道朱婷的水平有多高,相信中国女排会在巴黎大放异彩

直播吧
2024-06-18 20:45:07
我从广州搬至深圳,真心觉得,我在深圳真的“卷不动”了

我从广州搬至深圳,真心觉得,我在深圳真的“卷不动”了

小陆搞笑日常
2024-06-18 20:29:58
受贿超2000万元,湖南省农业农村厅原党组书记、厅长袁延文一审获刑13年

受贿超2000万元,湖南省农业农村厅原党组书记、厅长袁延文一审获刑13年

鲁中晨报
2024-06-18 16:31:03
用常识判断,姜萍会不会是假造的天才?

用常识判断,姜萍会不会是假造的天才?

刘远举
2024-06-18 18:36:16
万万没想到!祸害3年的新冠突然消失,却留下了5个很奇怪的现象

万万没想到!祸害3年的新冠突然消失,却留下了5个很奇怪的现象

杨哥历史
2024-06-18 16:32:30
中超上海海港足球俱乐部官方公告

中超上海海港足球俱乐部官方公告

建哥说体育
2024-06-18 23:06:10
2024-06-19 00:04:49
原画在线课堂vv
原画在线课堂vv
一家有温度的原画教育机构
421文章数 1关注度
往期回顾 全部

科技要闻

第一批小米车主,已经开始卖车了

头条要闻

媒体:回暖的中澳关系就是一面镜子 照出欧盟的愚蠢

头条要闻

媒体:回暖的中澳关系就是一面镜子 照出欧盟的愚蠢

体育要闻

对于凯尔特人来说 谁是MVP根本不重要

娱乐要闻

被曝新恋情,张碧晨王琳凯发声辟谣

财经要闻

官方:税务部门没有倒查30年的安排

汽车要闻

全球最低价 现代IONIQ 5N预售价39.88万

态度原创

亲子
家居
游戏
数码
艺术

亲子要闻

假如把感冒喝药变成颁奖典礼……

家居要闻

在用什么吃饭这件事上,中国人仪式感拉满了

任天堂直面会:《弹丸论破》团队新作公布 25年推出

数码要闻

超薄的兆芯KX-6000G ITX迷你小板发布:四核3.3GHz、高性能GPU三屏输出

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

无障碍浏览 进入关怀版