Docker 基础 - 3

打印 上一主题 下一主题

主题 732|帖子 732|积分 2198

Web 服务器与应用

Nginx

我的Nginx Docker镜像
  1. ## 设置继承自己创建的 sshd 镜像
  2. FROM caseycui/ubuntu-sshd
  3. ## 维护者
  4. LABEL maintainer="CaseyCui cuikaidong@foxmail.com"
  5. ## 安装 nginx
  6. RUN apt-get update \
  7.     && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
  8.         nginx \
  9.         geoip-bin \
  10.         fcgiwrap \
  11.         ssl-cert \
  12.     && rm -rf /var/lib/apt/lists/* \
  13.     && chown -R www-data:www-data /var/lib/nginx
  14. ## 添加脚本,并设置权限
  15. COPY run-nginx.sh /run-nginx.sh
  16. ##RUN chmod 755 /run-nginx.sh
  17. ## 定义工作目录
  18. WORKDIR /etc/nginx
  19. ## 添加挂载点 /var/www
  20. VOLUME /var/www
  21. ## forward request and error logs to docker log collector
  22. RUN ln -sf /dev/stdout /var/log/nginx/access.log \
  23.         && ln -sf /dev/stderr /var/log/nginx/error.log
  24. ## 定义输出端口
  25. EXPOSE 80
  26. EXPOSE 443
  27. ## 定义输出命令
  28. CMD ["/run-nginx.sh"]
复制代码
run-nginx.sh 脚本:
  1. ## nginx 以 daemon off 形式启动
  2. /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 如下:
  1. FROM caseycui/ubuntu-sshd
  2. LABEL maintainer="CaseyCui cuikaidong@foxmail.com"
  3. ## 创建 /java 目录
  4. RUN mkdir /java
  5. ## 解压jdk压缩包到/java目录
  6. ADD jdk-7u80-linux-x64.tar.gz /java
  7. ## 1. 删除 src.zip,减少镜像size
  8. ## ~~2. 配置JAVA环境变量~~
  9. ## ~~3. 使生效~~
  10. ## 下面为几种不同的 echo 写法(配置ENV则不需要手动在/etc/profile里添加)
  11. ## =======================================================
  12. ## 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
  13. ## =======================================================
  14. ## RUN { \
  15. ##                 echo; \
  16. ##                 echo 'export JAVA_HOME=/java/jdk1.7.0_80'; \
  17. ##                 echo 'export PATH=$JAVA_HOME/bin:$PATH'; \            
  18. ##                 echo 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar'; \
  19. ##         } >> /etc/profile \
  20. ##     && source /etc/profile \
  21. ##     && rm -f /java/jdk1.7.0_80/src.zip
  22. ## =======================================================
  23. RUN rm -f /java/jdk1.7.0_80/src.zip
  24. ## 配置ENV
  25. ## > The environment variables set using `ENV` will persist when a container is run from the resulting image.
  26. ENV JAVA_HOME /java/jdk1.7.0_80
  27. ENV JAVA_VERSION 7u80
  28. ENV PATH $JAVA_HOME/bin:$PATH
  29. 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如下:
  1. FROM caseycui/jdk7:7u80
  2. LABEL maintainer='CaseyCui cuikaidong@foxmail.com'
  3. ENV CATALINA_HOME /tomcat
  4. ENV PATH $CATALINA_HOME/bin:$PATH
  5. RUN mkdir -p "$CATALINA_HOME"
  6. WORKDIR $CATALINA_HOME
  7. ## let "Tomcat Native" live somewhere isolated
  8. ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
  9. ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR
  10. ## runtime dependencies for Tomcat Native Libraries
  11. ## Tomcat Native 1.2+ requires a newer version of OpenSSL than debian:jessie has available
  12. ## > checking OpenSSL library version >= 1.0.2...
  13. ## > configure: error: Your version of OpenSSL is not compatible with this version of tcnative
  14. ## see http://tomcat.10.x6.nabble.com/VOTE-Release-Apache-Tomcat-8-0-32-tp5046007p5046024.html (and following discussion)
  15. ## and https://github.com/docker-library/tomcat/pull/31
  16. ENV OPENSSL_VERSION 1.0.2g-1ubuntu4.8
  17. ## RUN set -ex; \
  18. ##         if ! grep -q stretch /etc/apt/sources.list; then \
  19. ## # only add stretch if we're not already building from within stretch
  20. ##                 { \
  21. ##                         echo 'deb http://deb.debian.org/debian stretch main'; \
  22. ##                 } > /etc/apt/sources.list.d/stretch.list; \
  23. ##                 { \
  24. ## # add a negative "Pin-Priority" so that we never ever get packages from stretch unless we explicitly request them
  25. ##                         echo 'Package: *'; \
  26. ##                         echo 'Pin: release n=stretch'; \
  27. ##                         echo 'Pin-Priority: -10'; \
  28. ##                         echo; \
  29. ## # ... except OpenSSL, which is the reason we're here
  30. ##                         echo 'Package: openssl libssl*'; \
  31. ##                         echo "Pin: version $OPENSSL_VERSION"; \
  32. ##                         echo 'Pin-Priority: 990'; \
  33. ##                 } > /etc/apt/preferences.d/stretch-openssl; \
  34. ##         fi
  35. RUN apt-get update && apt-get install -y --no-install-recommends \
  36.                 libapr1 \
  37.                 openssl="$OPENSSL_VERSION" \
  38.         && rm -rf /var/lib/apt/lists/*
  39. ## 安装跟 tomcat 用户认证相关的软件
  40. RUN apt-get update && \
  41.     DIBIAN_FRONTEND=noninteractive \
  42.     apt-get install -yq --no-install-recommends \
  43.         wget \
  44.         pwgen \
  45.         ca-certificates && \
  46.     apt-get clean && \
  47.     rm -rf /var/lib/apt/lists/*
  48. ## see https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/KEYS
  49. ## see also "update.sh" (https://github.com/docker-library/tomcat/blob/master/update.sh)
  50. ENV GPG_KEYS 05AB33110949707C93A279E3D3EFE6B686867BA6 07E48665A34DCAFAE522E5E6266191C37C037D42 47309207D818FFD8DCD3F83F1931D684307A10A5 541FBE7D8F78B25E055DDEE13C370389288584E7 61B832AC2F1C5A90F0F9B00A1C506407564C17A3 713DA88BE50911535FE716F5208B0AB1D63011C7 79F7026C690BAA50B92CD8B66A3AD3F4F22C4FED 9BA44C2621385CB966EBA586F72C284D731FABEE A27677289986DB50844682F8ACB77FC2E86E29AC A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243 F3A04C595DB5B6A5F1ECA43E3B7BBB100D811BBE F7DA48BB64BCB84ECBA7EE6935CD23C10D498E23
  51. RUN set -ex; \
  52.         for key in $GPG_KEYS; do \
  53.                 gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
  54.         done
  55. ## 设置 tomcat 的环境变量
  56. ENV TOMCAT_MAJOR 8
  57. ENV TOMCAT_VERSION 8.0.46
  58. ENV TOMCAT_TGZ_URL http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz
  59. ENV TOMCAT_ASC_URL https://www.apache.org/dist/tomcat/tomcat-$TOMCAT_MAJOR/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc
  60. ## 复制 tomcat 到镜像中
  61. RUN set -x \
  62.         \
  63.         && wget -O tomcat.tar.gz "$TOMCAT_TGZ_URL" \
  64.         && wget -O tomcat.tar.gz.asc "$TOMCAT_ASC_URL" \
  65.         && gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz \
  66.         && tar -xvf tomcat.tar.gz --strip-components=1  \
  67.         && rm bin/*.bat \
  68.         && rm tomcat.tar.gz* \
  69.         \
  70.         && nativeBuildDir="$(mktemp -d)" \
  71.         && tar -xvf bin/tomcat-native.tar.gz -C "$nativeBuildDir" --strip-components=1 \
  72.         && nativeBuildDeps=" \
  73.                 dpkg-dev \
  74.                 gcc \
  75.                 libapr1-dev \
  76.                 libssl-dev \
  77.                 make \
  78.         " \
  79.         && apt-get update && apt-get install -y --no-install-recommends $nativeBuildDeps && rm -rf /var/lib/apt/lists/* \
  80.         && ( \
  81.                 export CATALINA_HOME="$PWD" \
  82.                 && cd "$nativeBuildDir/native" \
  83.                 && gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" \
  84.                 && ./configure \
  85.                         --build="$gnuArch" \
  86.                         --libdir="$TOMCAT_NATIVE_LIBDIR" \
  87.                         --prefix="$CATALINA_HOME" \
  88.                         --with-apr="$(which apr-1-config)" \
  89.                         --with-java-home="/java/jdk1.7.0_80" \
  90.                         --with-ssl=yes \
  91.                 && make -j "$(nproc)" \
  92.                 && make install \
  93.         ) \
  94.         && apt-get purge -y --auto-remove $nativeBuildDeps \
  95.         && rm -rf "$nativeBuildDir" \
  96.         && rm bin/tomcat-native.tar.gz
  97. ## verify Tomcat Native is working properly
  98. RUN set -e \
  99.         && nativeLines="$(catalina.sh configtest 2>&1)" \
  100.         && nativeLines="$(echo "$nativeLines" | grep 'Apache Tomcat Native')" \
  101.         && nativeLines="$(echo "$nativeLines" | sort -u)" \
  102.         && if ! echo "$nativeLines" | grep 'INFO: Loaded APR based Apache Tomcat Native library' >&2; then \
  103.                 echo >&2 "$nativeLines"; \
  104.                 exit 1; \
  105.         fi
  106. ## 创建 tomcat 用户脚本
  107. COPY create_tomcat_admin_user.sh /create_tomcat_admin_user.sh
  108. ## 创建 tomcat 运行脚本
  109. COPY run-tomcat.sh /run-tomcat.sh
  110. RUN chmod +x /*.sh && \
  111.     chmod +x /tomcat/bin/*.sh
  112. ## 挂载点
  113. ## 日志文件
  114. VOLUME $CATALINA_HOME/logs
  115. ## 程序文件
  116. VOLUME $CATALINA_HOME/webapps
  117. EXPOSE 8080
  118. CMD ["/run-tomcat.sh"]
复制代码
创建 Tomcat 用户和密码脚本文件 create_tomcat_admin_user.sh, 内容如下:
  1. ##!/bin/bash
  2. if [ -f /.tomcat_admin_created ]; then
  3.     echo "Tomcat 'admin' user already created"
  4.     exit 0
  5. fi
  6. ## generate password
  7. PASS=${TOMCAT_PASS:-$(pwgen -s 12 1)}
  8. _word=$( [ ${TOMCAT_PASS} ] && echo "preset" || echo "random")
  9. echo "=> Creating and admin user with a ${_word} password in Tomcat"
  10. ##sed -i -r 's/<\/tomcat-user>//' ${CATALINA_HOME}/conf/tomcat-users.xml
  11. ## 这句的主要用法就是原本的`tomcat-users.xml`里存在一个空的`<tomcat-users>`到`</tomcat-users>`的字段,直接用sed删除最后一行,即`</tomcat-users>`
  12. ## 然后补上我们生成的密码的相关内容,最后再加上`</tomcat-users>`
  13. sed -i '$d' ${CATALINA_HOME}/conf/tomcat-users.xml
  14. echo '<role rolename="manager-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  15. echo '<role rolename="manager-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  16. echo '<role rolename="manager-jmx"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  17. echo '<role rolename="admin-gui"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  18. echo '<role rolename="admin-script"/>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  19. echo "<user username="admin" password="${PASS}" roles="manager-gui, manager-script, manager-jmx, admin-gui, admin-script"/>" >> ${CATALINA_HOME}/conf/tomcat-users.xml
  20. echo '</tomcat-users>' >> ${CATALINA_HOME}/conf/tomcat-users.xml
  21. echo "=> Done!"
  22. touch /.tomcat_admin_created
  23. echo "======================================================"
  24. echo "You can now configure to this Tomcat server using:"
  25. echo ""
  26. echo "      admin:${PASS}"
  27. echo ""
  28. echo "======================================================"
复制代码
Tomcat 启动脚本 run-tomcat.sh:
  1. ##!/bin/bash
  2. if [ ! -f /.tomcat_admin_created ]; then
  3.     /create_tomcat_admin_user.sh
  4. fi
  5. exec ${CATALINA_HOME}/bin/catalina.sh run
复制代码
tomcat 密码脚本最后生成的 tomcat-users.xml 文件:
[code][/code]本章小结

中间件服务器是 Docker 容器应用的最佳实践, 理由如下:

  • 中间件服务器是除数据库服务器外的主要计算节点, 很容易成为性能瓶颈, 所以通常需要大批量部署, 而Docker 对于批量部署有着许多的先天优势
  • 中间件服务器结构清晰, 在剥离了配置文件 日志 代码目录 之后, 容器几乎可以处于零增长状态, 这使得容器的迁移和批量部署更加方便.
  • 中间件服务器很容易实现集群, 在使用硬件的F5, 软件的Nginx 等负载均衡后, 中间件服务器集群变得非常容易
在使用中间件容器的时候, 需要事先规划好容器的用途和可能开放的网络端口等资源.
❗ 对于程序代码 程序的资源目录 日志 数据库文件 等需要实时更新的数据一定要通过 -v 参数映射到宿主主机的目录中来, 使用 Docker 的 AUFS 文件格式, 会产生较大的性能问题.
IBM研究院关于Docker各项性能的测试报告
三人行, 必有我师; 知识共享, 天下为公.  本文由东风微鸣技术博客 EWhisper.cn 编写.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表