0%

使用 Docker 部署 Java Web 应用

前言

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Base image
From s1mple1995/jpress

USER root

# environment variables
ENV APP /usr/local/lib/tomcat9/webapps

# Copy the current directory contents into the container at $APP
ADD ./jpress.war $APP

# Make port 1110 available to the world outside this container
EXPOSE 1110

WORKDIR $APP

CMD ["service", "tomcat", "run"]

其中,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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Sending build context to Docker daemon 20.@6MB
Step 1/6 : FROM simple1995/jpress
---> 6c7F7aa5716d
Step 2/6 : USER root
---> Running in d29bd2d7cf4e
---> 616922ef516c
Removing intermediate container d29bd2d7cf4e
Step 3/6 : ENV APP /usr/local/lib/tomcat9/webapps
---> Running in 5667a207¢898
---> b6c061148616
Removing intermediate container 5667a267¢898
Step 4/6 : ADD ./jpress.war SAPP
---> a82c14e949e0
Step 5/6 : EXPOSE 1110
---> Running in b31964ddfefo
---> cd9de2d7786F
Removing intermediate container b31964ddfefo
Step 6/6 : CMD service tomcat run
---> Running in @4a6a78fa77a
---> de9b3648553e
Removing intermediate container @4a6a78fa77a
Successfully built de9b3648553e
Successfully tagged s1mple1995/jpress:latest

Dockerfile里的每一句命令都会在一个新的容器中运行,并生成一个新的镜像,再将中间过渡的容器移除。

我们来验证一下,执行docker images看到我的两个镜像:

1
2
3
REPOSITORY                  TAG          IMAGE ID
s1mple1995/jpress latest de9b3648553e
simple1995/java-web-env latest 292d98d8d6d4

执行docker image history de9查看jpress镜像历史

-----2017-11-04---7.01.30

甚至可以看到我们通过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
2
cd /etc/nginx/sites-enabled
cp ghost_8080.conf jpress.conf

修改jpress.conf文件,添加80、8080端口:

1
2
3
4
5
6
7
8
9
server_name jpress.s1mple.info www.jpress.s1mple.info;

location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:1110;
}

执行service nginx restart即可。

效果图
-----2017-11-20---9.42.47