笔记-Docker 部署Python项目

引言

设想这样一个真实案例,假如我们要部署一个Python应用程序,要做哪些工作?首先需要python运行环境,比如部署的是python3,而机器上是python2。先装个python3,还要装各种依赖包,机器一些可能的冲突。装完python之后,发现还要装mysql或者redis。继续下载安装配置。啥?服务器不用了,需要换一台服务器?那重新来一遍吧。啥?基础应用做的太好要进行推广,需要指导其他厂商部署?这怎么办?可以看出,在 Docker 之前软件行业的运维存在着以下这些痛点:

软件的发布和部署低效又繁琐,而且总是需要人工介入
环境的一致性难移保证
在不同环境之间迁移的成本较高

在完成Docker部署安装之前,我们还是先认识下Docker的优点:

软件构建容易,分发简单
应用得到隔离,依赖被解除
可以完美地用于 CI/CD
快速部署,测试完以后销毁也方便

1 什么是Docker

    Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。2013年3月,dotCloud公司的创始人之一,Docker之父,28岁的Solomon Hykes正式决定,将Docker项目开源,Docker 自开源后受到广泛的关注和讨论。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。WIn10下Docker下载地址:链接: https://pan.baidu.com/s/1GlneodbQduUdX9yLRF2hcA 提取码: mqf6。Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。有了 Docker,就不用担心环境问题。总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

通俗解释Docker

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,把货物规整的摆放起来。并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。docker就是类似的理念。现在都流行云计算了,云计算就好比大货轮。docker就是集装箱。不同的应用程序可能会有不同的应用环境,比如.net开发的网站和php开发的网站依赖的软件就不一样,如果把他们依赖的软件都安装在一个服务器上就要调试很久,而且很麻烦,还会造成一些冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来讲,我们可以在服务器上创建不同的虚拟机在不同的虚拟机上放置不同的应用,但是虚拟机开销比较高。docker可以实现虚拟机隔离应用环境的功能,并且开销比虚拟机小,小就意味着省钱了。开发软件的时候用的是Ubuntu,但是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,比如:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程当中运维就得想办法解决这样的问题。这时候要是有docker你就可以把开发环境直接封装转移给运维,运维直接部署你给他的docker就可以了。而且部署速度快。在服务器负载方面,如果你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。总之docker就是集装箱原理。
2 Docker用途

Docker 的主要用途,目前有三大类。

提供一次性的环境。本地测试的软件、持续集成的时候提供单元测试和构建的环境。
提供弹性的云服务。因为 Docker 容器可以随开随关,很适合动态扩容和缩容。
组建微服务架构。一台机器可以跑多个服务,在本机可以模拟出微服务架构。

2应用场景

Web 应用的自动化打包和发布。
自动化测试和持续集成、发布。
在服务型环境中部署和调整数据库或其他的后台应用。
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

Docker 能干什么?

简化配置:这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。

代码流水线管理:前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。

提高开发效率:这就带来了一些额外的好处:Docker能提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考Aater在DevOpsDays Austin 2014 大会或者是DockerCon上的演讲。 不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。

理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。

隔离应用: 有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。我们经常需要考虑两点,一是因为要降低成本而进行服务器整合,二是将一个整体式的应用拆分成松耦合的单个服务(译者注:微服务架构)。如果你想了解为什么松耦合的应用这么重要,请参考Steve Yege的这篇论文,文中将Google和亚马逊做了比较。

整合服务器:正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。

调试能力:Docker提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。你可以在《Docker拯救世界》的文章中找到这一点的例证。

多租户: 另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。

快速部署: 在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。这正是Google和Facebook都看重的特性。你可以在数据中心创建销毁资源而无需担心重新启动带来的开销。通常数据中心的资源利用率只有30%,通过使用Docker并进行有效的资源分配可以提高资源的利用率。

3 Docker优点

更快速的交付和部署:Docker在整个开发周期都可以完美的辅助你实现快速交付。Docker允许开发者在装有应用和服务本地容器做开发。可以直接集成到可持续开发流程中。例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
高效的部署和扩容:Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
更高的资源利用率:Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
更简单的管理:使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。

4 Docker的三个概念

 镜像(Image):类似于虚拟机中的镜像。任何应用程序运行都需要环境,而镜像就是用来提供这种运行环境的。例如一个Ubuntu镜像就是一个包含Ubuntu操作系统环境的模板,同理在该镜像上装上Apache软件,就可以称为Apache镜像。
容器(Container):类似于一个轻量级的沙盒,可以将其看作一个极简的Linux系统环境(包括root权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序。Docker引擎利用容器来运行、隔离各个应用。容器是镜像创建的应用实例,可以创建、启动、停止、删除容器,各个容器之间是是相互隔离的,互不影响。注意:镜像本身是只读的,容器从镜像启动时,Docker在镜像的上层创建一个可写层,镜像本身不变。
仓库(Repository):类似于代码仓库,这里是镜像仓库,是Docker用来集中存放镜像文件的地方。注意与注册服务器(Registry)的区别:注册服务器是存放仓库的地方,一般会有多个仓库;而仓库是存放镜像的地方,一般每个仓库存放一类镜像,每个镜像利用tag进行区分,比如Ubuntu仓库存放有多个版本(12.04、14.04等)的Ubuntu镜像。

5 Docker的使用

5.1 Win10下安装Docker

第一步:启动虚拟环境:Win10 系统下安装Docker,首先WIN+X,点击应用和功能;之后点击右侧的“程序和功能”,接着点击左侧栏“启用或关闭Windows功能”,并做以下Hyper-V(hyper-v可以理解为虚拟机平台)的配置:

第二步:安装Toolbox:最新版 Toolbox下载地址 链接: https://pan.baidu.com/s/1Nx3gVdbRrO32elJcRBfiOA 提取码: dsd4 。下载完成后,双击下载的 Docker for Windows Installer 安装文件,一路 Next,点击 Finish 完成安装。docker toolbox是一个工具集,它主要包含以下一些内容:Docker CLI 客户端,用来运行docker引擎创建镜像和容器;Docker Machine. 可以让你在windows的命令行中运行docker引擎命令;Docker Compose. 用来运行docker-compose命令;Kitematic. 这是Docker的GUI版本;Docker QuickStart shell. 这是一个已经配置好Docker的命令行环境;Oracle VM Virtualbox. 虚拟机

安装完成后,Docker 会自动启动。通知栏上会出现个小鲸鱼的图标img,这表示 Docker 正在运行。桌边也会出现三个图标,我们可以在命令行执行 docker version 来查看版本号,docker run hello-world 来载入测试镜像测试。

点击WIN+R,输入CMD打开命令行窗口,输入命令docker version结果如下:

运行docker run hello-world 来载入测试镜像测试,效果如下:

第三步:镜像加速:鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。请在该配置文件中加入(没有该文件的话,请先建一个):

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

也可以通过点击小鲸鱼右键settings来设置:

5.2 Docker 常用命令

确认容器有在运行,可以通过 docker ps 来查看
使用 docker stop 容器Name 命令来停止容器
查看docker信息 docker info
删除镜像:docker rmi imageID
停用镜像:docker stop ImageID
重启镜像: docker start imageID
删除容器: docker rm ID
docker inspect 来查看 Docker 的底层信息
docker images 查看docker 镜像
从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/
使用 docker search 命令来搜索镜像。如搜索httpd的镜像。
使用命令 docker pull 来下载镜像。
命令 docker build , 从零开始来创建一个新的镜像
容器连接:指定容器绑定的网络地址,比如绑定 127.0.0.1

6 Docker的实例

6.1 Docker 安装 MySQL

第一步:创建MySQL镜像:docker pull mysql。查找Docker Hub上的mysql镜像: docker search mysql

第二步:下载镜像: docker pull mysql:5.6

第三步:查看镜像。列表里查到REPOSITORY为mysql,标签为5.6的镜像。docker images mysql

第四步:使用最新的MySQL镜像。

# docker 中下载 mysql
docker pull mysql
​
#启动,设置初始密码
docker run --name bnc-mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
​
#进入容器
docker exec -it bnc-mysql bash
​
#登录mysql
mysql -u root -p
ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; 
FLUSH PRIVILEGES;#添加远程登录用户
CREATE USER 'liaozesong'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'liaozesong'@'%';
 

第五步:远程连接MySQL数据库。

第六步:新授权用户连接测试。

6.2 Docker 安装 Python项目

场景描述:我们使用一个简单的python项目,本项目是中文分词的算法。如何实现Docker安装部署。

第一步: Win10下创建目录文本。选择在D盘下创建docker目录,分别新建三个文件:Dockerfile,app.py,equirements.txt

Dockerfile(没有后缀):一个文本文件,包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。创建镜像必须文件。

# 基于镜像基础
FROM python:3.7
  
# 设置代码文件夹工作目录 /app
WORKDIR /app
  
# 复制当前代码文件到容器中 /app
ADD . /app
  
# 安装所需的包
RUN pip install -r requirements.txt
  
# Run app.py when the container launches
CMD ["python", "app.py"]

app.py:python项目的源代码,这里测试的单个python文件,如果是一个完整项目,可以将整个文件夹拷贝到这里。
 

	
# coding:utf8"""
DESC: Python数据预处理之第一个分词程序范例
Author:伏草惟存
Prompt: code in Python3 env
"""import jieba
​
str = "道路千万条,安全第一条;行车不规范,亲人两行泪。"
print("原句: \n" + str)
​
seg_list = jieba.cut(str)
print("分词: \n" + " / ".join(seg_list))

equirements.txt :所需要的插件,以python为例,其获取方法是cmd命令,进入到【D:\docker】目录,执行命令:pip freeze > requirements.txt

第二步:生成镜像。本文采用的windows环境。docker build -t friendlyhello .命令中最后的点不要忘记,这里表示当前目录

第三步:查看镜像是否生成

第四步:运行镜像程序,这里可以看到分词效果

6.3 Docker 安装 Django项目

第一步:载入镜像。一般采用自构建的方法,本文采用直接pull下载完成。docker pull training/webapp

第二步:运行镜像。docker run -d -P training/webapp python app.py # 多个PORTS端口

第三步:浏览器输入本地ip:端口号,访问网页信息

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python运维笔记md文档是一个以Markdown格式编写的文档,用于记录Python运维工作中的经验、问题和解决方案。 在该文档中,可以记录各种Python运维相关的内容,比如常见的运维任务、常用的Python库和工具、部署和维护技巧等等。通过整理和记录这些信息,可以方便自己和他人查阅和参考,提高工作效率和技术水平。 该文档可以分为不同的章节和目录,以便组织和查找信息。每个章节可以包含多个子章节,每个子章节可以包含多个文档段落。每个文档段落可以包含标题、正文、代码示例等内容。 在Python运维笔记md文档中,可以记录一些常见的运维任务,比如集群管理、日志处理、性能优化等。对于每个任务,可以记录该任务的目标、实现方法、相关代码和注意事项等。这样,在遇到类似的任务时,可以很快地查阅相关信息,缩短解决问题的时间。 此外,Python运维笔记md文档还可以记录一些常用的Python库和工具,比如Fabric、Ansible、Docker等。对于每个库或工具,可以记录其主要功能、安装配置方法、使用示例等。这样,在实际工作中,可以根据需要选择合适的库和工具,提高工作效率。 总之,Python运维笔记md文档是一个记录Python运维工作经验和解决方案的重要工具。通过不断地整理和更新这个文档,可以提高自己的技术水平,也可以为他人提供有价值的参考资料。 ### 回答2: Python运维笔记MD文档是一种记录和整理与Python运维相关资料和经验的文件格式。MD是指Markdown,一种轻量级标记语言,可用于快速编写格式化的文档。 Python运维笔记MD文档通常包含以下内容: 1. 环境搭建:记录如何安装Python解释器、依赖包和开发环境,以及如何配置开发环境和调试工具等。 2. 常用命令和技巧:记录Python运维常用的命令和技巧,包括文件操作、目录管理、进程控制、日志查看等。通过整理这些命令和技巧,可以帮助Python运维人员更加高效地进行工作。 3. 脚本开发:记录Python脚本的开发经验和技巧,包括如何编写高效的代码、处理异常、读写文件、数据库操作、网络编程等。这部分内容可以提供Python运维人员开发工具和脚本的参考和指导。 4. 故障排除和优化:记录Python运维中常见的故障排除和性能优化方法,包括如何定位和解决内存泄漏、死锁、性能瓶颈等问题。这部分内容可以提供Python运维人员在故障处理和性能优化方面的指导和支持。 5. 监控和告警:记录Python运维中常用的监控和告警工具,包括如何配置监控项、设置告警规则、收集指标数据等。这部分内容可以帮助Python运维人员建立可靠的监控和告警系统,及时发现和解决问题。 通过Python运维笔记MD文档的整理和使用,可以帮助Python运维人员更好地管理和维护Python环境和应用程序,提高工作效率和质量。它不仅是个人学习和积累的重要工具,也可以作为团队交流和协作的参考资料,促进知识共享和团队合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大白砌墙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值