[编者的话] 当文字偶遇代码,当程序插上了翅膀,让分享成为我们彼此沟通的语言。我们期待可以构建这样一个平台让开发者们看到你们的智慧,挖掘你们的才华,让彼此在开源的路上不再孤独。“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. 浏览与调试
- Supervisor控制台: http://< docker-ip >:9001, 比如: http://192.168.59.103:9001
- Tomcat控制台: http://< docker-ip >/manager or http://< docker-ip >:8080/manager, 比如: http://192.168.59.103/manager
- 静态资源: http://< docker-ip >/static, 比如: http://192.168.59.103/static
- Java Web应用:http://< docker-ip >/< context root of java web application >, 比如:http://192.168.59.103/hello-world
4. 总结
- 完整的 Dockerfile 及 相关配置文件,请参考:https://github.com/docker-images/Dockerfile-javaweb
- 部署到 Daocloud 测试网址:http://javaweb.daoapp.io
本文来自“DaoCloud分享写作计划”,这项计划旨在为开发者提供一个平台,分享使用Docker的心得体会和技术经验。DaoCloud将为文章作者提供一定的物质奖励,具体方式请访问:DaoCloud写作分享计划 ,欢迎Docker爱好者和DaoCloud用户踊跃投稿。