您的位置:首页 > 运维架构 > Docker

用docker构建一个springboot应用

2020-01-14 06:20 10 查看

一、Docker介绍

Dcoker是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可实现虚拟化;dcoker运行一个程序的过程:去仓库把镜像拉到本地,然后用命令把镜像运行起来,变成容器。

image

二、前提条件

docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。查看当前系统的内核版本,使用 uname -r

 

三、安装docker

我们以CentOS 7为例,使用yum来安装docker。本文只介绍简单的安装步骤,详细安装教程请参考官方文档

https://docs.docker.com/install/linux/docker-ce/centos/

Step 1 安装系统工具

[code]yum install -y yum-utils device-mapper-persistent-data lvm2

Step 2 添加yum源

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

Step 3 安装 docker-ce

[code]yum makecache fast
yum -y install docker-ce

Step 4 启动 docker

[code]service docker start

四、docker构建springboot应用镜像

Step 1 编写dockerfile文件

[code]FROM hub.c.163.com/public/centos:7.2.1511

RUN mkdir /opt/project/ -p
WORKDIR  /opt/project
EXPOSE 9091

ADD  ./build/libs/FirstSpringBoot-0.0.1-SNAPSHOT.jar /opt/project
ADD jdk-8u191-linux-x64.tar.gz /root

ENV JAVA_HOME /root/jdk1.8.0_191
ENV PATH $JAVA_HOME/bin:$PATH

ENTRYPOINT ["java", "-jar", "FirstSpringBoot-0.0.1-SNAPSHOT.jar"]

命令简介

(1) FROM : 指定哪种镜像作为新镜像的基础镜像,这里使用centos作为基础镜像
(2) RUN : 在镜像内部执行的命令,比如安装一些软件,配置一些基础环境,可以使用 \ 来换行;这里在镜像内部新建一个文件夹目录 /opt/project/;也可以使用exec格式 RUN ["executable", "param1","param2"] ,executable是命令,后面的param是参数
(3) WORKDIR : 在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,这里的工作目录为/opt/project/
(4) EXPOSE: EXPOSE用来指定端口,暴露镜像的端口供主机做映射,启动镜像时,使用 -P 参数来将镜像端口与宿主机的随机端口做映射。
(5) ADD: ADD [source directory or URL] [destination directory],将主机的文件复制到镜像中,跟COPY一样,限制条件和使用方式都一样;但是ADD会对压缩文件做自动提取和解压操作
(6) ENV: ENV命令用于设置环境变量,并可以在容器内被脚本或者程序调用;这里EVN用于设置java环境变量,由于运行java应用,否则会提示java命令不可用
(7) ENTRYPOINT: 容器启动时需要执行的命令,CMD和ENTRYPOINT同样作为容器启动执行的命令,有以下区别:

  • CMD命令会被docker run命令覆盖而ENTRYPOINT不会
  • RUN命令在image文件的构建阶段执行,执行结果都会打包进入image文件;CMD命令则是在容器启动后执行。另外,一个Dockerfile可以包含多个RUN命令,但是只能有一个CMD命令
  • CMD和ENTRYPOINT都存在时,CMD的指令变成了ENTRYPOINT的参数,并且CMD提供的参数会被docker run后面的命令覆盖掉

Step 2 制作springboot应用的镜像

(1)什么是docker镜像

Docker镜像(image)就是一个只读模板,是一堆只读层的统一视角(如下图),采用统一文件系统技术将不同的层整合成一个文件系统为这些层提供一个统一视角,这样的隐藏了多层的 存在,在用户看来就是一个文件系统;镜像可以用来创建容器,作为创建容器的模板,一个镜像可以创建很多容器。镜像和容器的关系可以形象的理解为java中类和对象的关系。可以将镜像存放在镜像仓库中(repository),只可以从镜像仓库中下载你需要的镜像。

 

(2)准备工作

  • 在jenkins工作空间找到我们部署的项目,进入到Dockerfile文件根目录下,在该目录下构建应用镜像;
  • 当我们进行镜像构建的时候,经常会将一些本地的文件复制进镜像,比如ADD、COPY指令,而docker build命令构建镜像并非在本地构建,而是在服务端,也就是Docker引擎中构建的,于是 就有了上下文的概念,当我们在构建的时候,用户会指定镜像构建的的上下文路径。docker build命令得知这个路径之后,会将路径下的所有内容打包,然后上传给Docker引擎,这样Docker 引擎收到这个上下文包后,就会获得构建镜像所需要的一切文件;
  • Dockerfile所在的目录就是构建镜像的上下文路径,Docker引擎可以访问到该目录下的所有文件,至于该目录以外的其他文件就无法访问;由于要 ADD jdk-8u191-linux-x64.tar.gz,先将jdk-8u191-linux-x64.tar.gz copy到该目录下,/build/lib下已经有 FirstSpringBoot-0.0.1-SNAPSHOT.jar不需要拷贝(其实在任何目录下只要将需要的文件放进去就可以构建 镜像了)

     

    image.png

(3)构建镜像构建命令,请注意最后的 “."

[code]docker build -t springboot-docker:1.0 .

 

如下图所示,最后的.表示当前目录,也就是构建镜像的上下文路径。successfully表示构建成功。

 

通过docker image ls命令可以查看到刚才构建成功的镜像,如下图所示:

image

Step 3 从新镜像创建并启动容器

(1)什么是docker容器

Dcoker利用容器(Container)来运行应用,容器是从镜像创建的运行实例,他可以被启动、开始、停止、删除;每个容器之间都是相互隔离的,保证安全的平台。可以把容器看做一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序;容器的定义和镜像几乎一摸一样,也是一堆层的统一视角,唯一区别在于容器的最上面一层是可读可写的。因为运行容器里面的应用可能会新建一个文件,或者修改一个目录,这些而操作都是在最上面的可读可写层,不会作用到镜像里面。

 

(2)启动容器执行命令

[code]docker run -p 9091:9091 -d --name springboot-docker springboot-docker:1.0

创建同时启动容器;docker ps -a 可以看到容器已经启动成功。

 

STATUS 为 Up 表示该容器启动成功,Exited(0) 表示容器正常退出,若括号里为其他数字表示非正常退出

Step 4 查看容器日志,是否启动成功

执行命令

[code]docker logs -t -f --tail 100 springboot-docker

查看容器日志

 

Step 5 进入容器查看容器内的目录结构

执行命令

[code]docker exec -it springboot-docker /bin/bash

进入容器,可以看到docker内部的文件结构和linux ;退出容器 “Ctrl+c && Ctrl+d”,“Ctrl+p && Ctrl+q”,exit

 

 

Step 6 更新docker中的 jar

Docker本身提供一种机制,可以将主机上的某个目录与容器的某个目录(称为挂载点、或者叫卷)关联起来,容器上的挂载点下的内容就是主机的这个目录下的内容;这样的话,我们修改该目录的内容时,不需要同步容器,对容器来说是立即生效的。有以下两个方式执行

(1)通过docke run 命令

[code]docker run -v /var/lib/jenkins/workspace/FirstSpringBoot/build/libs:/opt/project -p 9091:9091 -d --name springboot-docker springboot-docker:1.0

其中 -v 标记在容器中设置一个挂载点/opt/project(就是容器中的一个目录),并将主机上的/var/lib/jenkins/workspace/FirstSpringBoot/build/libs目录中的内容关联到/opt/project下,这样在容器中对/var/lib/jenkins/workspace/FirstSpringBoot/build/libs目录下的操作会同步到挂载点/opt/project

 

(2)通过dockerfile创建挂载点但是通过VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。如VOLUME ["/data1","/data2"],可以通过docker inspect查看挂载信息五、docker常用命令

 

  • 删除容器实例:docker rm CONTAINER ID

  • 删除镜像:docker rmi IMAGE ID

  • 启动容器:docker start/restart CONTAINER ID

  • 停止容器:docker stop CONTAINER ID

  • 点赞
  • 收藏
  • 分享
  • 文章举报
chendongdong1 发布了6 篇原创文章 · 获赞 0 · 访问量 57 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: