Spring Boot 遇见 Docker-Java 后端项目的容器化部署实践

发布于 更新于
本文目录
  1. 目标
  2. 将基于Spring Boot的【用户】项目部署到Docker,具体效果见下图
  3. IT基础设施简介
  4. Docker简介
  5. Docker主要概念
  6. Docker安装
  7. 基础要求
  8. 安装
  9. Docker常用功能与命令
  10. 网络相关
  11. 镜像相关
  12. Dockerfile
  13. 镜像
  14. 容器
  15. 实践:基于Spring Boo的【用户】项目的Docker部署
  16. 步骤
  17. 基于Docker的多负载部署

技术文章测试开发

IT 基础设施领域及应用环境的发展(图片来自网络)

目标

将基于Spring Boot的【用户】项目部署到Docker,具体效果见下图

image.png

IT基础设施简介

IT 基础设施领域及应用环境的发展(图片来自网络)

image.png

特点

  • 物理机器:

    • 优点:一台硬件服务器,构建的应用程序时使用的是宿主操作系统提供的全部资源

    • 缺点:如果需要扩展,则需要添加一台相对固定硬件服务器;扩展数量增加,成本也会增加,对于一些有高低峰硬件需求并不友好;且每台机器都要配置相应应用运行环境

  • 虚拟机:

    • 优点:不同的应用,不时的时间,需要的硬件资源是不一样的;通过虚拟化来优化IT基础设施的使用;很多云服务就可以按时间段,按资源需求购买虚拟机资源

    • 缺点:虚拟机占用资源还是比较多,哪怕应用很小,虚拟机也要几百M;启动慢;需要登录;

  • 容器化:

    • 优点:基于虚拟机缺点,Linux出现了一个Linux容器(LXC, Linux Containers )技术,面向应用,简单、快速、一次性;Docker是LXC的一种封装

    • 缺点:并不适用所有的应用场景,比如数据库;隔离性和工具也是需要持续增强的

Docker简介

  • Docker

  • 一个开源的应用容器引擎;开发者可以打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上;使用使用沙箱机制,容器性能开销极低;

  • 优点:

    • 提供一次性环境,简化配置、快速搭建一致应用环境,且能快速部署

    • 提供弹性云服务,Docker容器可随时创建,动态扩容和缩容

    • 便于组建微服务架构应用,通过多个容器,一台机器可跑更多工作负载

  • 缺点:

    • 在实际的业务中,当容器数量多了后,是存在困难的:编排、管理和调度等各个方面,都不容易。就需要一套管理系统,对Docker及容器进行更高级更灵活的管理

    • image.png

  • Kubernetes

    • 用于自动部署,扩展和管理容器化应用程序的开源系统;将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现

    • image.png

  • Rancher

    • 一个开源的企业级容器管理平台;Rancher提供了在生产环境中使用的管理Docker和Kubernetes的容器部署与管理平台

    • image.png

Docker主要概念

  • 仓库(Registry)

    • 类似于Git仓库,但是用于存放镜像的,也分本地镜像仓库和公共镜像仓库,官方的公共镜像仓库是hub.docker.com,阿里、腾讯、网易等也提供有公有仓库

    • 开源仓库工具是Harbor

    • 可通过pull/push命令将公共仓库镜像拉取到本地或将本地仓库镜像推送到公共仓库

  • 镜像(Image)

    • 容器的模板,里面包装了依赖、配置、环境、自身源代码

    • 可以直接使用第三方的镜像,如MySQL、Redis等

    • 也可以自己生成镜像,并依赖一些基础第三方镜像提供环境支持,如oraclejre8 、 Nginx ,像我们要部署的前端项目、后端项目

  • 容器(Container)

    • 镜像的一次具体的运行,就产生了一个容器

    • 容器根据镜像的依赖、配置提供服务

镜像与容器的关系,就相当于类与对象的关系,镜像定义的规范,容器是镜像的实例化,一个镜像可以实例化多个容器

Docker安装

基础要求

一台Linux服务器,最好是CentOS主机

在CentOS主机上安装Docker,具体见附件《VMWare安装CentOS7虚拟主机.docx》

安装

在CentOS主机上安装Docker,具体见附件《CentOS7安装Docker.docx》

Docker常用功能与命令

  • 网络相关

    • 主要处理网络管理,如创建、删除等操作

    • 见附件《Docker常用命令.txt》的网络相关

  • 镜像相关

  • 主要处理镜像管理,如创建、摘取、推送等操作

    • 见附件《 Docker常用命令.txt 》的镜像相关

  • 容器相关

    • 主要处理容器管理,如运行、查看等操作

    • 见附件《 Docker常用命令.txt 》的容器相关

作为基于Docker容器化的基础,熟悉并掌握这些命令很重要

网络相关

  • Docker默认使用桥接方式(Bridge),在宿主机虚拟一个Docker容器网桥(docker0,通过ip addr查看)

  • Docker每启动一个容器,都会根据容器网桥的网段,分配一个IP地址,称为容器IP

  • 容器网桥地址,也就默认是网 关地址,负责启动容器的数据转发

  • 上述的这些处理模式,就构造了一个Docker容器的完整内部网络,但不可被宿主机外部访问

Docker中的所有的网络模式如下图

常用命令:具体见附件《Docker常用命令.txt》

镜像相关

Dockerfile

  • 一个用来构建镜像的文本文件,文本内容包含了构建镜像所需的指令和说明

  • 主要包含以下常用指令

    • FROM,指定基础镜像,位置必须是最前

    • MAINTAINER,维护者信息

    • VOLUME,指定持久化挂载目录,要求镜像程序的所有数据必须写入到该文件;在使用镜像生成容器里,会在宿主机指定相应目录将容器的该目录下的数据落地到宿主机,保证一般情况下容器的无状态性

    • WORKDIR,指定工作目录,类似于cd命令

    • RUN,构建镜像时执行的命令,可多个并生效,比如基础依赖上要安装一些工具,供运行代码使用

    • CMD,为新容器生成时的命令,会在容器启动时执行,多个时只有最后一个生效,一般有ENTRYPOINT时不会添加CMD

    • ADD,将本地文件添加到容器中

    • COPY,拷贝文件

    • ENTRYPOINT,为容器启动时指定默认执行,一般为容器启动时启用命令

    • EXPOSE,指定与外界交互端口

一张网络图片形象表达了这些常用指令特点

image.png

实例:查看示例项目《用户》后端的Dockerfile

镜像

  • 作为容器模板,如果是自定义的镜像,需要在运行前打包好,普通项目通过添加一个Dockerfile,并使用docker build命令就可打包镜像到本地镜像仓库

  • 一些常用的、知名的第三方镜像都在一些公共镜像仓库中存在,可直接通过docker pull命令拉取镜像构建自己的服务,如MySQL、Redis等;默认是从该hub.docker.com公有镜像仓库中拉取

  • 自定义镜像,使用docker build命令打包镜像,并且可以将其推送到远端镜像仓库,如企业内部Harbor

  • 远程镜像仓库的作用,主要是在Docker的集群部署时,各个Docker引擎用于共享镜像

命令:具体见附件《Docker常用命令.txt》的镜像相关

容器

  • 对于第三方镜像,或自定义镜像构建成功后,并在本地镜像仓库存在后,可直接使用docker run命令运行成容器,对外提供服务

  • docker run命令具有一系列参数,可指定运行网络、挂载目录、映射宿主端口、指定容器名称等

  • 容器正常运行后,Docker还提供了一系列的命令技术容器的,比如停止容器、启动容器、查看容器详情、查看容器资源使用情况、查看容器日志、进入容器等

命令:具体见附件《Docker常用命令.txt》的容器相关

实践:基于Spring Boo的【用户】项目的Docker部署

步骤

  1. 创建网络,创建172.19.0.0/16网段的内部网络

  2. 构建镜像,将【用户】项目的.jar包文件和Dockfile上传到服务器规划目录,使用命令构建镜像,命令是:docker build -t sanbao/demo .

  3. 创建容器,镜像存在后,使用命令创建容器实例,将端口映射到宿主机的8888端口,命令是:docker run -p 8888:80 --net demo-network --name demo-1 -d --restart=always sanbao/demo

  4. 访问服务,镜像成功运行后,可通过http://宿主机ip:8888/swagger-ui.html访问后端服务的Swagger文档页面

源文件和命令:具体见附件《demo.zip》、《demo项目的Docker命令.txt》

基于Docker的多负载部署

  • 下图是通过在不同的引擎中部署项目的前端、后端

  • 然后通过Nginx分别实现前端、后端的多负载的负载均衡,来保证服务的高可用

  • 在实际企业项目中,会通过前面介绍的k8s、Rancher等工具,对底层的Docker集群进行更方便的管理,如动态扩容/缩容、流水线等

  • image.png

附件.zip

来源:testingpai

继续阅读