笔记14:Docker 部署Python项目

Docker 部署Python项目

导读: 软件开发最大的麻烦事之一就是环境配置,操做系统设置,各类库和组件的安装。只有它们都正确,软件才能运行。若是从一种操做系统里面运行另外一种操做系统,一般咱们采起的策略就是引入虚拟机,好比在 Windows 系统里面运行 Linux 系统。这种方式有个很大的缺点就是资源占用多、冗余步骤多、启动慢。目前最流行的 Linux 容器解决方案之一就是Docker,它最大优势就是轻量、资源占用少、启动快。本文从什么是Docker?Docker解决什么问题?有哪些好处?如何去部署实现去全面介绍。php

0 引言

设想这样一个真实案例,假如咱们要部署一个Python应用程序,要作哪些工做?python

  • 首先须要python运行环境,好比部署的是python3,而机器上是python2。先装个python3,还要装各类依赖包,机器一些可能的冲突。
  • 装完python以后,发现还要装mysql或者redis。继续下载安装配置。
  • 啥?服务器不用了,须要换一台服务器?那从新来一遍吧。
  • 啥?基础应用作的太好要进行推广,须要指导其余厂商部署?这怎么办?

能够看出,在 Docker 以前软件行业的运维存在着如下这些痛点:mysql

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

在完成Docker部署安装以前,咱们仍是先认识下Docker的优势:web

  • 软件构建容易,分发简单
  • 应用获得隔离,依赖被解除
  • 能够完美地用于 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 提取码: mqf6redis

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。有了 Docker,就不用担忧环境问题。整体来讲,Docker 的接口至关简单,用户能够方便地建立和使用容器,把本身的应用放入容器。容器还能够进行版本管理、复制、分享、修改,就像管理普通的代码同样。算法

容器与虚拟机 (VM) æ€"ç"“

通俗解释Dockersql

Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,把货物规整的摆放起来。而且各类各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。docker就是相似的理念。如今都流行云计算了,云计算就比如大货轮。docker就是集装箱。docker

  • 不一样的应用程序可能会有不一样的应用环境,好比.net开发的网站和php开发的网站依赖的软件就不同,若是把他们依赖的软件都安装在一个服务器上就要调试好久,并且很麻烦,还会形成一些冲突。这个时候你就要隔离.net开发的网站和php开发的网站。常规来说,咱们能够在服务器上建立不一样的虚拟机在不一样的虚拟机上放置不一样的应用,可是虚拟机开销比较高。docker能够实现虚拟机隔离应用环境的功能,而且开销比虚拟机小,小就意味着省钱了。
  • 开发软件的时候用的是Ubuntu,可是运维管理的都是centos,运维在把你的软件从开发环境转移到生产环境的时候就会遇到一些Ubuntu转centos的问题,好比:有个特殊版本的数据库,只有Ubuntu支持,centos不支持,在转移的过程中运维就得想办法解决这样的问题。这时候要是有docker你就能够把开发环境直接封装转移给运维,运维直接部署你给他的docker就能够了。并且部署速度快。
  • 在服务器负载方面,若是你单独开一个虚拟机,那么虚拟机会占用空闲内存的,docker部署的话,这些内存就会利用起来。总之docker就是集装箱原理。

2 Docker用途

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

(1)提供一次性的环境。本地测试的软件、持续集成的时候提供单元测试和构建的环境。数据库

(2)提供弹性的云服务。由于 Docker 容器能够随开随关,很适合动态扩容和缩容。

(3)组建微服务架构。一台机器能够跑多个服务,在本机能够模拟出微服务架构。

应用场景

  • 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的三个概念

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

5 Docker的使用

5.1 Win10下安装Docker

第一步:启动虚拟环境

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

img

第二步:安装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. 虚拟机

img

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

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

1558428612726

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

1558428753024

第三步:镜像加速

鉴于国内网络问题,后续拉取 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来设置:

1558428818106

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的镜像。

1558433823656

  • 使用命令 docker pull 来下载镜像。

1558434858151

  • 命令 docker build , 从零开始来建立一个新的镜像
  • 容器链接:指定容器绑定的网络地址,好比绑定 127.0.0.1。

1558435685434

6 Docker的实例

6.1 Docker 安装 MySQL

第一步:建立MySQL镜像:docker pull mysql

查找Docker Hub上的mysql镜像: docker search mysql

1558436137076

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

1558436518291

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

1558436587885

第四步:使用最新的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'@'%';

1558443620990

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

1558443896087

第六步:新受权用户链接测试。

1558443939117

6.2 Docker 安装 Python项目

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

第一步: Win10下建立目录文本

选择在D盘下建立docker目录,分别新建三个文件:Dockerfile,app.py,equirements.txt

1558509365927

  • 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

1558509869193

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

1558506791595

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

1558506791595

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

1558506791595

6.3 Docker 安装 Django项目

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

1558506791595

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

1558506791595

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

1558506791595

扩展:使用 Docker 和 Elasticsearch 构建一个全文搜索应用程序https://www.zcfy.cc/article/building-a-full-text-search-app-using-docker-and-elasticsearch

7 技术交流共享QQ群

机器学习和天然语言QQ群:436303759】:

机器学习和天然语言(QQ群号:436303759)是一个研究深度学习、机器学习、天然语言处理、数据挖掘、图像处理、目标检测、数据科学等AI相关领域的技术群。其宗旨是纯粹的AI技术圈子、绿色的交流环境。本群禁止有违背法律法规和道德的言行举止。群成员备注格式:城市-自命名。微信订阅号:datathinks

相关文章
相关标签/搜索