目录
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">
<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