前言
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
即可。
效果图