前言
JPress是基于JAVA的博客平台,作为一个Web程序,我将用它演示如何构建自己的Docker镜像,以及如何使用Docker部署Java Web应用。
准备工作
- 服务器 ubuntu 16.04
- 下载好的jpress.war包,下载地址,下载下来先在IDE里跑了测试一下,以免服务器上出问题
- 构建好的java-web开发环境Docker镜像,如何构建
- Nginx
- Mysql
构建JPress镜像
在部署JPress之前我们需要先构建JPress镜像,以便生成容器实例。首先修改Tomcat的配置文件,以适用于JPress。
server.xml
创建java-web-env容器实例,进入bash:
| 1 | docker run -it s1mple1995/java-web-env bash | 
修改Tomcat配置文件:
| 1 | vim /usr/local/lib/tomcat9/conf/server.xml | 
修改8080端口为1110,并修改<Context>标签,意思是Web应用文件夹名为jpress,访问路径为根路径:
| 1 | <Context docBase="jpress" path="" reloadable="true" /> | 
退出容器,并生成新的镜像:
| 1 | docker commit ${container ID} s1mple1995/jpress | 
现在你有了jpress的镜像,但是Tomcat的webapps目录下空空如也,我们需要通过Dockerfile来构建更完善的jpress镜像。
Dockerfile
先在服务器上创建一个jpress文件夹,将jpress.warscp到此目录下
| 1 | mkdir -p /home/s1mple/jpress | 
执行vim Dockerfile编写镜像构建文件
| 1 | # Base image | 
其中,From指依赖的基础镜像。USER默认就是root,在生产环境为了安全可以指定其他用户。ENV是环境变量。ADD或者COPY命令将我们的war包拷贝到webapps目录下。EXPOSE开放端口。WORKDIR表示你进入容器时的初始路径。CMD为容器启动时执行的命令。这里使用service tomcat run而不是start是因为容器会监控前台如果没有输出,在start命令执行完后就会自动退出。而run命令是前台运行。我之前一直用start命令发现容器总是刚启动就退出。
更多命令请参考官方文档。
构建Docker镜像
现在所有准备工作都已完成,你可以构建自己的JPress镜像了。
在/home/s1mple/jpress目录下执行,-t给新镜像打上标签:
| 1 | docker build -t s1mple1995/jpress . | 
可以看到控制台输出了一些信息:
| 1 | Sending build context to Docker daemon 20.@6MB | 
Dockerfile里的每一句命令都会在一个新的容器中运行,并生成一个新的镜像,再将中间过渡的容器移除。
我们来验证一下,执行docker images看到我的两个镜像:
| 1 | REPOSITORY TAG IMAGE ID | 
执行docker image history de9查看jpress镜像历史

甚至可以看到我们通过bash修改tomcat配置文件后提交的镜像,你可以通过运行这些镜像来回退你的操作
运行
运行,-p绑定端口,-v挂载宿主机与容器的共享文件夹:
| 1 | docker run -it -d -p 1110:1110 -v /home/s1mple/jpress/:/usr/local/lib/tomcat9/webapps s1mple1995/jpress | 
不出意外,你现在就可以在浏览器上访问http://{domain}:1110/install进入JPress安装向导,按照步骤,填写数据库信息,需要提前建库。数据库主机填写你安装了mysql的服务器IP。
如果长时间未加载,可以执行docker restart命令重启容器
Nginx重定位
通过nginx配置二级域名,你现在可以通过 http://jpress.s1mple.info 访问我的jpress博客。
首先你要保证开放了二级域名。我的域名是在GoDaddy上买的,需要在他的DNS管理界面添加*.s1mple.info。
添加nginx配置文件:
| 1 | cd /etc/nginx/sites-enabled | 
修改jpress.conf文件,添加80、8080端口:
| 1 | server_name jpress.s1mple.info www.jpress.s1mple.info; | 
执行service nginx restart即可。
效果图
