Docker 零基础从入门到使用

诺!这只可爱的小鲸鱼就是docker了!
#java

Docker 是什么?

Docker 是一个引擎
Docker 是一个应用容器引擎
Docker 是一个开源的应用容器引擎
他能够将开发的应用生成镜像,而后发布到任何系统上运行。web

Docker 能干什么?

在讲 Docker 能干什么以前,咱们不妨先看看没有 Docker 和有Docker分别是个什么样子的?docker

先来个需求

某公司须要开发一个管理系统,因为业务数据量庞大,须要对每一个模块进行独立化。shell

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

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

在这里插入图片描述

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

有Docker组 VS 无Dokcer组

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

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

  • 第 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镜像里了。

结尾语

很是感谢这位兄弟的博客帮助:http://www.javashuo.com/article/p-qjsmyxum-bb.html 好了!Docker的相关介绍和初步使用就到这里了! 祝各位本身私下继续深刻学习,之后都是Docker大神!