Docker教程-3-Tomcat容器的安装配置使用

Posted 孔子-说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker教程-3-Tomcat容器的安装配置使用相关的知识,希望对你有一定的参考价值。

目录

1、环境检查

2、查看可用的 Tomcat 版本

3、下载所需版本的Tomcat镜像

4、创建 tomcat 容器

4.1 非挂载卷方式创建 tomcat 容器

4.2 挂载本地目录方式创建 tomcat 容器

4.3 挂载数据卷方式创建 tomcat 容器

5、查看指定容器的log

6、常见问题

6.1 docker容器与宿主日志时间不一致

6.2 docker容器无法使用vim命令


1、环境检查

首先检查服务器是否安装了Docker服务,通过docker -v 或 docker info 命令查看docker版本等相关信息,若不识别docker命令表示未安装Docker服务。

2、查看可用的 Tomcat 版本

访问 Tomcat 镜像库地址:https://hub.docker.com/_/tomcat?tab=tags 。可以通过 Sort by 查看其他版本的 Tomcat,默认是最新版本 tomcat:latest 。

通过Filter Tags搜索特定版本。

还可通过docker search tomcat 查找Docker Hub或其他Docker仓库中的tomcat可用版本镜像。

3、下载所需版本的Tomcat镜像

1)下载tomcat 9.0.54版本(jdk8)镜像

# 下载tomcat 9.0.54版本(jdk8)
docker pull tomcat:9.0.54-jdk8
 
# 不带版本号默认下载最新版本
docker pull tomcat

2)查看是否已下载tomcat 9.0.54版本镜像文件

docker images 查看系统中的镜像文件是否包含刚下载的tomcat镜像,可以看到tomcat 9.0.54版本已经下载到本地。

4、创建 tomcat 容器

4.1 非挂载卷方式创建 tomcat 容器

此种方式创建容器,当容器被删除掉时,容器里的数据将会丢失。

1)创建容器

docker run -it -p 8080:8080 --name tomcat9jdk8 -d tomcat:9.0.54-jdk8
  • –name  指定容器的名称为tomcat9jdk8
  • -p  将容器内的8080端口与本地8080接口映射,前者是本地访问端口,后者是容器内部端口
  • -d  后台运行容器,并返回容器ID
  • 命令最后的tomcat:9.0.54   运行指定的镜像创建容器
  • –restart=always 设置随服务启动而启动容器
  • 对于已经运行但没设置随docker服务的启动而启动容器的可以执行命令 docker update –restart=always 容器名

2)查看容器是否创建成功

通过docker ps 或 docker ps -al 命令可以查看到tomcat:9.0.54-jdk8容器已启动成功。

3)进入tomcat容器

# tomcat9jdk8 是容器名称,也可以用容器id指定
docker exec -it tomcat9jdk8 /bin/bash

4)更改webapps目录

# 将webapps 改为webapps2(随意名字) ,将webapps.dist  改为webapps

mv webapps webapps2
mv webapps.dist/ webapps

5)重启tomcat容器

docker restart tomcat9jdk8

6)测试

宿主机测试命令:curl http://localhost:8080

远程windows浏览器测试地址:http://ip:port

7)创建第二个容器

docker run -it -p 8081:8080 --name tomcat9jdk8-2 -d tomcat:9.0.54-jdk8

与第一个容器不同的地方有2点:

1是映射到本地的访问端口(8081)不同。
2是容器名称不同(tomcat9jdk8-2)。

4.2 挂载本地目录方式创建 tomcat 容器

1)创建tomcat目录用于存储tomcat数据

使用命令:mkdir /usr/local/docker/tomcat/tomcat9 创建目录。在该目录下接着创建3个目录:webapps、conf、logs,命令:mkdir webapps conf logs。

2)从未挂载数据卷的tomcat容器中拷贝webapps和conf配置文件

上一步直接在宿主机上创建webapps目录没有内容,如果直接访问肯定是报错的。所以从之前未挂载数据卷的tomcat容器中(或tomcat的tar解压包中),拷贝一份webapps 和 conf 配置文件,用于创建容器的数据挂载。

# 拷贝tomcat9jdk8容器下的webapps到宿主机目录
docker cp tomcat9jdk8:/usr/local/tomcat/webapps /usr/local/docker/tomcat/tomcat9/

# 拷贝tomcat9jdk8容器下的conf到宿主机目录
docker cp tomcat9jdk8:/usr/local/tomcat/conf /usr/local/docker/tomcat/tomcat9/

3)创建容器

docker run -it -p 8081:8080  \\
--name tomcat9jdk8-2 \\
--privileged=true \\
--restart=always \\
-v /usr/local/docker/tomcat/tomcat9/webapps:/usr/local/tomcat/webapps \\
-v /usr/local/docker/tomcat/tomcat9/conf:/usr/local/tomcat/conf \\
-v /usr/local/docker/tomcat/tomcat9/logs:/usr/local/tomcat/logs \\
-v /etc/localtime:/etc/localtime \\
-e TZ="Asia/Shanghai" \\
-d tomcat:9.0.54-jdk8
  • --name  指定容器的名称为tomcat9jdk8-2
  • --privileged=true  挂载文件权限设置,使容器内root拥有真正的root权限
  • --restart=always 设置随服务启动而启动容器
  • -p  将容器内的8081端口与本地8080接口映射,前者是本地访问端口,后者是容器内部端口
  • -v 挂载宿主目录到容器目录,格式为:主机(宿主)目录:容器目录
  • -v /usr/local/docker/tomcat/tomcat9/webapps:/usr/local/tomcat/webapps \\  挂载webapps
  • -v /usr/local/docker/tomcat/tomcat9/conf:/usr/local/tomcat/conf  \\   挂载配置文件
  • -v /usr/local/docker/tomcat/tomcat9/logs:/usr/local/tomcat/logs \\   挂载日志
  • -v /etc/localtime:/etc/localtime    容器时间与宿主机同步
  • -e  添加了一个环境变量TZ,指定容器时区,不指定的话mysql的时间函数执行结果会不正确
  • -d  后台运行容器,并返回容器ID
  • 命令最后的tomcat:9.0.54-jdk8,运行指定的镜像创建容器
  • 对于已经运行但没设置随docker服务的启动而启动容器的可以执行命令 docker update –restart=always 容器名

 --restart=always参数能够使我们在重启docker时,自动启动相关容器。Docker容器的重启策略如下:

  • no,默认策略,在容器退出时不重启容器
  • on-failure,在容器非正常退出时(退出状态非0),才会重启容器
  • on-failure:3,在容器非正常退出时重启容器,最多重启3次
  • always,在容器退出时总是重启容器
  • unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器

4)测试

宿主机测试命令:curl http://localhost:8081

远程windows浏览器测试地址:http://ip:port

4.3 挂载数据卷方式创建 tomcat 容器

1)创建3个数据卷并查看数据卷信息

# 创建3个数据卷:
docker volume create tomcat9-webapps
docker volume create tomcat9-conf
docker volume create tomcat9-logs
 
# 查看所有数据卷
docker volume ls
 
# 查看指定 数据卷 的信息
docker volume inspect tomcat9-webapps
 
# 删除数据卷
docker volume rm 卷名1 卷名2 … 删除一个或者多个数据卷
docker volume prune 删除所有未被使用的数据卷

# 如果不再使用自定义数据卷了,那么可以手动清理掉:
docker stop tomcat9 // 暂停容器实例
docker rm tomcat9 // 移除容器实例
docker volume rm tomcat9-webapps tomcat9-conf tomcat9-logs // 删除自定义数据卷

2)数据卷的挂载

我们在创建容器的时候要想好容器的哪些目录需要挂载数据卷!在创建容器时使用 --volume/-v或--mount 选项就可以挂载数据卷了。

方式一:使用-v创建自volume名称的容器: 若volume没有则自动创建

docker run -it -p 8082:8080  \\
--name tomcat9jdk8-3 \\
--privileged=true \\
--restart=always \\
-v tomcat9-webapps:/usr/local/tomcat/webapps \\
-v tomcat9-conf:/usr/local/tomcat/conf \\
-v tomcat9-logs:/usr/local/tomcat/logs \\
-v /etc/localtime:/etc/localtime \\
-e TZ="Asia/Shanghai" \\
-d tomcat:9.0.54-jdk8

测试:

使用curl http://localhost:8082 测试返回404,这是因为webapps和conf数据卷下面是空的。

复制文件到数据卷

# 查看数据卷信息
root@xnzysq20210118001:/opt/tomcat/apache-tomcat-9.0.54# docker volume inspect tomcat9-webapps
[
    {
        "CreatedAt": "2021-10-16T02:51:31Z",
        "Driver": "local",
        "Labels": null,
# 数据卷的实际存储目录
        "Mountpoint": "/var/lib/docker/volumes/tomcat9-webapps/_data",
        "Name": "tomcat9-webapps",
        "Options": null,
        "Scope": "local"
    }
]

# 查看实际存储目录
root@xnzysq20210118001:/opt/tomcat/apache-tomcat-9.0.54# ls /var/lib/docker/volumes/tomcat9-webapps/_data

# 拷贝宿主机目录/opt/tomcat/apache-tomcat-9.0.54/webapps下的所有文件到数据卷tomcat9-webapps的实际存储目录
root@xnzysq20210118001:~# cp -r /opt/tomcat/apache-tomcat-9.0.54/webapps/ /var/lib/docker/volumes/tomcat9-webapps/_data

# 查看tomcat9-webapps的实际存储目录
root@xnzysq20210118001:~# ls /var/lib/docker/volumes/tomcat9-webapps/_data
ROOT  docs  examples  host-manager  manager

# 拷贝宿主机目录/opt/tomcat/apache-tomcat-9.0.54/conf下的所有文件到数据卷tomcat9-conf的实际存储目录
root@xnzysq20210118001:~# cp -r /opt/tomcat/apache-tomcat-9.0.54/conf/ /var/lib/docker/volumes/tomcat9-conf/_data

# 查看tomcat9-conf的实际存储目录
root@xnzysq20210118001:~# ls /var/lib/docker/volumes/tomcat9-conf/_data
Catalina         catalina.properties  context.xml           jaspic-providers.xsd  server.xml        tomcat-users.xsd
catalina.policy  conf                 jaspic-providers.xml  logging.properties    tomcat-users.xml  web.xml

# 重启tomcat9jdk8-3容器
root@xnzysq20210118001:~# docker restart tomcat9jdk8-3
tomcat9jdk8-3
# 测试8082服务
root@xnzysq20210118001:~# curl http://localhost:8082


<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Apache Tomcat/9.0.54</title>
        <link href="favicon.ico" rel="icon" type="image/x-icon" />
        <link href="tomcat.css" rel="stylesheet" type="text/css" />
    </head>

    <body>
        <div id="wrapper">
            <div id="navigation" class="curved container">
                <span id="nav-home"><a href="https://tomcat.apache.org/">Home</a></span>
                <span id="nav-hosts"><a href="/docs/">Documentation</a></span>
                <span id="nav-config"><a href="/docs/config/">Configuration</a></span>
                <span id="nav-examples"><a href="/examples/">Examples</a></span>
                <span id="nav-wiki"><a href="https://wiki.apache.org/tomcat/FrontPage">Wiki</a></span>
                <span id="nav-lists"><a href="https://tomcat.apache.org/lists.html">Mailing Lists</a></span>
                <span id="nav-help"><a href="https://tomcat.apache.org/findhelp.html">Find Help</a></span>
                <br class="separator" />
            </div>
......

方式二:使用--mount创建自volume名称的容器: :若volume没有创建失败

参数--mount默认情况下用来挂载volume,但也可以用来创建bind mount和tmpfs。如果不指定type选项,则默认为挂载volume,volume是一种更为灵活的数据管理方式,volume可以通过docker volume命令集被管理。

docker run -it -p 8083:8080  \\
--name tomcat9jdk8-4 \\
--privileged=true \\
--restart=always \\
--mount source=tomcat9-webapps, destination=/usr/local/tomcat/webapps,readonly \\
--mount source=tomcat9-conf, destination=/usr/local/tomcat/conf,readonly \\
--mount source=tomcat9-logs, destination=/usr/local/tomcat/logs \\
-v /etc/localtime:/etc/localtime \\
-e TZ="Asia/Shanghai" \\
-d tomcat:9.0.54-jdk8
  • 挂载volume命令格式:[type=volume,]source=my-volume,destination=/path/in/container[,...]
  • 创建bind mount命令格式:type=bind,source=/path/on/host,destination=/path/in/container[,...]
  • 如果创建bind mount并指定source,则必须是绝对路径,且路径必须已经存在
  • 示例中readonly表示只读

5、查看指定容器的log

# 查看指定容器的日志:docker logs -f 容器id或容器名称
docker logs -f tomcat9jdk8

6、常见问题

6.1 docker容器与宿主日志时间不一致

部署web项目后也许会出现docker容器与宿主、docker 容器与tomcat 应用打印日志时间和我们当前时间相差8个小时,可以添加如下配置:

①启动容器时,将系统时间挂载到容器内,可以解决docker容器与宿主时间不一致问题,添加参数:

-v /etc/localtime:/etc/localtime:ro

完整命令如下示例:

sudo docker run -d --name button-api -p 8080:8080 -v /etc/localtime:/etc/localtime:ro button-api:v1

②docker 容器与tomcat 应用打印日志时间不一致

启动tomcat容器后进入tomcat的"bin"目录,修改catalina.sh文件,在注释结束的第一行添加如下内容:

JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF8  -Duser.timezone=GMT+08"

如下图所示:

修改保存后重启docker容器就可以了。

6.2 docker容器无法使用vim命令

进入docker容器后,想对某些参数进行修改时,一般需要安装文本编辑器,以vim为例:

使用命令 apt-get update 同步更新索引,等更新完毕以后再敲命令:apt-get install vim命令即可。

  • apt-get update命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。
  • apt-get install vim 是安装vim包。

由于下载地址是海外地址,下载速度非常慢而且可能出现中断,如果感觉太慢可以更改如下配置:

# 备份/etc/apt/sources.list文件
mv /etc/apt/sources.list /etc/apt/sources.list.bak

# 创建新的/etc/apt/sources.list文件并输入以下内容
echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >/etc/apt/sources.list
echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list
echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list

以上是关于Docker教程-3-Tomcat容器的安装配置使用的主要内容,如果未能解决你的问题,请参考以下文章

Docker教程-3-Tomcat容器的安装配置使用

Linux下的docker容器安装教程

Docker教程-2-MySql容器的安装配置使用

Docker教程-2-MySql容器的安装配置使用

Docker教程-2-MySql容器的安装配置使用

Docker教程-4-Redis容器的安装配置使用