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

How to run Tomcat 8 and MySQL in single Docker container

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

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

我解决了这个问题并发布了我的发现,以防它帮助其他有类似问题的人。

简短回答:运行 multiple services (tomcat / mysql) in a single container is not recommended. Yes, there is supervisor.d, etc. But this is discouraged. There is also baseimage-docker 如果您致力于在一个容器中提供多项服务。

这个答案的其余部分显示了我是如何让它发挥作用的,如果你真的下定决心...

不幸的是,Ubuntu 16.04 上的 Tomcat 8 发行版仅配置为 运行 作为服务(详见下文)。 运行 在 docker 容器中设置服务的问题在堆栈交换的许多帖子中都有很好的记录(不鼓励)。通过在 "service tomcat8 start" 命令末尾添加 "tail -f /var/log/tomcat8/catalina.out" 并使用“--cap-add SYS_PTRACE”选项。

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

start tomcat8 的推荐方法是使用 /usr/share/tomcat8/bin 中的命令。但是distro版本的softlinks不正确导致服务器无法start.

使用命令 ./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.

发行版将 tomcat8 拆分为 /usr/share/tomcat8/var/lib/tomcat8,将 bin 文件(catalina.shstartup.sh)与 configlogs 软 links 在 /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.sh 中将 CATALINA_BASE 显式设置为 /var/lib/tomcat8 解决了将 ./catalina.sh run 用于 start tomcat 的问题。过去,我在 /usr/share/tomcat8 目录下将 soft links 添加到 conflogswork,以便它可以找到这些文件和 s tar使用 catalina.sh run 命令正确安装。

顺便说一句,即使认为 JRE_HOME 在上面的 version.sh 转储中显然是错误的,服务也会正确执行 tart(当我附加 tail -f 命令时如前所述)。当我手动将正确的 CATALINA_BASE 变量添加到 catalina.sh 时,它也会使用 catalina.sh run starts。所以我没有花时间研究为什么列出不正确。

最后,我明白了三件事:

  1. 运行 multiple services (tomcat / mysql) in a single container is not recommended. Yes, there is supervisor.d, etc. But this is discouraged. There is also baseimage-docker 如果您致力于在一个容器中提供多个服务。
  2. 即使 运行 不建议在容器中使用单个服务,但有记录的方法可以使其工作(我通过将 && tail -f ... 添加到 tomcat8 CMD 结束)。
  3. 在 Ubuntu 16.04(未测试其他发行版)中,要将 tomcat8 运行 作为命令(而非服务),您需要: a) 获取 Tomcat 8 的 tar 文件并安装它,因为它将所有文件放在一个目录下,因此没有软 link 问题。或者,b) 如果您坚持使用来自 apt-get 的发行版 tomcat8,b.1) 您需要通过添加 CATALINA_BASE 和复制来修改 catalina.sh 的版本它到正确的安装目录或 b.2) 添加软件 links.