1.Docker 是什么?
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux 或 Windows 机器上( 摘自百度 )。

2.Docker 能干什么?
在讲 Docker 能干什么之前,我们不妨先看看没有 Docker 和有Docker分别是个什么样子的?

先来个需求
某公司需要开发一个管理系统,由于业务数据量庞大,需要对每个模块进行独立化。

比如:将订单管理抽出为一个单独的系统,支付管理抽出为一个单独的系统,会员管理也抽为一个单独的系统,以此类推等等。

那么,要实现用户下单支付这个逻辑,那么首先需要调用会员管理的相关接口进行登录,调用订单管理的相关借口进行下单,调用支付管理进行支付。这几个模块共同工作才构成了我们一个下单支付的功能。这就是我们常说的分布式微服务系统

他和传统的单一模式的区别就是:将整个项目进行了模块划分,以前老一辈项目都是将会员,订单,支付等系统都集合在一个项目中,这样十分不利于后期项目的扩展。

有Docker组 VS 无Dokcer组
为了方便叙述,我们将有无使用Docker分为 有Docker组和无Docker组,让他们开始PK。

第 1 回合:比服务器资源占用量( 资源就是金钱,没啥好说的 )
无 Docker 组:购买了3台服务器,将开发好的三套系统分别往一台服务器上进行部署。
有 Docker 组:购买了1台服务器,将开发好的三套系统分别进行 Docker 封装,都部署到这台服务器上。
砖家点评:无Docker组多买了2台服务器,造成了金钱浪费,有Docker组胜出。

第 2 回合:比项目启动速度( 时间就是金钱,也没啥好说的 )
无 Docker 组:启动1个服务前前后后花了10秒,则3个启动完毕则花了30秒。
有 Docker 组:启动1个服务只靠一个命令,花费1秒,那么3个就只需要3秒。
砖家点评:无Docker组花了30秒,有Docker 组只花了3秒,有Docker组再次胜出。

第3个回合:比项目迁移( 服务器升级啊,机房变更啊,反正就是需要换服务器了 )
无Docker组:嗒嗒嗒,又重新在新服务器上安装了一大波软件,然后测试,总算迁移成功了,耗时大半天。
无Docker组:把每个服务的Docker镜像拷贝过去,不用安装任何软件,又一个命令在新服务器上启动成功,耗时2分钟。
砖家点评:这么显而易见的结果,还要我来点评?我太难了!

经过上面几个回合的较量,Docker 的优点相信你或多或少已经知道一些了,我也就不总结了,当然Docker的优点远远不止这些,等你们日后学会了,自己去看相关文档摸索,本文只带萌新入门Docker。

Docker 入门
下面以实际的例子,把我个人网站(http://www.sunnyzyq.cn)改造为 Docker 项目。下面所有操作都是在 Linux 上操作的,请各位同学注意,要是没有Linux, 要么自己花钱买个服务器,要么自己安个虚拟机,

个人建议搞我们这行的,还是有必要买个服务器,1年也就几百块,买来想怎么玩儿就怎么玩儿,主要是能学到技术,多好。

(1)Docker 安装

yum -y install docker

输入语句执行后,就可以看到 Docker 它正在下载了,下面 19% 是下载进度。

当你看到下图的这个Complete,就表示 Docker 已经下载安装好了。

(2) 查看Docker版本
是否真的已经安装好了呢?我们可以通过以下命令查看Docker的版本。

docker version

此时,我们可以看到 Docker 的版本号为 1.13.1,表示真的已经安装上了。

(3) 启动Docker

service docker start

(4) 打包项目到服务器

现在 Docker 已经启动成功了,我们来实战一下,我们先将Eclipse中的项目打成jar包放到Linux上。

(5) 创建Dockerfile

在我们刚刚的项目jar包下同级目录下,创建Dockerfile文件,这个文件是玩转Docker的核心文件哦。

touch Dockerfile

现在这个Dockerfile还是一纸空文,我们需要将我们的项目 jar 包写进去。
编辑Dockerfile文件,内容如下(注意滴3行第一个是你的jar包名):

FROM java:8
VOLUME /tmp
ADD com.sunnyzyq-0.1.jar app.jar
RUN bash -c ‘touch /app.jar’
EXPOSE 80
ENTRYPOINT [“java”,"-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

不想在Linux上打字的可以把文件拿出来编辑,然后放回去。

内容解释:
这里他有个镜像名词,不懂没关系,看完后面就懂了,先记住这个名词就是。

FROM :表示用哪个基础镜像去构建新的镜像,上面的java:8, 也就是jdk1.8。
ADD :表示叠加什么镜像到上面的基础镜像中。我们现在就叠加当前目录下的 com.sunnyzyq-0.1.jar 到基础镜像中。
EXPOSE:表示对外暴露的端口,我使用的是80。
RUN bash -c ‘touch /app.jar’ :使用 shell编程,执行一个 touch 命令,更新文件的访问和修改时间 -c 如果文件不存在,则不要进行创建。具体参考liunx 的 touch 命令和shell编程。
ENTRYPOINT :入口点, 表示容器运行后默认执行的命令。

(6) 拉取基础镜像 java8

docker pull java:8

上面Dockerfile说得很清楚,我们的程序需要一个基础镜像Java8,我这里由于昨天已经下载好了,所以他会提示更新,你们如果没有下载 java8 的镜像,请静等下载。

(7) 构建程序镜像
现在 java8 的基础镜像有了,就可以创建我们的程序镜像了,就是执行刚刚那个Dockerfile文件。

docker build -t xxx .
注意:xxx 为新镜像名字,随便取,别忘了最后有个点。

可以我们程序的镜像已经构建成功了,并生成了一个930858c62738的镜像ID。

(8) 查看镜像

docker images

可以看到刚刚的创建的镜像,以及我们之前下载的jave8镜像(这里还可以看到,由于我刚刚创建的镜像和昨天创建的镜像虽然名字不一样,但其他数据都一样,这说明两个镜像底层都是指的同一个)。

(9) 停止网站项目
为了给大家有个明显的感受,我用自己的网站做实验,这一步你们看下就好,不用做什么。

下面这个是我项目的网址界面,现在还在运行。

现在我要停止他,准备并改为 docker 的方式启动。

可以看到,我的网址已经成功的被停掉了,OK,我们继续下一步,继续走完我们未完成的路。

(10) 创建容器并运行

镜像我们已经有了,但最后能让项目运行起来的是容器。如何理解容器与镜像的关系呢?
镜像可以理解为一个Java类,而容器可以理解为Java类的实例。
类只有一个,但可以new出千千万万个实例对象。
所以,镜像只是一个可以生成容器的东西,而容器才能让程序运行起来。

那么,现在我们就让我们用刚创建的镜像创建一个容器,并让他运行起来。

docker run --name 容器名 -d -p 内部端口:外部端口 镜像名
如: docker run --name sunnyzyq -d -p 80:80 sunnzyq-docker-test

命令解释:

容器名:我这里取的名字为 sunnyzyq
-d: 后台运行容器,并且返回容器完整ID
-p: 是用于指定端口的。
内部端口:项目程序的端口
外部端口:网站域名的端口

(11) 查看运行的容器

docker ps

这样可以看到我们刚运行容器的详细信息。

docker ps -a

这样可以看到所有的docker下的相关容器,其他几个是我昨天创建的容器。

(12) 再次访问网站

再次访问网站,可以看到网站又可以访问了,这次是docker方式启动的。

(13)Docker 仓库
我们的 Docker镜像,还可以上传到Docker仓库 Docker Hub 里,只要注册一个账号密码,就能上传上去。
到时,如果你想要在其他服务器上运行你的项目,只需要从Docker hub里下载下来,重新生成容器,不用安装任何软件就可以运行了,因为需要的相关环境,你都整合到Docker镜像里了。

docker入门实例(转载)的更多相关文章

  1. Docker入门(转载)

    Docker入门 一.Docker 1.什么是容器? 容器就是将软件打包成标准化单元,用于开发.交付和部署.容器是轻量的.可执行的独立软件包 ,包含软件运行所需的所有内容:代码.运行时环境.系统工具. ...

  2. docker入门指南(转载)

    原文: http://bg.biedalian.com/2014/11/20/docker-start.html 关于 docker 今天云平台的同事提到, 现在的运维就是恶性循环, 因为大家都在申请 ...

  3. Dubbo入门实例--转载

    原文地址:http://blog.csdn.net/ruishenh/article/details/23180707?utm_source=tuicool 1.   概述 Dubbo是一个分布式服务 ...

  4. docker入门实例

    Docker 是什么? 我们在理解 Docker 之前,首先得先区分清楚两个概念,容器和虚拟机. 每台虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用. 每一台虚拟机包括应 ...

  5. Docker(一):Docker入门教程

    如今Docker的使用已经非常普遍,特别在一线互联网公司.使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如 ...

  6. React 入门实例教程(转载)

    本人转载自: React 入门实例教程

  7. 转载 SpringMVC详解(三)------基于注解的入门实例

    目录 1.在 web.xml 文件中配置前端处理器 2.在 springmvc.xml 文件中配置处理器映射器,处理器适配器,视图解析器 3.编写 Handler 4.编写 视图 index.jsp ...

  8. 【转载】大白话Docker入门(二)

    原文:https://yq.aliyun.com/articles/63517?spm=a2c4e.11153940.blogcont63035.15.12011c3fddklk0 上篇的大白话Doc ...

  9. 这可能是最为详细的Docker入门吐血总结

    这可能是最为详细的Docker入门吐血总结  https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html Docker是什么? 在计算机技术日新 ...

随机推荐

  1. 前端常见的HTML+CSS面试题(附答案)

    HTML 1. <image>标签上title属性与alt属性的区别是什么? alt属性是为了给那些不能看到你文档中图像的浏览者提供文字说明的.且长度必须少于100个英文字符或者用户必须保 ...

  2. Cobaltstrike安装

    1.下载JDK http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html#jd ...

  3. 【转载】Gradle学习 第九章:Groovy快速入门

    转载地址:http://ask.android-studio.org/?/article/17 To build a Groovy project, you use the Groovy plugin ...

  4. JIRA的安装及配置

    JIRA安装    命令行打开服务:cmd:services.msc 同禅道和tapd是一样功能的. 1.安装jdk 2.安装mysql 3.安装JIRA  JIRA安装密钥的查找 1.登陆管理页面: ...

  5. Go语言学习——三分钟看透iota

    源起枚举 最近做需求时,有一个需要枚举的场景,大概有10+个枚举类型,不愿意像定义一个开关那样敷衍的写成 const ( SwitchOff = 0 SwitchOn = 1 ) 显得不够精致~ 于是 ...

  6. 掌握 Async/Await

    摘要: 还不用Async/Await就OUT了.. 原文:掌握 Async/Await 作者:Jartto Fundebug经授权转载,版权归原作者所有. 前端工程师肯定都经历过 JS 回调链狱的痛苦 ...

  7. Python学习日记(四十一) Mysql数据库篇 九

    前言 索引的主要作用是起到约束和加速查找,ORM框架(sqlalchemy)是用类和对象对数据库进行操作 索引的种类 按种类去分 1.普通索引:能够加速查找 2.主键索引:能够加速查找.不能为空.不能 ...

  8. Golang 需要避免踩的 50 个坑1

    最近准备写一些关于golang的技术博文,本文是之前在GitHub上看到的golang技术译文,感觉很有帮助,先给各位读者分享一下. 前言 Go 是一门简单有趣的编程语言,与其他语言一样,在使用时不免 ...

  9. Shell 编程 文本处理工具 sed

    本篇主要写一些shell脚本文本处理工具sed的使用. 概述 sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除.替换.添加 ...

  10. 【转】Linux内存管理(最透彻的一篇)

    摘要:本章首先以应用程序开发者的角度审视Linux的进程内存管理,在此基础上逐步深入到内核中讨论系统物理内存管理和内核内存的使用方法.力求从外到内.水到渠成地引导网友分析Linux的内存管理与使用.在 ...