使用Docker容器部署SpringBoot项目

2018-12-26

Docker简介

Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初发起者是dotClouw公司。Docker 自开源后受到广泛的关注和讨论,目前已有多个相关项目,逐断形成了围Docker的生态体系。dotCloud 公司后来也改名为Docker Ine。

Docker是一个开源的容器引擎,它有助于更快地交付应用。 Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。

官网地址:(https://docs.docker.com/) 中文:(http://www.docker.org.cn/)

Docker架构

image

Docker daemon:运行在宿主机(DOCKER-HOST)的后台进程,可通过 Docker 客户端与之通信。

Images:一个只读的镜像模板,可以自己创建一个镜像也可以从网站上下载镜像供自己使用,镜像包含了一个RFS,一个镜像可以创建很多容器。

Container:由Docker Client通过镜像创建的实例,用户在容器中运行应用,一旦创建后就可以看做是一个简单的RFS,每个应用运行在隔离的容器中,享用独自的权限,用户,网络。确保安全与互相干扰 两者在创建后,都是一堆layer的统一视角,唯一的却别是镜像最上面那一层是只读的,不可以修改,但是容器最上面一层是rw的,提供给用户操作。

Repository:镜像仓库。

Docker VS 传统虚拟机

Docker作为一种轻量级的虚拟化方式,Docker在运行应用上跟传统的虚拟机方式相比具有显著优势: 

  • Docker容器很快,启动和停止可以在秒级实现,这相比传统的虚拟机方式要快得多。
  • Docker容器对系统资源需求很少,一台主机上可以同时运行数千个Docker容器。
  • Docker通过类似Git的操作来方便用户获取、分发和更新应用镜像,指令简明,学习成本较低。
  • Docker通过Dockerfile配置文件来支持灵活的自动化创建和部署机制,提高工作效率。 | 特征 | Docker | 虚拟机 | | :—: | :—: | :—: | | 启动速度 | 秒级 | 分钟级 | | 硬盘占用 | 一般为MB级 | 一般为GB级 | | 性能 | 接近原生 | 低于原生 | | 支持量 | 单机支持上千个容器 | 一般几十个 | | 隔离性 | 完全隔离 | 完全隔离 |

Docker环境安装

Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)

Docker要求Linux内核版本在3.10以上,本文中使用的是CentOS 7.x进行安装。

检查内核版本

uname -r
3.10.0-957.1.3.el7.x86_64

更新yum包

确保使用ROOT权限进行操作,否则可能导致不可预知问题。

yum -y update

卸载旧版本

若未安装过,忽略该步骤

yum remove docker docker-common docker-selinux docker-engine

安装依赖包

yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

yum install -y yum-utils device-mapper-persistent-data lvm2

设置yum源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

查看yum源中可供安装的版本

yum list docker-ce --showduplicates | sort -r

安装Docker

不指定版本,默认安装最新的stable版

sudo yum install -y docker-ce

启动 & 加入开机启动

systemctl start docker
systemctl enable docker

验证Version

docker version

image

出现如上图提示,则表示Docker安装成功。

Docker镜像相关命令

搜索镜像

docker search java

搜索存放在Docker Hub中的镜像。

Docker Hub 官网: https://hub.docker.com/search?q=java&type=image

下载镜像

docker pull java:8

执行该命令后,Docker会从Docker Hub中的java仓库下载指定版本的Java镜像。

查看已安装镜像

docker images

image

删除镜像

使用IMAGE ID进行删除,参考上一个命令

docker rmi d23bdf5b1b1b

附:阿里云镜像加速服务

https://cr.console.aliyun.com/cn-hangzhou/mirrors

Docker容器相关命令

启动容器

docker run -d -p 81:80 nginx

-d 后台运行

-p 宿主机端口:容器端口 #开放容器端口到宿主机端口

需要注意的是,使用docker run命令启动容器时,若本地没有相关镜像,Docker会从Docker Hub中自动下载相关镜像并启动

image

访问 http://Docker宿主机IP:81/,将会看到Nginx的主界面:

image

查看运行中的容器

docker ps

查看指定容器详细信息

docker inspect b3e76480a94c

image

构建自定义Docker镜像

为方便演示,这里创建一个简单的SpringBoot项目(docker-springboot-example)

package com.wuwenze.dockerspringbootexample;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;


@RestController
@SpringBootApplication
public class DockerSpringbootExampleApplication {

    public static void main(String[] args) {
        SpringApplication.run(DockerSpringbootExampleApplication.class, args);
    }

    @GetMapping("/sayHello")
    public @ResponseBody ResponseEntity<?> sayHello() {
        return ResponseEntity.ok("Hello Docker & SpringBoot");
    }
}

打包插件配置

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <mainClass>com.wuwenze.dockerspringbootexample.DockerSpringbootExampleApplication</mainClass>
    </configuration>
    <executions>
        <execution>
            <goals>
                <goal>repackage</goal>
            </goals>
        </execution>
    </executions>
</plugin>

创建Dockerfile

文件暂时存放在Springboot项目的 src/main/resources 中,后面会用到。

### 指定基础镜像
FROM java:8

### 复制文件到容器
ADD docker-springboot-example-0.0.1-SNAPSHOT.jar /docker-springboot-example.jar

EXPOSE 8080

### 配置容器启动后执行的命令
ENTRYPOINT ["java","-jar","/docker-springboot-example.jar"]

打包jar并上传到Linux服务器中

mvn clean package

image

mkdir /usr/local/docker-app
cd /usr/local/docker-app
rz docker-springboot-example-0.0.1-SNAPSHOT.jar # 上传jar文件
rz Dockerfile # 上传Dockerfile文件

构建镜像

docker build -t docker-springboot-example .
# 语法: docker build -t 镜像名[:标签] Dockerfile所在位置

image

启动镜像

docker run -p 8080:8080 docker-springboot-example

这里没有加-d参数,直接前台启动了,可以看到实时打印的控制台信息