docker系列 利用docker部署springboot服务


前言

文章目的,使用docker在linux部署springboot服务,并快速整合redis、mysql两个中间件。也许我们会用到很多别的中间件,不过会了这里面涉及到的,别的也大同小异。

关于docker的说明

在正式说docker之前,有必要先来了解下docker是什么。下面的内容都摘抄自docker的官方中文网站 docker官方网站。有兴趣可以读一下。

简介:Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足
的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)
、bare metal、OpenStack 集群和其他的基础应用平台。
Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。
开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 
bare metal、OpenStack 集群和其他的基础应用平台。 

Docker通常用于如下场景:
web应用的自动化打包和发布;
自动化测试和持续集成、发布;
在服务型环境中部署和调整数据库或其他的后台应用;
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

docker能做什么

docker是非常强大的一个引擎。主要的目的就是随时为应用创建相应的容器。对于我们java工程师来说,关心的就比较具体,如今业界最流行的是微服务,那么站在我们的角度上docker能为我们做什么呢?

  假设你现在写了一个springboot的服务,要发布到测试环境,最终还要到生产环境,那么起码你需
要将它放到linux服务器上,之后让外界可以访问到。这个动作就会引发一系列的问题。比方说,你
的微服务用到了很多的中间组件,例如mysql、redis、rabbitmq...难以避免的要在服务器上进行
安装,这个过程将会让你非常头疼。
  还有,将来服务版本升级,服务扩展内容,你都需要一遍遍的手动进行部署,如果都要自己一点点去
做,估计就是专业的运维也会爆炸。
docker可以帮你解决上面提到的所有问题,还有许多其他的优势,下面咱们就一起来看。

docker核心概念说明

(1) Docker服务器与客户端
Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。
在这里插入图片描述
(2) Docker镜像与容器

镜像与容器的关系类似于类和对象之间的关系, 一个类可以创建多个对象, 所以也可以基于一个镜像启动多个容器

镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:

添加一个文件;

执行一个命令;

打开一个窗口。

也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。

​ Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。 容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。

所以Docker容器就是:

​ 一个镜像格式;

​ 一些列标准操作;

​ 一个执行环境。

​ Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件。

和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去。

Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用。

(3) Registry

​ Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。
docker概念总结
docker中最核心的概念我觉得有两个,镜像和容器。镜像和容器的关系类似于java中类和对象的关系,类是对象的模板,对象是类的实例。正如对ava来说,万物皆为对象;对于docker来说,一切也皆是容器。
当然,如果你从没接触过docker的话,你肯定还是一头雾水,没关系,接着往下走。

docker常用命令总结

docker让人喜欢的一点就在于你只需要掌握几个它的常用命令便能使用它,docker的常用命令也分几个部分给大家进行说明
docker安装
(1)yum 包更新到最新

sudo yum update

(2)安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

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

(3)设置yum源为阿里云

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(4)安装docker

sudo yum install docker-ce

(5)安装后查看docker版本

docker -v

docker设置下载镜像的加速器
使用docker部署或者编排应用的前提就是我们得操纵很多的镜像,那么镜像的下载速度就很重要,可以使用ustc,它自带的镜像加速器很快。你也可以选择别的镜像,不过这一步必须做,否则真的下载速度慢的要命。
第一步,编辑docker保存镜像下载源的文件

 vi /etc/docker/daemon.json  

第二步,在该文件中输入以下内容

   {
       "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
   }

docker的启动、重启、停止命令
systemctl命令是系统服务管理器指令
以下几个命令中前三个最重要,剩余了解一下即可

启动docker:

systemctl start docker

停止docker:

systemctl stop docker

重启docker:

systemctl restart docker

查看docker状态:

systemctl status docker

开机启动:

systemctl enable docker

查看docker概要信息

docker info

查看docker帮助文档

docker --help

docker镜像相关命令
1、查看已经下载的镜像

    docker images

在这里插入图片描述

           
REPOSITORY:镜像名称

TAG:镜像标签

IMAGE ID:镜像ID

CREATED:镜像的创建日期(不是获取该镜像的日期)

SIZE:镜像大小

这些镜像都是存储在Docker宿主机的/var/lib/docker目录下

2、搜索镜像

  如果你需要从网络中查找需要的镜像,可以通过以下命令搜索
  docker search 镜像名称

在这里插入图片描述

NAME:仓库名称

DESCRIPTION:镜像描述

STARS:用户评价,反应一个镜像的受欢迎程度

OFFICIAL:是否官方

AUTOMATED:自动构建,表示该镜像由Docker Hub自动构建流程创建的

3、拉取镜像

拉取镜像就是从中央仓库中下载镜像到本地
docker pull 镜像名称
例如,我要下载centos7镜像
docker pull centos:7

4、删除镜像

按镜像ID删除镜像
docker rmi 镜像ID
删除所有镜像
docker rmi `docker images -q` 慎用这条命令,此处的`docker images -q`相当于拿到所有的镜像,
然后执行rmi, 也就是说`docker images -q`的结果被当作docker rmi的实际参数

容器相关命令
容器涉及命令较多,比较重要的像创建守护式容器以及细节的东西一会结合项目说
在这里插入图片描述

1、 查看容器

查看正在运行的容器  docker ps

查看所有容器docker ps –a

查看最后一次运行的容器 docker ps –l

查看停止的容器 docker ps -f status=exited    

2、 创建与启动容器

创建容器常用的参数说明:

创建容器命令:docker run

-i:表示运行容器

-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。

--name :为创建的容器命名。

-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。

-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。

-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射

(1)交互式方式创建容器

 docker run -it --name=容器名称 镜像名称:标签 /bin/bash
 这时我们通过ps命令查看,发现可以看到启动的容器,状态为启动状态
 退出当前容器 : exit

(2)守护式方式创建容器:

docker run -di --name=容器名称 镜像名称:标签
登录守护式容器方式:docker exec -it 容器名称 (或者容器ID)  /bin/bash

3、 停止与启动容器

停止容器:
docker stop 容器名称(或者容器ID)
启动容器:
docker start 容器名称(或者容器ID)

注意
下面的内容除了删除镜像命令,即docker rm 容器id/容器name之外。剩余命令了解即可

4、文件拷贝
如果我们需要将文件拷贝到容器内可以使用cp命令

docker cp 需要拷贝的文件或目录 容器名称:容器目录
也可以将文件从容器内拷贝出来

docker cp 容器名称:容器目录 需要拷贝的文件或目录
5、目录挂载
我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。 创建容器 添加-v参数 后边为 宿主机目录:容器目录,例如:

docker run -di -v /usr/local/myhtml:/usr/local/myhtml --name=mycentos3 centos:7
如果你共享的是多级的目录,可能会出现权限不足的提示。

这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 --privileged=true 来解决挂载的目录没有权限的问题

6、查看容器IP地址
我们可以通过以下命令查看容器运行的各种数据

docker inspect 容器名称(容器ID) 
也可以直接执行下面的命令直接输出IP地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
7、删除容器
删除指定的容器:

docker rm 容器名称(容器ID)
补充:

批量删除容器:

docker rm $(docker ps -a -q)
-q 清理命令

-f 强制

停止所有容器:

docker stop $(docker ps -a -q)
强制删除所有image:

docker rmi -f $(docker images -q)
清除tag为<none>的image:

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
或者 docker image prune -f

准备一个待部署的springboot项目

看一眼项目结构
在这里插入图片描述application.yml配置文件
在这里插入图片描述
我准备了三个接口,以便一会部署上去测试成功与否
在这里插入图片描述在这里插入图片描述
查询数据库接口对应的表
在这里插入图片描述
项目以及需要的sql语句我都会放在gitee上,文章末尾会提到,需要的看官就去取一下,编码都是硬编码,稍微看一下也就明白了,特别简单的。

打包项目上传linux、编写Dockerfile文件、构建镜像

一.打包项目,这个我就直接用IDEA做了,你只需要执行maven的clean和package就能在target下面找到你项目生成的jar了
在这里插入图片描述
二.编写Dockerfile文件
在docker中,一切皆为容器,我们待部署的项目也不例外,既然我们的项目也是一个容器,自然得先构筑它的镜像,docker告诉我们,构筑一个镜像就需要编写Dockerfile。下面咱们来看一下咱们自己的项目的Dockerfile长啥样。

# 基于java镜像创建新镜像
FROM java:8
# 作者
MAINTAINER wuwensheng
#开放8890端口
EXPOSE 8890
#规定时区等环境
ENV TZ=Asia/Shanghai
RUN ln -sf /usr/share/zoneinfo/{TZ} /etc/localtime &&echo "{TZ}" > /etc/timezone
# 将jar包添加到容器中并更名为app.jar
ADD  docker-demonstration-project-1.0-SNAPSHOT.jar /app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
ENTRYPOINT  ["java","-jar","/app.jar"]

三.构筑项目镜像
现在把Dockerfile和jar包放在linux服务器的某个目录下,然后cd 到这个目录
在这里插入图片描述
利用docker build -t xxx .命令构筑镜像(最后这个小 . 别忘记了,它代表着当前目录)
在这里插入图片描述
构筑成功,咱们的镜像名称为docker_pro_first

启动项目

项目依靠于MySQL和Redis容器,咱们先来搞定这两个容器
在这里插入图片描述
原来有启动着的mysql和redis,利用docker ps 以及docker stop 、docker rm命令将他们全部干掉,以免影响咱们
在这里插入图片描述
为了保险,lsof -i:端口号。确保这些端口未被占用

启动mysql容器
在这里插入图片描述
在这里插入图片描述
下面咱们详细讲下创建守护式mysql容器以及登录它的两条指令
创建指令

docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root 697daaecf703

-id指的是创建守护式容器,相应的 -it指的就是创建交互式容器。-p指明容器端口和宿主机端口
的映射关系,前者是宿主机端口,后者是容器内的映射端口。-e MYSQL_ROOT_PASSWORD=root
声明mysql容器的`root`用户的密码为root.最后697daaecf703是咱们的mysql镜像的唯一id。

登录指令

docker exec -it 43898bff25b8 /bin/bash
登录指令格式固定:docker exec -it 容器id/容器名称 /bin/bash

windows连接mysql容器,windows上我比较熟悉的工具是SQLyog。创建数据库data-test之后导入sql脚本即可。脚本和项目一并提供,附在本文最后。
在这里插入图片描述

启动redis容器
在这里插入图片描述
这边自信的话就不需要windows可视化工具连接容器redis了,怕出问题的话你可以连接下试试。
启动项目
通过下面的指令启动项目,只解释下–link参数,这个参数的意思是做映射,还记得吗,项目里面咱们将mysql的ip改为了emysql,redis的ip改为了eredis,就是在这里映射的。

docker run -id  -p 8890:8890 --name docker_first_pro --link mysql:emysql --link redis:eredis docker_pro_first

docker ps查看,启动成功
在这里插入图片描述

测试项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
完全没什么问题
最后看一眼redis值设置上没有
在这里插入图片描述
可以查询到,ok的。

总结

用于演示的springboot项目地址docker部署springboot
sql文件也包含其中。
对于开发人员来说,了解docker,掌握基本命令的使用即可。可以不必要太过深入。学习它我觉得最主要的目的还是学习它的思想以及可以部署我们写好的java项目。
加油,各位,看的开心点个赞,hhh。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值