Web 服务器与应用
Nginx
我的Nginx Docker镜像
- ## 设置继承自己创建的 sshd 镜像
- FROM caseycui/ubuntu-sshd
- ## 维护者
- LABEL maintainer="CaseyCui cuikaidong@foxmail.com"
- ## 安装 nginx
- RUN apt-get update \
- && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
- nginx \
- geoip-bin \
- fcgiwrap \
- ssl-cert \
- && rm -rf /var/lib/apt/lists/* \
- && chown -R www-data:www-data /var/lib/nginx
- ## 添加脚本,并设置权限
- COPY run-nginx.sh /run-nginx.sh
- ##RUN chmod 755 /run-nginx.sh
- ## 定义工作目录
- WORKDIR /etc/nginx
- ## 添加挂载点 /var/www
- VOLUME /var/www
- ## forward request and error logs to docker log collector
- RUN ln -sf /dev/stdout /var/log/nginx/access.log \
- && ln -sf /dev/stderr /var/log/nginx/error.log
- ## 定义输出端口
- EXPOSE 80
- EXPOSE 443
- ## 定义输出命令
- CMD ["/run-nginx.sh"]
复制代码 run-nginx.sh 脚本:- ## nginx 以 daemon off 形式启动
- /usr/sbin/nginx -g "daemon off;"
复制代码为什么需要 daemon off; ?
想象这样的场景:
如果没有 daemon off, nginx 后台运行, 这时 nginx 并不是 pid 为 1 的程序, 而是执行的其他(如 bash), 这个 bash 执行了 nginx 指令后就结束了, 容器也会随之退出.
或直接修改/etc/nginx/nginx.conf 文件:
echo -e "\ndaemon off;" >> /etc/nginx/nginx.conf
Tomcat
Tomcat 最初是由 Sun 的软件架构师詹姆斯.邓肯.戴维森 开发的, 后来在他的帮助下称为开源项目, 并由 Sun 贡献给 Apache 软件基金会.
Tomcat主要功能: 运行 JSP 页面和 Servlet.
JAVA
企业通常使用 Sun JDK 6 或 Oracle JDK 7+. Dockerfile 如下:- FROM caseycui/ubuntu-sshd
- LABEL maintainer="CaseyCui cuikaidong@foxmail.com"
- ## 创建 /java 目录
- RUN mkdir /java
- ## 解压jdk压缩包到/java目录
- ADD jdk-7u80-linux-x64.tar.gz /java
- ## 1. 删除 src.zip,减少镜像size
- ## ~~2. 配置JAVA环境变量~~
- ## ~~3. 使生效~~
- ## 下面为几种不同的 echo 写法(配置ENV则不需要手动在/etc/profile里添加)
- ## =======================================================
- ## echo -e "\nexport JAVA_HOME=/java/jdk1.7.0_80\nexport PATH=/java/jdk1.7.0_80/bin:$PATH\nexport CLASSPATH=.:/java/jdk1.7.0_80/lib/dt.jar:/java/jdk1.7.0_80/lib/tools.jar" >> /etc/profile
- ## =======================================================
- ## RUN { \
- ## echo; \
- ## echo 'export JAVA_HOME=/java/jdk1.7.0_80'; \
- ## echo 'export PATH=$JAVA_HOME/bin:$PATH'; \
- ## echo 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar'; \
- ## } >> /etc/profile \
- ## && source /etc/profile \
- ## && rm -f /java/jdk1.7.0_80/src.zip
- ## =======================================================
- RUN rm -f /java/jdk1.7.0_80/src.zip
- ## 配置ENV
- ## > The environment variables set using `ENV` will persist when a container is run from the resulting image.
- ENV JAVA_HOME /java/jdk1.7.0_80
- ENV JAVA_VERSION 7u80
- ENV PATH $JAVA_HOME/bin:$PATH
- ENV CLASSPATH .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
复制代码❗ 备注:
- JDK的压缩包来自 Oracle Support 网站.
- JAVA环境变量直接在 ENV 里配置即可, 无需手动写入 /etc/profile 中
- 如何把多行, 且含有多种特殊字符的字符串写入文件? - 用大括号
Tomcat 8
基于 Oracle JDK 7 的 Tomcat 8.0.X 的Dockerfile如下:创建 Tomcat 用户和密码脚本文件 create_tomcat_admin_user.sh, 内容如下:- ##!/bin/bash
-
- if [ -f /.tomcat_admin_created ]; then
- echo "Tomcat 'admin' user already created"
- exit 0
- fi
- ## generate password
- PASS=${TOMCAT_PASS:-$(pwgen -s 12 1)}
- _word=$( [ ${TOMCAT_PASS} ] && echo "preset" || echo "random")
- echo "=> Creating and admin user with a ${_word} password in Tomcat"
- ##sed -i -r 's/<\/tomcat-user>//' ${CATALINA_HOME}/conf/tomcat-users.xml
- ## 这句的主要用法就是原本的`tomcat-users.xml`里存在一个空的`<tomcat-users>`到`</tomcat-users>`的字段,直接用sed删除最后一行,即`</tomcat-users>`
- ## 然后补上我们生成的密码的相关内容,最后再加上`</tomcat-users>`
-
-
- sed -i '$d' ${CATALINA_HOME}/conf/tomcat-users.xml
- echo '<role rolename="manager-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
- echo '<role rolename="manager-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
- echo '<role rolename="manager-jmx"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
- echo '<role rolename="admin-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
- echo '<role rolename="admin-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
- echo "<user username="admin" password="${PASS}" roles="manager-gui, manager-script, manager-jmx, admin-gui, admin-script"/>" >> ${CATALINA_HOME}/conf/tomcat-users.xml
- echo '</tomcat-users>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
- echo "=> Done!"
- touch /.tomcat_admin_created
- echo "======================================================"
- echo "You can now configure to this Tomcat server using:"
- echo ""
- echo " admin:${PASS}"
- echo ""
- echo "======================================================"
复制代码 Tomcat 启动脚本 run-tomcat.sh:- ##!/bin/bash
-
- if [ ! -f /.tomcat_admin_created ]; then
- /create_tomcat_admin_user.sh
- fi
- exec ${CATALINA_HOME}/bin/catalina.sh run
复制代码 tomcat 密码脚本最后生成的 tomcat-users.xml 文件:
[code][/code]本章小结
中间件服务器是 Docker 容器应用的最佳实践, 理由如下:
- 中间件服务器是除数据库服务器外的主要计算节点, 很容易成为性能瓶颈, 所以通常需要大批量部署, 而Docker 对于批量部署有着许多的先天优势
- 中间件服务器结构清晰, 在剥离了配置文件 日志 代码目录 之后, 容器几乎可以处于零增长状态, 这使得容器的迁移和批量部署更加方便.
- 中间件服务器很容易实现集群, 在使用硬件的F5, 软件的Nginx 等负载均衡后, 中间件服务器集群变得非常容易
在使用中间件容器的时候, 需要事先规划好容器的用途和可能开放的网络端口等资源.
❗ 对于程序代码 程序的资源目录 日志 数据库文件 等需要实时更新的数据一定要通过 -v 参数映射到宿主主机的目录中来, 使用 Docker 的 AUFS 文件格式, 会产生较大的性能问题.
IBM研究院关于Docker各项性能的测试报告
三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |