为什么是Docker
- 在开发的时候,在本机测试环境可以跑,生产环境跑不起来` 这里我们拿java Web应用程序举例,我们一个java Web应用程序涉及很多东西,比如jdk、tomcat、mysql等软件环境。当这些其中某一项版本不一致的时候,可能就会导致应用程序跑不起来这种情况。Docker则将程序以及使用软件环境直接打包在一起,无论在那个机器上保证了环境一致。 优势1: 一致的运行环境,更轻松的迁移
- 服务器自己的程序挂了,结果发现是别人程序出了问题把内存吃完了,自己程序因为内存不够就挂了` 这种也是一种比较常见的情况,如果你的程序重要性不是特别高的话,公司基本上不可能让你的程序独享一台服务器的,这时候你的服务器就会跟公司其他人的程序共享一台服务器,所以不可避免地就会受到其他程序的干扰,导致自己的程序出现问题。Docker就很好解决了环境隔离的问题,别人程序不会影响到自己的程序。 优势2:对进程进行封装隔离,容器与容器之间互不影响,更高效的利用系统资源
- 公司要弄一个活动,可能会有大量的流量进来,公司需要再多部署几十台服务器` 在没有Docker的情况下,要在几天内部署几十台服务器,这对运维来说是一件非常折磨人的事,而且每台服务器的环境还不一定一样,就会出现各种问题,最后部署地头皮发麻。用Docker的话,我只需要将程序打包到镜像,你要多少台服务,我就给力跑多少容器,极大地提高了部署效率。 优势3: 通过镜像复制N多个环境一致容器
制作镜像
将一个SpringBoot的应用制作成镜像也是Very easy哦,前提是你要了解一下Docker一些基本命令的使用,Docker命令的介绍在菜鸟教程里面写的那些命令已经很够用了,我就不在介绍啦咱们直接实战将应用制作成镜像,然后将而容器启动起来你只需要将你的应用打成jar包然后编写Dockerfile就好啦~
编写Dockerfile
编写Dockerfile咱们IDEA上写好直接使用IDEA的远程连接工具上传上去就好啦,企业开发就不是这样啦,涉及到部署每个公司都会使用CI/CD工具去进行持续集成与持续交付,姜同学呢所在的公司就是在是在使用Jenkins在做CI/CD的工具,程序打好包之后,制作成镜像,然后上传到公司搭建的私有镜像仓库就好啦~,然后在部署的机器上将镜像pull下来然后使用docker-compose编排你的容器就好啦,
代码语言:javascript复制FROM java:
MAINTAINER jiangmingyang@pinsmedical.com
ENV DEPLOY_HOME=/home/deploy
ENV DEPLOY_PORT=
WORKDIR ${DEPLOY_HOME}
VOLUME ${DEPLOY_HOME}/log
VOLUME /opt/font
RUN mkdir -p /opt/font
COPY *.jar ${DEPLOY_HOME}/pins-app.jar
COPY src/main/resources/chufang.docx ${DEPLOY_HOME}/src/main/resources/chufang.docx
EXPOSE
ENTRYPOINT java -Xms128m -Xmx512m -jar pins-app.jar --spring.profiles.active=prod --server.port=${DEPLOY_PORT}
我这里简单的解释一下就好啦,因为我相信机智的你早已对Dockerfile的指令了然于胸了~。
使用java8作为基础镜像,然后使用WORKDIR指定工作目录,没有的话是会自动创建的,这个工作目录就是你刚进入的落脚点,因为咱们企业开发肯定是要区分开发测试与生产环境的吗所以要使用ENV指定环境变量然后在容器启动的时候实用–env把他替换掉就好啦,将jar包上传到镜像里面去然后把应用的日志目录挂载到宿主机当中去,这个/var/log是我在logback中已经定义好的了。使用EXPOSE将springboot启动时候的8080端口暴漏出去,方便宿主机映射。MAINTAINER这个命令就是记录一下这个容器的维护者啦,所以后面的就是姜同学的邮箱喽,最后的ENTRYPOINT就是要写容器启动时要执行的命令啦
构建镜像
现在jar包和Dockerfile已经放在一起啦,现在这个目录就是一会docker build的上下文目录啦~
代码语言:javascript复制docker build -t hello-docker:v0.1 .
hello-docker就是镜像的名称,剩下的v0.1就是镜像的tag.
docker run启动容器
代码语言:javascript复制docker run -d -p 8080:8080 -v /docker_volumes/hello-docker/:/var/log/docker-demo --env active=test --name hello-docker hello-docker:v0.1
So easy有没有~