二、为何使用docker?之docker安装和使用

首先,要使用docker嘛,docker是人家的东西,因此咱们确定要对他进行下载安装啦。
在liunx上安装Docker,要求操做系统是64位操做系统。而且内核版本须要3.10以上,若是是CentOS,则使用CentOS 7.0可符合要求。我使用的是ubuntu系统,因此这里也使用ubuntu来说解。java

1、Docker 安装

一、查看系统内核

1)、查看系统内核web

sudo cat /proc/version

这里写图片描述
能够看到我系统使用的是4.15.0-20-generic的内核,因此在这个系统上是能够安装docker的。spring

二、安装docker

这里安装我介绍2种安装方式。一种是ubuntu维护的版本,另一种是docker维护的版本。docker

  • 安装Ubuntu维护的版本,很简单直接一个命令搞定。so easy!!
sudo apt-get install docker.io
  • 安装docker维护的版本
#先安装curl,若是你已经安装过能够略过
sudo apt-get install -y curl
#经过curl安装docker维护的版本
curl -sSL https://get.docker.com/ | sudo sh

嗯,妥妥的又是2个命令搞定。shell

安装完成后,可使用下列命令启动docker:编程

sudo service docker start

这里写图片描述

liunx没有反应就是最好的反应,说明可爱强大的docker已经启动起来了。ubuntu

使用下来指令查看docker的版本信息:api

sudo docker -v

这里写图片描述

咳咳,个人版本看来还挺新的,能够看到是 17.12.1-ce。ruby

好了!一切就绪了,那如今该干什么呢?废话,固然实操一把,把咱们的应用在上面跑起来啦。bash

2、Docker 使用运行java项目

按照咱们上一篇说到的,docker有三件套(仓库、镜像、容器),这里咱们要把三件套所有用上,而后目标就是把咱们的java项目在上面跑起来。不记得三件套的同窗,回忆一下【docker简介】,从新认识下三件套的工做流程和关系。这里就再也不介绍了。 let’s go !

一、编写好咱们的java项目。项目我就简单的用Spring boot 构建一个web。

项目结构很简单,就是项目一个简单的Controller,配置访问端口为8080.
代码清单以下:

UserController:

package com.example.web.biz;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping(value = "/api/user")
public class UserController {
@RequestMapping("/say")
public String say() {
return "Say Hello Docker";
}
}

Spring boot 的启动入口:

package com.example.web;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/** * @author lyl */
@SpringBootApplication
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}

application.properties配置端口:

server.port=8080

文件结构以下:
这里写图片描述
好了,代码搞好。如今通maven打包放到ubuntu上开始发布。

二、使用Dockerfile构建文件构建镜像

这文件的做用上一篇已经说起它是提供咱们构建本身镜像的一种方式(后面是详细讲解,如今只须要知道他会构建镜像用就行)。Dockerfile文件放在和jar包同级目录下。

文件结构以下:
这里写图片描述

Dockerfile里面内容以下:

FROM java:8
VOLUME /tmp
ADD web-1.0.1.jar app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

其中

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

其余命令后面在细说。先懂得怎么跑起来再学后面的。

三、拉取基础镜像(基础层)

上面咱们写的Dockerfile使用的基础层是使用java:8,因此咱们如今要先在远程仓库把这个基础镜像拉取(下载)到本地。
命令以下:

sudo docker pull java:8

而后经过 下面的命令查看本地仓库。能够查看到从远程仓库拉取下来的镜像:

sudo docker images

这里写图片描述

看到了,上面已经有了咱们须要的基础层镜像了。而后咱们就要开始构建咱们本身的镜像了。

如今,执行咱们写好的构建文件,就可以帮咱们在镜像镜像上叠加一层咱们本身的程序,生成新镜像。

四、执行构建文件

去到咱们刚才存放Dockerfile文件的目录下,执行 docker build -t <镜像名>

sudo docker build -t web .

其中 “.”表示使用当前目录的Dockerfile脚本文件。

执行上面命令输出结果以下:

Sending build context to Docker daemon  17.57MB
Step 1/6 : FROM java:8
---> d23bdf5b1b1b Step 2/6 : VOLUME /tmp
---> Running in 062284bd21bb Removing intermediate container 062284bd21bb
---> d7a577c112b0 Step 3/6 : ADD web-1.0.1.jar app.jar
---> 8689f9774441 Step 4/6 : RUN bash -c 'touch /app.jar'
---> Running in 0f3fb99acf53 Removing intermediate container 0f3fb99acf53
---> e908efd5e478 Step 5/6 : EXPOSE 8080
---> Running in 6aded09eacd2 Removing intermediate container 6aded09eacd2
---> a5bf51727060 Step 6/6 : ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
---> Running in 84ca26f544e9 Removing intermediate container 84ca26f544e9
---> e5b7d13c6747 Successfully built e5b7d13c6747
Successfully tagged web:latest

能够看到生成新镜像的步骤,最后输出的进行ID是:e5b7d13c6747, 镜像名称是web,版本是:latest。由于我没指定版本,默认就会用latest。

好了,再次使用 sudo docker images 查询看如今咱们本地拥有的镜像文件。
这里写图片描述

很好,看到了成功了。镜像名,ID,版本号,都如咱们所愿。这样咱们就把咱们的jar包叠加到镜像里面去了。接下来就跑一下看呗,是驴是马拿出来溜溜才知道,是吧?

五、运行咱们的镜像

执行下面的运行镜像的命令:

sudo docker run --name web -d -p 8080:8080 web

命令的格式讲解:sudo docker run –name 容器名 -d -p 内部端口:外部端口 镜像名 <版本>
容器名:就是docker三件套之一的容器名字,运行的时候咱们得给他起个名字是吧,这样咱们在更好吧记住他,咱们这里容器名就和镜像名取同样的名字了,都叫web。
-d: 后台运行容器,而且返回容器完整ID
-p: 是用于指定端口的。
镜像名: 这个就不用再说了吧,就是你本身刚才构建的东西。

执行结果以下,返回了完整的容器ID
这里写图片描述

而后在经过下面命令,查询正在运行的容器:

sudo docker ps

这里写图片描述

看到了吧,咱们的web镜像跑起来了。

下面,咱们就访问一下啊吧。访问前我先查询一下个人ip是什么先。若是你知道你ip,就不须要查看啦,由于我系统没设置固定ip,DHCP随机给我分配了一个。

这里写图片描述
因此我访问的地址是:http://192.168.234.136:8080/api/user/say
这里写图片描述

结果妥妥的出来了。

若是你要查看咱们的应用放在哪里,能够经过下面命令进入容器内部:

sudo docker exec -it <容器ID> /bin/bash

这样我就从宿主机进入了容器内部,咱们再使用“ls”能够看到咱们的app.jar就放在里面了。能够看到容器内部也是一个root文件系统,和咱们熟悉的liunx结构同样。操做命令也基本相同。

这里写图片描述

若是咱们想退出容器回到宿主机,那么可使用快捷键:Ctrl + P + Q 退出容器,但不中止。

若是要中止容器,回到宿主机后直接下面的命令:

sudo docker stop <容器ID>

这里写图片描述

小知识补充:

如何未来容器里面的java项目的日志,输出到容器的指定位置以文件形式保存起来呢呢。首先咱们经过docker exec -it <容器ID> /bin/bash进入下容器的内部时。文件系统结构是这样子的,以下图:
这里写图片描述

默认路径就是上面的路径,若是咱们要把日志输出到/home/web/logs里面,那么咱们就得在java工程logback.xml里面配置好指定路径。以下:

这里写图片描述

好了,容器的安装和使用就讲到这里了。若是你团队须要用到这个跑这个服务你就能够把镜像提交到私有的镜像仓库中,你团队的大佬们pull下来,就能够在任何安装有docker的机器上运行了。

大深夜写博客,以为讲得明白了。点赞呗。嗯嗯,你能够理解为专业骗赞。哈!!