导读: 软件开发最大的麻烦事之一就是环境配置,操做系统设置,各类库和组件的安装。只有它们都正确,软件才能运行。若是从一种操做系统里面运行另外一种操做系统,一般咱们采起的策略就是引入虚拟机,好比在 Windows 系统里面运行 Linux 系统。这种方式有个很大的缺点就是资源占用多、冗余步骤多、启动慢。目前最流行的 Linux 容器解决方案之一就是Docker,它最大优势就是轻量、资源占用少、启动快。本文从什么是Docker?Docker解决什么问题?有哪些好处?如何去部署实现去全面介绍。php
设想这样一个真实案例,假如咱们要部署一个Python应用程序,要作哪些工做?python
能够看出,在 Docker 以前软件行业的运维存在着如下这些痛点:mysql
在完成Docker部署安装以前,咱们仍是先认识下Docker的优势:web
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 的接口至关简单,用户能够方便地建立和使用容器,把本身的应用放入容器。容器还能够进行版本管理、复制、分享、修改,就像管理普通的代码同样。算法
通俗解释Dockersql
Docker的思想来自于集装箱,集装箱解决了什么问题?在一艘大船上,把货物规整的摆放起来。而且各类各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。docker就是相似的理念。如今都流行云计算了,云计算就比如大货轮。docker就是集装箱。docker
Docker 的主要用途,目前有三大类。shell
(1)提供一次性的环境。本地测试的软件、持续集成的时候提供单元测试和构建的环境。数据库
(2)提供弹性的云服务。由于 Docker 容器能够随开随关,很适合动态扩容和缩容。
(3)组建微服务架构。一台机器能够跑多个服务,在本机能够模拟出微服务架构。
应用场景
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并进行有效的资源分配能够提升资源的利用率。
Docker在整个开发周期均可以完美的辅助你实现快速交付。Docker容许开发者在装有应用和服务本地容器作开发。能够直接集成到可持续开发流程中。例如:开发者可使用一个标准的镜像来构建一套开发容器,开发完成以后,运维人员能够直接使用这个容器来部署代码。 Docker 能够快速建立容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其余成员更容易理解应用程序是如何建立和工做的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
Docker 容器几乎能够在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、我的电脑、服务器等。 这种兼容性可让用户把一个应用程序从一个平台直接迁移到另一个。
Docker 对系统资源的利用率很高,一台主机上能够同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽可能小。传统虚拟机方式运行 10 个不一样的应用就要起 10 个虚拟机,而Docker 只须要启动 10 个隔离的应用便可。
使用 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 会自动启动。通知栏上会出现个小鲸鱼的图标,这表示 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来设置:
第一步:建立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数据库。
第六步:新受权用户链接测试。
场景描述:咱们使用一个简单的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))
第二步:生成镜像。本文采用的windows环境。docker build -t friendlyhello .命令中最后的点不要忘记,这里表示当前目录
第三步:查看镜像是否生成
第四步:运行镜像程序,这里能够看到分词效果
第一步:载入镜像。通常采用自构建的方法,本文采用直接pull下载完成。docker pull training/webapp
第二步:运行镜像。docker run -d -P training/webapp python app.py # 多个PORTS端口
第三步:浏览器输入本地ip:端口号,访问网页信息
扩展:使用 Docker 和 Elasticsearch 构建一个全文搜索应用程序https://www.zcfy.cc/article/building-a-full-text-search-app-using-docker-and-elasticsearch
【机器学习和天然语言QQ群:436303759】:
机器学习和天然语言(QQ群号:436303759)是一个研究深度学习、机器学习、天然语言处理、数据挖掘、图像处理、目标检测、数据科学等AI相关领域的技术群。其宗旨是纯粹的AI技术圈子、绿色的交流环境。本群禁止有违背法律法规和道德的言行举止。群成员备注格式:城市-自命名。微信订阅号:datathinks