使用 Docker 构建 Java Web 运行环境

[编者的话] 当文字偶遇代码,当程序插上了翅膀,让分享成为我们彼此沟通的语言。我们期待可以构建这样一个平台让开发者们看到你们的智慧,挖掘你们的才华,让彼此在开源的路上不再孤独。“DaoCloud分享写作计划”已全面启动,欢迎投稿。


作者:Niko Guo(Java Web后端工程师,来自厦门)


1. 前言

本文将简要介绍如何使用 Docker 搭建一个 Java Web 应用的运行环境,最终的 Docker 镜像将包含如下特性: - 基于 Centos 6; - 使用 Oracle JDK 8; - 使用 Apache httpd 和 Tomcat 实现动静分离; - 内建了 Tomcat Apr 支持; - 使用 Supervisor 管理进程;

2. Dockerfile 编写步骤

指定基础镜像及作者信息

bash  
FROM centos:centos6  
MAINTAINER Guuuo <im@kuo.io>  

安装必要的工具

为了安装 JDK/Tomcat 等软件,我们需要: - 用 wget 从各个官网下载相应的安装包(rpm、zip等); - 用 unzip/tar 将安装包进行解压; - 通过 python-setuptools 安装 supervisor 进行多进程的管理;

因此,这部分的脚本如下:

bash  
#update
RUN yum -y update; yum clean all  
#install tools
RUN yum install -y wget unzip tar  
#install supervisor
RUN yum install -y python-setuptools  
RUN easy_install supervisor  
RUN mkdir -p /var/log/supervisor  

安装 Httpd

  • 我们的预期是使用Apache httpd接收所有的请求,并将动态请求转发到后端的Tomcat进行处理,因此需要安装 Apache Httpd;
  • 直接通过centos的包管理工具安装 Apache httpd;
bash  
#install httpd
RUN yum -y install httpd  

配置 httpd

  • 创建目录 /data/wwwroot,并将所有的静态资源放在该目录下;
  • 创建目录 /data/wwwconf,并将自定义的 httpd 配置文件(比如:转发请求到 Tomcat 的代理配置,虚拟主机配置等)放在该目录下,配置文件名必须以 .conf 扩展名结尾;
  • 将自定义的 httpd.conf 拷贝到 /etc/httpd/conf/ 目录下,覆盖掉默认的 httpd.conf;该自定义的 httpd.conf 相对于原始的httpd.conf,仅仅增加了如下一行配置,用于引入 /data/wwwconf 目录下以 .conf 结尾的配置文件;方便配置文件的管理:
bash  
Include /data/wwwconf/*.conf  

因此,该步骤的脚本如下:

bash  
#config httpd
RUN mkdir -p /data  
ADD conf/httpd/wwwroot /data/wwwroot  
ADD conf/httpd/wwwconf /data/wwwconf  
ADD conf/httpd/httpd.conf /etc/httpd/conf/httpd.conf  

安装 JDK

  • 从 Oracle 官网下载 JDK rpm 安装包 进行安装;
  • 设置环境变量 JAVA_HOME;
bash  
#install jdk
ENV JAVA_VERSION 8u45  
ENV BUILD_VERSION b14  
RUN wget --no-cookies --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/$JAVA_VERSION-$BUILD_VERSION/jdk-$JAVA_VERSION-linux-x64.rpm" -O /tmp/jdk-8-linux-x64.rpm  
RUN yum -y install /tmp/jdk-8-linux-x64.rpm  
RUN rm -rf /tmp/jdk-8-linux-x64.rpm  
RUN alternatives --install /usr/bin/java jar /usr/java/latest/bin/java 200000  
RUN alternatives --install /usr/bin/javaws javaws /usr/java/latest/bin/javaws 200000  
RUN alternatives --install /usr/bin/javac javac /usr/java/latest/bin/javac 200000  
ENV JAVA_HOME /usr/java/latest  

安装 Tomcat

  • 从 Apache Tomcat 官网下载 Tomcat 压缩包,解压到 /data/tomcat 目录下;
  • 为了可以登录 Tomcat 控制台,拷贝预先配置好的 tomcat-users.xml 文件到 /data/tomcat/conf/tomcat-users.xml 下;
bash  
#install tomcat
ENV TOMCAT_VERSION 7.0.62  
RUN wget http://mirrors.cnnic.cn/apache/tomcat/tomcat-7/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.zip -O /tmp/tomcat.zip  
RUN unzip /tmp/tomcat.zip -d /tmp/  
RUN rm -rf /tmp/tomcat.zip  
RUN mkdir -p /data  
RUN mv /tmp/apache-tomcat-$TOMCAT_VERSION /data/tomcat  
RUN chmod 777 /data/tomcat/bin/*.sh  
ADD conf/tomcat/tomcat-users.xml /data/tomcat/conf/tomcat-users.xml  

编译 Tomcat Apr

  • 安装 make 相关工具;
  • 安装 apr 开发包;
  • 编译和配置 Tomcat Native;
bash  
#install make
RUN yum -y install gcc automake autoconf libtool make  
#install openssl openssl-dev apr-devel
RUN yum -y install openssl openssl-devel apr-devel  
#install tomcat-native
RUN cp /data/tomcat/bin/tomcat-native.tar.gz /tmp/tomcat-native.tar.gz  
RUN tar zxvf /tmp/tomcat-native.tar.gz -C /tmp; rm -rf /tmp/tomcat-native.tar.gz  
RUN mv /tmp/tomcat-native-*-src /tmp/tomcat-native  
WORKDIR /tmp/tomcat-native/jni/native  
RUN chmod +x ./configure  
RUN chmod +x ./build/*.sh  
RUN ./configure --with-apr=/usr/bin/apr-1-config --with-java-home=$JAVA_HOME --with-ssl=yes  
RUN make & make install  
RUN rm -rf /tmp/tomcat-native  
#config apr
ENV LD_LIBRARY_PATH /usr/local/apr/lib  

配置Supervisor

  • 自定义的 Supervisor 配置文件,请参考:./confg/supervisor/supervisord.conf;
  • tomcat的启动参数比较多,建议独立出来,请参考:./conf/supervisor/supervisord_tomcat.sh;
bash  
#config supervisor
ADD conf/supervisor/supervisord.conf /etc/supervisord.conf  
ADD conf/supervisor/supervisord_tomcat.sh /data/tomcat/bin/supervisord_tomcat.sh  
RUN chmod +x /data/tomcat/bin/supervisord_tomcat.sh  

开放端口

  • 只开放 80 端口;
  • 所有动态资源通过 httpd 转发到 Tomcat 的 8080 端口,请参考 ./conf/httpd/wwwconf/mod-proxy.conf;
bash  
EXPOSE 80  

配置运行命令

bash  
CMD ["supervisord", "-n"]  

3. 使用步骤

3.1. 克隆Docker及相关配置文件到本地

bash  
git clone https://github.com/docker-images/Dockerfile-javaweb.git  

3.2. 构建

bash  
cd Dockerfile-javaweb  
./build.sh

或者

bash  
docker build -t guuuo/javaweb ./Dockerfile-javaweb  

3.3. 运行

bash  
cd Dockerfile-javaweb  
./run.sh

或者

bash  
docker run -p 80:80 -p 9001:9001 -p 8080:8080 -t -i guuuo/javaweb  

或者 指定静态资源与Java Web应用程序的路径

docker run -v /c/Users/xxx/javaproject/static:/data/wwwroot/static -v /c/Users/xxx/javaproject/webapps:/data/tomcat/webapps -p 80:80 -p 9001:9001 -p 8080:8080 -t -i guuuo/javaweb  

3.4. 浏览与调试

4. 总结


本文来自“DaoCloud分享写作计划”,这项计划旨在为开发者提供一个平台,分享使用Docker的心得体会和技术经验。DaoCloud将为文章作者提供一定的物质奖励,具体方式请访问:DaoCloud写作分享计划 ,欢迎Docker爱好者和DaoCloud用户踊跃投稿。