CentOS 安装 Docker 请参考: CentOS Docker 安装
一、Docker 安装 Tomcat
- tomcat 镜像中已经集成依赖了 jre,做到了开箱即用
1、搜索 Tomcat 镜像
docker search tomcat
root@VM-0-15-debian:~# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementati… 1905 [OK]
tomee Apache TomEE is an all-Apache Java EE certif… 51 [OK]
dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 base… 49 [OK]
davidcaste/alpine-tomcat Apache Tomcat 7/8 using Oracle Java 7/8 with… 26 [OK]
bitnami/tomcat Bitnami Tomcat Docker Image 17 [OK]
consol/tomcat-7.0 Tomcat 7.0.57, 8080, "admin/admin" 16 [OK]
cloudesire/tomcat Tomcat server, 6/7/8 15 [OK]
tutum/tomcat Base docker image to run a Tomcat applicatio… 10
meirwa/spring-boot-tomcat-mysql-app a sample spring-boot app using tomcat and My… 9 [OK]
jeanblanchard/tomcat Minimal Docker image with Apache Tomcat 8
aallam/tomcat-mysql Debian, Oracle JDK, Tomcat & MySQL 7 [OK]
rightctrl/tomcat CentOS , Oracle Java, tomcat application ssl… 3 [OK]
amd64/tomcat Apache Tomcat is an open source implementati… 2
maluuba/tomcat7-java8 Tomcat7 with java8. 2
fabric8/tomcat-8 Fabric8 Tomcat 8 Image 2 [OK]
camptocamp/tomcat-logback Docker image for tomcat with logback integra… 1 [OK]
99taxis/tomcat7 Tomcat7 1 [OK]
primetoninc/tomcat Apache tomcat 8.5, 8.0, 7.0 1 [OK]
swisstopo/service-print-tomcat backend tomcat for service-print "the true, … 0
jelastic/tomcat 0
oobsri/tomcat8 Testing CI Jobs with different names. 0
s390x/tomcat Apache Tomcat is an open source implementati… 0
picoded/tomcat7 tomcat7 with jre8 and MANAGER_USER / MANAGER… 0 [OK]
trollin/tomcat 0
awscory/tomcat tomcat
我们选择下载来自官方的镜像 starts 最高的那个
docker pull tomcat
二、查看安装的镜像
docker images
可以看到我们本机已经下载好了 tomcat
root@VM-0-15-debian:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest df50c9d355cf 5 days ago 463MB
三、启动 Tomcat
相关参数:
- -i:表示以“交互模式”运行容器
- -t:表示容器启动后会进入其命令行
- -d:表示以“守护模式”执行/root/run.sh脚本,此时 tomcat 控制台不会出现在输出终端上,也不会关闭ssh连接容器就终止运行
- -p:表示宿主机与容器的端口映射,此时将容器内部的 8080 端口映射为宿主机的 8080 端口,这样就向外界暴露了 8080 端口,可通过 docker 网桥来访问容器内部的 8080 端口了
- -v:表示需要将本地哪个目录挂载到容器中,格式:-v <宿主机目录>:<容器目录>
- --name:表示容器名称,自定义名称
# 无守护进程方式启动,此时会将tomcat控制台输出到终端, ctrl+c 就能终止容器运行
docker run -p 8080:8080 tomcat
# 守护进程方式启动
docker run -d -p 8080:8080 tomcat
# 守护进程方式启动,且自定义容器名称
docker run -d --name mytomcat \
-p 8080:8080 tomcat
# 挂载方式启动
# 将本机war包 /usr/local/auth.war 挂载到容器的 /usr/local/tomcat/webapps/auth.war
docker run -p 8080:8080 \
-v /usr/local/auto.war:/usr/local/tomcat/webapps/auth.war \
-d tomcat
供参考:一种我喜欢的启动方式
当然聪明人肯定不会自己每次都在启动的时候加这些配置,能在基础镜像里面搞最好咯!
1).将系统时区挂载容器内,保证日志打印时间一致
2).将日志挂载到宿主机,方便查看日志
docker run --name tomcat-auth \
-p 8080:8080 \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime:ro \
-v /usr/local/tomcat-auth/logs:/usr/local/tomcat/logs \
-d ryaning/tomcat:8-jre8
附:
上述方法用在平时测试还是可以的,生产环境还是建议使用官网推荐的方式,编写Dockerfile:将war包和镜像打包成新的镜像
在当前目录下新建 Dockerfile 文件
# 创建 Dockerfile
touch Dockerfile
# 编辑 Dockerfile
vi Dockerfile
内容如下:
# 你的tomcat的镜像
FROM tomcat:latest
# 作者
MAINTAINER example@example.com
# 拷贝war包放置到tomcat的webapps目录下
COPY auth.war /usr/local/tomcat/webapps
生成新镜像
# 根据当前目录下(.)的Dockerfile文件生成名为:tomcat-auth,且版本号为:v1.0.0的镜像
docker build -t tomcat-auth:v1.0.0 .
root@VM-0-15-debian:/usr/local# docker build -t tomcat-auth:v1.0.0 .
Sending build context to Docker daemon 65.83MB
Step 1/3 : FROM tomcat:latest
---> df50c9d355cf
Step 2/3 : MAINTAINER example@example.com
---> Running in a16c8f61b4dc
Removing intermediate container a16c8f61b4dc
---> 95eb8a583a64
Step 3/3 : COPY auth.war /usr/local/tomcat/webapps
---> b48f931ab49a
Successfully built b48f931ab49a
Successfully tagged tomcat-auth:v1.0.0
root@VM-0-15-debian:/usr/local#
接着我们就可以启动新镜像了
docker run -p 8080:8080 \
-d tomcat-auth:v1.0.0
- 注意:
auth.war
和Dockerfile
在同一目录下
常用命令
- 查询镜像
root@VM-0-15-debian:/usr/local# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-auth v1.0.0 b48f931ab49a 10 minutes ago 493MB
tomcat latest df50c9d355cf 6 days ago 463MB
root@VM-0-15-debian:/usr/local#
- 查询容器
root@VM-0-15-debian:/usr/local# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b744be08cf96 tomcat "catalina.sh run" 7 minutes ago Exited (143) 2 minutes ago eager_mahavira
03a000bcee7b tomcat-auth:v1.0.0 "catalina.sh run" 15 minutes ago Exited (143) 8 minutes ago competent_dubinsky
- 进入容器
# 进入正在运行的容器内部(b744be08cf96 为正在运行的 容器ID)
docker exec -it b744be08cf96 /bin/bash
# 进入正在运行的容器内部(tomcat-auth 为正在运行的 容器名称 NAMES)
docker exec -it tomcat-auth /bin/bash
# 查看正在运行的容器
root@VM-0-15-debian:/usr/local# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b744be08cf96 tomcat-auth:v1.0.0 "catalina.sh run" 7 seconds ago Up 6 seconds 0.0.0.0:8080->8080/tcp tomcat-auth
# 进入tomcat容器内
root@VM-0-15-debian:/usr/local# docker exec -it tomcat-auth /bin/bash
root@b744be08cf96:/usr/local/tomcat#
- 删除容器
# 根据 容器ID 删除容器
docker rm 03a000bcee7b
# 根据 容器名称 删除容器
docker rm tomcat-auth
root@VM-0-15-debian:/usr/local# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b744be08cf96 tomcat "catalina.sh run" 7 minutes ago Exited (143) 2 minutes ago eager_mahavira
03a000bcee7b tomcat-auth:v1.0.0 "catalina.sh run" 15 minutes ago Exited (143) 8 minutes ago tomcat-auth
root@VM-0-15-debian:/usr/local# docker stop tomcat-auth
tomcat-auth
root@VM-0-15-debian:/usr/local# docker rm tomcat-auth
tomcat-auth
root@VM-0-15-debian:/usr/local#
注:删除前需要保证容器是停止的
- 删除镜像
# 根据 镜像ID 删除镜像
docker rmi df50c9d355cf
root@VM-0-15-debian:/usr/local# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-auth v1.0.0 b48f931ab49a 26 minutes ago 493MB
tomcat latest df50c9d355cf 6 days ago 463MB
tomcat 8.0-jre8 361d9e51a0d1 6 days ago 463MB
root@VM-0-15-debian:/usr/local# docker rmi 361d9e51a0d1
Untagged: tomcat:8.0-jre8
Untagged: tomcat@sha256:0d4c72622f7b0a38591c1d6e84ebfd8a95503601a753490e914e46f8fec5256b
Deleted: sha256:361d9e51a0d117e6203161c5451fe880020eaa29eee7699c7010bd9202f92d52
Deleted: sha256:e48eb44036a317366fe5bceab444ea9395a81557970d3a82a1d103e73e4efb61
Deleted: sha256:a1ac7751afab6a1927a8248c5425c7ce694b4ab0edf8875c383416c1b2497b32
root@VM-0-15-debian:/usr/local#
注:
- 删除前需要保证容器是停止的
- 需要注意删除镜像和容器的命令不一样,docker rmi ID,其中 容器(rm) 和 镜像(rmi)
顺序需要先删除容器
宿主机拷贝
# 使用 cp 命令完成和宿主机的文件拷贝
# 将宿主机 /usr/local/auth.war 拷贝到容器的 /usr/local/tomcat/webapps下
docker cp /usr/local/auth.war b744be08cf96:/usr/local/tomcat/webapps
# 将容器 /usr/local/tomcat/webapps 拷贝到宿主机的 /usr/local/下
docker cp b744be08cf96:/usr/local/tomcat/webapps /usr/local/tomcat/
- 导出镜像
# 根据 镜像ID/名称 导入
docker save tomcat-auth > /home/tomcat-auth.tar
root@VM-0-15-debian:/usr/local# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat-auth v1.0.0 b48f931ab49a 30 minutes ago 493MB
tomcat latest df50c9d355cf 6 days ago 463MB
root@VM-0-15-debian:/usr/local# docker save tomcat-auth > /home/tomcat-auth.tar
root@VM-0-15-debian:/usr/local#
- 导入镜像
# 将tomcat-auth 导入
docker load < /home/tomcat-auth.tar
root@VM-0-15-debian:/home# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest df50c9d355cf 6 days ago 463MB
root@VM-0-15-debian:/home# docker load < /home/tomcat-auth.tar
b832d75f420e: Loading layer [==================================================>] 30.35MB/30.35MB
Loaded image: tomcat-auth:v1.0.0
root@VM-0-15-debian:/home#
注意
1、Tomcat应用日志时间和容器时间不一致解决办法
原因:
1).docker容器和系统时间不一致是因为docker容器的原生时区为0时区,而国内系统为东八区
2).容器中运行的java应用打出的日志时间和通过date -R方式获取的容器标准时间有八个小时时间差
解决:
方法一
启动的时候增加环境变量及时区配置
- 环境变量 Asia/Shanghai就是我所需要的时区
- 宿主机器上的时区默认覆盖容器内的时区配置文件
docker run --name tomcat \
-p 8800:8080 \
-e TZ="Asia/Shanghai" \
-v /etc/localtime:/etc/localtime \
-d tomcat
方法二
1).docker启动容器时,为了保证容器时区和系统时区相同,需要挂载系统时间到容器内
# ro表示只读
-v /etc/localtime:/etc/localtime:ro
2).在tomcat/bin/catalina.sh文件中修改tomcat JAVA_OPTS,添加如下内容
JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"
启动容器
docker run --name tomcat \
-p 8800:8080 \
-v /etc/localtime:/etc/localtime \
-d tomcat