Docker篇 (一) 制作镜像-Tomcat开启APR模式

一、前言

1.1 Docker中的主要概念

Docker中的几个主要概念包括有:

  • 宿主机(Host)  - 可以看成是一台物理机器,在一个宿主机中一般有多个容器(类似于一个个的虚拟机)在运行
  • 层(Layer)  - Docker采用的是分层技术,镜像是由多个层叠加而成的,每个层仅包含了前一层的差异部分,包括有系统层、应用层等
  • 镜像(Image)  - 镜像是程序和文件的集合,镜像是由多个层(都是不可写的只读层)组成的一个特殊的文件系统,镜像是基于Dockerfile构建的,Dockerfile是一个描述文件,里面包含了若干条构建镜像的命令
  • 容器(Container)  - 容器是镜像的运行实例,镜像是不可运行的,容器才可以运行,容器 = 镜像 + 读写层,如果运行中的容器修改了一个已存在的文件,该文件将会从只读层复制到可写层,该文件的只读版本仍然存在,只是已经被可写层中该文件的副本所隐藏
  • 仓库(Repository)  - 仓库是存储镜像的地方,分为公有仓库和私有仓库,公有仓库中存储着很多别人已经做好的镜像,当然也可以定制自己的镜像推送到仓库中

Docker提供了一些操作指令主要包括有制作镜像的指令、操作容器的指令、容器和宿主机交互的指令及参数、从仓库中拉取和推送镜像的指令等。

1.2 Tomcat的连接协议

Tomcat中server.xml文件中有这么一段配置代码:

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

参照Tomcat8官网的HTTP连接器配置的说明,protocol的默认值是HTTP/1.1,表示使用自动切换机制来选择连接器,即如果有安装APR就选择APR,否则选择Java NIO作为连接器。

当然也可以不使用自动切换机制,直接指定具体的协议,可以有以下配置值:

  • org.apache.coyote.http11.Http11Protocol - blocking Java connector
  • org.apache.coyote.http11.Http11NioProtocol - non blocking Java NIO connector
  • org.apache.coyote.http11.Http11Nio2Protocol - non blocking Java NIO2 connector
  • org.apache.coyote.http11.Http11AprProtocol - the APR/native connector.

如果没有安装APR,Tomcat启动的时候会提示

The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path

二、安装Docker

安装Docker前需要用yum-config-manager添加一个yum源,如果提示yum-config-manager command not found需要安装yum-utils

yum install -y yum-utils 
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce

启动Docker,并设置Docker开机自启动

systemctl start docker
systemctl enable docker

三、准备文件

把需要用到的5个包下载到/anron/download目录下,JDK用wget下载不了,需先下载到本机再上传

mkdir -p /anron/download
cd /anron/download
wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.30/bin/apache-tomcat-8.5.30.tar.gz
wget http://mirror.bit.edu.cn/apache/apr/apr-1.7.0.tar.gz
wget http://mirror.bit.edu.cn/apache/apr/apr-iconv-1.2.2.tar.gz
wget http://mirror.bit.edu.cn/apache/apr/apr-util-1.6.1.tar.gz

[root@docker1 download]# pwd
/anron/download
[root@docker1 download]# ll
total 199416
-rw-r--r-- 1 root root   9541892 Apr  4  2018 apache-tomcat-8.5.30.tar.gz
-rw-r--r-- 1 root root   1093896 Apr  5  2019 apr-1.7.0.tar.gz
-rw-r--r-- 1 root root   1248250 Oct 23  2017 apr-iconv-1.2.2.tar.gz
-rw-r--r-- 1 root root    554301 Oct 23  2017 apr-util-1.6.1.tar.gz
-rw-r--r-- 1 root root 191753373 Mar 14 12:10 jdk-8u191-linux-x64.tar.gz

把5个包全部解压到/anron/imagebuilder目录下

mkdir -p /anron/imagebuilder
ls *.tar.gz | xargs -n1 tar -C /anron/imagebuilder -xzvf

cd /anron/imagebuilder
mv apr-iconv-1.2.2 apr-util-1.6.1

cd apache-tomcat-8.5.30/bin
tar xzvf tomcat-native.tar.gz

在/anron/imagebuilder目录下创建.bashrc文件,.bashrc文件内容如下:

# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias ll='ls -al --color=auto'

# Source global definitions
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi

.bashrc和/root/.bashrc文件内容基本相同,增加了一行内容而已

alias ll='ls -al --color=auto'

注释掉apr-1.7.0目录下configure文件中的$RM "$cfgfile",否则会提示cannot remove 'libtoolT': No such file or directory

修改apache-tomcat-8.5.30/conf目录下的server.xml文件

<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
改为
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
改为
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
           connectionTimeout="20000"
           redirectPort="8443" />

注释掉8009端口,nginx+tomcat一般用不上AJP
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

修改apache-tomcat-8.5.30/bin目录下catalina.sh文件中的UMASK="0027"为UMASK="0000",因为在程序中创建的文件权限是640,会出现权限不足无法查看文件,这里把文件权限改为666,目录权限为777

在apache-tomcat-8.5.30/bin目录下创建setenv.sh文件,内容如下

export JAVA_OPTS="$JAVA_OPTS -Xms2048M -Xmx2048M"
export JAVA_OPTS="$JAVA_OPTS -XX:NewSize=512m -XX:MaxNewSize=512m"
export JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m"
export JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"
export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/urandom"
export JAVA_OPTS="$JAVA_OPTS -Dhostname=$HOSTNAME"

四、编写Dockerfile文件

在/anron/imagebuilder目录下创建Dockerfile文件,文件内容如下:

#指定操作的镜像
FROM centos
 
# 维护者信息
MAINTAINER anron

#拷贝文件
COPY .bashrc /root/.bashrc

#jdk
COPY jdk1.8.0_191 /usr/local/soft/jdk

#bin/tomcat-native-1.2.16-src已经提前解压出来
COPY apache-tomcat-8.5.30 /usr/local/soft/tomcat

#要先备注了apr的configure文件中的$RM "$cfgfile"
COPY apr-1.7.0	/usr/local/soft/apr

#apr-iconv-1.2.2在apr-util-1.6.1目录下,--with-apr-iconv是相对目录
COPY apr-util-1.6.1	/usr/local/soft/apr-util
 
#添加环境变量
#把ENV JAVA_HOME放到RUN之前,否则提示configure: error: Java Home not defined. Rerun with --with-java-home=
ENV JAVA_HOME /usr/local/soft/jdk
ENV CATALINA_HOME /usr/local/soft/tomcat
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/apr/lib
ENV TZ Asia/Shanghai

#执行命令:创建目录
#RUN mkdir -p /usr/local/soft \
RUN	yum install -y net-tools \
	&& yum install -y vim \
	&& yum install -y gcc \
	&& yum install -y make \
	&& yum install -y expat-devel \
	&& cd /usr/local/soft/apr \
	&& ./configure --prefix=/usr/local/apr && make && make install \
	&& cd /usr/local/soft/apr-util \
	&& ./configure -prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=apr-iconv-1.2.2 && make && make install \
	&& cd /usr/local/soft/tomcat/bin/tomcat-native-1.2.16-src/native \	
	&& ./configure --with-apr=/usr/local/apr && make && make install 

#暴露8080端口
EXPOSE 8080

# 启动容器执行下面的命令
ENTRYPOINT /usr/local/soft/tomcat/bin/startup.sh && tail -f /dev/null

# 创建容器启动tomcat,由于ENTRYPOINT优先级比CMD高,所以这里的CMD不会执行
#CMD ["/home/tomcat/bin/startup.sh"]

最后的目录及文件结构如下:

[root@docker1 imagebuilder]# ll -a
total 32
drwxr-xr-x  6 root root 4096 Mar 14 13:20 .
drwxr-xr-x  4 root root 4096 Mar 14 12:54 ..
drwxr-xr-x  9 root root 4096 Mar 14 12:54 apache-tomcat-8.5.30
drwxr-xr-x 27 1001 1001 4096 Apr  2  2019 apr-1.7.0
drwxr-xr-x 21 1001 1001 4096 Mar 14 13:20 apr-util-1.6.1
-rw-r--r--  1 root root  202 Mar 14 13:09 .bashrc
-rw-r--r--  1 root root 1546 Mar 14 13:16 Dockerfile
drwxr-xr-x  7   10  143 4096 Oct  6  2018 jdk1.8.0_191

五、创建镜像

cd /anron/imagebuilder
docker build -t anron .

镜像创建成功后,查看镜像

[root@docker1 imagebuilder]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
anron               latest              2932b9aee9b9        4 minutes ago       884MB
centos              latest              470671670cac        8 weeks ago         237MB

六、创建容器

创建容器tomcat1,进入tomcat1查看tomcat的日志显示已经是APR模式了

docker run -p 8081:8080 -itd --name tomcat1 anron /bin/bash
docker exec -it tomcat1 /bin/bash
tail -f /usr/local/soft/tomcat/logs/catalina.out
14-Mar-2020 14:28:56.260 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version:        Apache Tomcat/8.5.30
14-Mar-2020 14:28:56.262 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Apr 3 2018 20:04:09 UTC
14-Mar-2020 14:28:56.262 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number:         8.5.30.0
14-Mar-2020 14:28:56.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
14-Mar-2020 14:28:56.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            3.10.0-957.21.3.el7.x86_64
14-Mar-2020 14:28:56.263 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
14-Mar-2020 14:28:56.265 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/soft/jdk/jre
14-Mar-2020 14:28:56.265 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_191-b12
14-Mar-2020 14:28:56.265 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
14-Mar-2020 14:28:56.265 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/soft/tomcat
14-Mar-2020 14:28:56.265 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/soft/tomcat
14-Mar-2020 14:28:56.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/soft/tomcat/conf/logging.properties
14-Mar-2020 14:28:56.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
14-Mar-2020 14:28:56.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xms2048M
14-Mar-2020 14:28:56.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmx2048M
14-Mar-2020 14:28:56.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:NewSize=512m
14-Mar-2020 14:28:56.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:MaxNewSize=512m
14-Mar-2020 14:28:56.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:MetaspaceSize=512m
14-Mar-2020 14:28:56.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:MaxMetaspaceSize=512m
14-Mar-2020 14:28:56.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.awt.headless=true
14-Mar-2020 14:28:56.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dfile.encoding=UTF-8
14-Mar-2020 14:28:56.266 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.security.egd=file:/dev/urandom
14-Mar-2020 14:28:56.267 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dhostname=fc1652a8ca07
14-Mar-2020 14:28:56.267 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
14-Mar-2020 14:28:56.267 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
14-Mar-2020 14:28:56.267 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0000
14-Mar-2020 14:28:56.267 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
14-Mar-2020 14:28:56.267 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/soft/tomcat
14-Mar-2020 14:28:56.267 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/soft/tomcat
14-Mar-2020 14:28:56.267 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/soft/tomcat/temp
14-Mar-2020 14:28:56.267 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded APR based Apache Tomcat Native library [1.2.16] using APR version [1.7.0].
14-Mar-2020 14:28:56.267 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
14-Mar-2020 14:28:56.267 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
14-Mar-2020 14:28:56.417 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-apr-8080"]
14-Mar-2020 14:28:56.428 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 559 ms
14-Mar-2020 14:28:56.454 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
14-Mar-2020 14:28:56.454 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.30
14-Mar-2020 14:28:56.466 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [/usr/local/soft/tomcat/webapps/ROOT]
14-Mar-2020 14:28:56.785 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web application directory [/usr/local/soft/tomcat/webapps/ROOT] has finished in [319] ms
14-Mar-2020 14:28:56.788 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
14-Mar-2020 14:28:56.800 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 371 ms
发布了5 篇原创文章 · 获赞 0 · 访问量 156

猜你喜欢

转载自blog.csdn.net/anron/article/details/104593701