如何在单个Docker容器中运行Tomcat 8和MySQL

时间:2018-03-10 14:33:13

标签: docker ubuntu-16.04 tomcat8

我想在docker容器中运行Tomcat 8 / MySQL应用程序。我今天在测试和生产中运行Ubuntu 16.04,并且想要使用Ubuntu 16.04"最新的"作为我的docker文件的基础FROM,并从那里添加Tomcat 8和MySQL。

我知道我可以从https://hub.docker.com/_/tomcat/获得一个Tomcat 8 docker文件作为我的基础,但我没有看到那些Ubuntu基础操作系统,我希望与Ubuntu保持一致。此外,将MySQL添加到Tomcat容器似乎很奇怪。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题并发布了我的调查结果,以防其他人遇到类似问题。

简短回答:不建议在单个容器中运行multiple services(tomcat / mysql)。是的,有supervisor.d等等。但这是不鼓励的。如果您致力于在一个容器中提供多个服务,那么还有baseimage-docker

这个答案的其余部分显示了如果你真的有决心我是如何运作的......

不幸的是,Ubuntu 16.04上的Tomcat 8发行版仅配置为作为服务运行(详见下文)。在堆栈交换中的许多帖子中都很好地记录了在docker容器中运行服务的问题(不鼓励这样做)。通过添加" tail -f /var/log/tomcat8/catalina.out",我能够将tomcat 8作为服务工作。到了#34;服务tomcat8 start"命令并使用" - cap-add SYS_PTRACE"启动容器。选项。

CMD service tomcat8 start && tail -f /var/log/tomcat8/catalina.out

启动tomcat8的推荐方法是使用/usr/share/tomcat8/bin中的命令。但是,发行版的软链接不正确,服务器无法启动。

使用命令./catalina.sh run./startup.sh都会产生错误,例如:

SEVERE: Cannot find specified temporary folder at /usr/share/tomcat8/temp   
WARNING: Unable to load server configuration from [/usr/share/tomcat8/conf/server.xml]
SEVERE: Cannot start server. Server instance is not configured.

发行版在/usr/share/tomcat8/var/lib/tomcat8之间拆分tomcat8,它将bin文件(catalina.shstartup.sh)与configlogs分隔开来/var/lib/tomcat8中的软链接。这使得这些命令失败。

/usr/share/tomcat8中的文件:

root@85d5fe47b66a:/usr/share/tomcat8# ls -la
total 32
drwxr-xr-x   4 root root 4096 Mar  9 22:18 .
drwxr-xr-x 117 root root 4096 Mar  9 23:29 ..
drwxr-xr-x   2 root root 4096 Mar  9 22:18 bin
-rw-r--r--   1 root root   39 Mar 31  2017 defaults.md5sum
-rw-r--r--   1 root root 1929 Apr 10  2017 defaults.template
drwxr-xr-x   2 root root 4096 Mar  9 22:18 lib
-rw-r--r--   1 root root   53 Mar 31  2017 logrotate.md5sum
-rw-r--r--   1 root root  118 Apr 10  2017 logrotate.template

/var/lib/tomcat8中的文件:

root@85d5fe47b66a:/var/lib/tomcat8# ls -la
total 16
drwxr-xr-x  4 root    root    4096 Mar  9 22:18 .
drwxr-xr-x 41 root    root    4096 Mar  9 23:29 ..
lrwxrwxrwx  1 root    root      12 Sep 28 14:43 conf -> /etc/tomcat8
drwxr-xr-x  2 tomcat8 tomcat8 4096 Sep 28 14:42 lib
lrwxrwxrwx  1 root    root      17 Sep 28 14:43 logs -> ../../log/tomcat8
drwxrwxr-x  3 tomcat8 tomcat8 4096 Mar  9 22:18 webapps
lrwxrwxrwx  1 root    root      19 Sep 28 14:43 work -> ../../cache/tomcat8

正在运行./version.sh表明CATALINA_BASECATALINA_HOME都设置为/usr/share/tomcat8

Using CATALINA_BASE:   /usr/share/tomcat8
Using CATALINA_HOME:   /usr/share/tomcat8
Using CATALINA_TMPDIR: /usr/share/tomcat8/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/share/tomcat8/bin/bootstrap.jar:/usr/share/tomcat8/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.32 (Ubuntu)
Server built:   Sep 27 2017 21:23:18 UTC
Server number:  8.0.32.0
OS Name:        Linux
OS Version:     4.4.0-116-generic
Architecture:   amd64
JVM Version:    1.8.0_161-b12
JVM Vendor:     Oracle Corporation

CATALINA_BASE明确设置为/var/lib/tomcat8 catalina.sh解决了使用./catalina.sh run启动tomcat的问题。在过去,我已经在conf目录下添加了logswork/usr/share/tomcat8的软链接,以便它可以找到这些文件并使用{ {1}}命令。

顺便说一下,即使上面的catalina.sh run转储中JRE_HOME显然是错误的,服务也会正确启动(当我附加前面描述的version.sh命令时)。当我手动将正确的tail -f变量添加到catalina.sh run时,它也会开始使用CATALINA_BASE。所以我花了很长时间来研究为什么错误地列出来了。

最后,我意识到三件事:

  1. 不建议在单个容器中运行multiple services(tomcat / mysql)。是的,有supervisor.d等等。但这是不鼓励的。如果您在一个容器中提交多个服务,还有baseimage-docker
  2. 建议不要在容器中运行单个服务,但有记录的方法可以使它工作(我通过将catalina.sh添加到CMD的末尾来为tomcat8做了这样的事情。)
  3. 在Ubuntu 16.04(没有测试其他发行版)中,要使tomcat8作为命令(不是服务)运行,您需要: a)获取Tomcat 8的tar文件并安装它,因为它将所有文件放在一个目录下,因此没有软链接问题。或者,b)如果您坚持使用apt-get,b.1)中的发行版tomcat8,则需要通过添加&& tail -f ...来修改catalina.sh的版本并将其复制到正确的安装目录或b.2)添加软链接。