上篇文章 Docker 构建 Java Web 开发环境(一)使用 docker commit 命令,直接在容器中操作(安装软件及配置文件等),比较简单直观;这篇文章使用 docker build命令和 Dockerfile 文件,模板化镜像构建过程,推荐使用这种方法,这里需要了解下 DockerFile 的语法和相关命令的意思。

准备工作

Dockerfile指令学习: Dockerfile指令详解,这篇文章的参考文献很好。

Dockerfile语法在线检查工具:http://dockerfile-linter.com/(链接已失效)

创建Dockerfile文件

可以自己制作基础镜像,或者从仓库中获取基础镜像,然后在其基础上制作新的镜像,我是用公司仓库现有的 java8 镜像基础上开始的。

docker pull XXX/jdk:8    //获取jdk8镜像

mkdir -p docker/java8    //创建目录准备制作镜像,将tomcat8压缩包放到该目录下
vi Dockerfile           //创建Dockerfile文件

Dockerfile文件内容如下

FROM XXX/jdk:8
#RUN yum -y update
ENV JAVA_HOME /apps/svr/jdk    
ADD apache-tomcat-8.0.32.tar.gz /usr/local/  
RUN mv apache-tomcat-8.0.32 tomcat8
EXPOSE 8080
RUN chmod u+x /usr/local/tomcat8/bin/*.sh  
CMD /usr/local/tomcat8/bin/catalina.sh start  

Dockerfile注意:CMD 指令在 Dockerfile 中只能使用一次,如果有多个,则只有最后一个会生效。CMD 会在 启动容器 的时候 执行生效,build 时不执行,而 RUN 只是在 构建镜像 的时候 执行生效,后续镜像构建完成之后,启动容器就与 RUN 无关了。因为镜像是分层的,一个 ENV 只会新增一层镜像,而三个 ENV 则会新增三层镜像,为了提升效率推荐使用一个 ENV 定义多个变量。可以使用上面的在线工具检查下。

创建镜像

在刚才建的目录下执行命令

docker build -t liu/jdk8-tomcat8:1.0 . //构建镜像liu/jdk8-tomcat8:1.0
docker images  //可以看到刚建的liu/jdk8-tomcat8镜像1.0版本
docker run -d -p 8080:8080 liu/jdk8-tomcat8:1.0  //启动容器

启动容器后,在浏览器上访问 http://localhost:8080 看看是否成功

也可以先这样启动容器 docker run -it -p 8080:8080 liu/jdk8-tomcat8:1.0 /bin/bash看看是否有错误

运行项目

由于项目在 ide 中经常修改,所以可以将打包项目的目录直接挂载到 tomcat 的 webapps 目录下面,启动容器是就会自动启动应用

docker run -d -p 8080:8080 -v /Users/gary/PracticeCode/monitor/target:/usr/local/tomcat8/webapps liu/jdk8-tomcat8:1.0

常用命令

docker kill $(docker ps -a -q)   //杀死所有正在运行的容器
docker rm $(docker ps -a -q)    //删除所有已经停止的容器
docker rmi $(docker images -q)  //删除所有镜像
//如果感觉命令太长,可以在 ./bash_profile中给这些命令自定义别名

docker start CONTAINER [CONTAINER...] //运行一个或多个停止的容器
docker stop CONTAINER [CONTAINER...] //停掉一个或多个运行的容器 -t 选项可指定超时时间
docker kill [OPTIONS] CONTAINER [CONTAINER...] //默认 kill 发送 SIGKILL 信号 -s 可以指定发送 kill 信号类型
docker restart [OPTIONS] CONTAINER [CONTAINER...] //重启一个或多个运行的容器 
docker pause CONTAINER  //暂停一个容器,方便 commit
docker unpause CONTAINER //继续暂停的容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]  //移除一个或多个容器 -f强制删除

[参考]
从零开始使用Docker构建Java Web开发运行环境

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐