1. 下载tomcat
- 登录docker平台,查找可以下载的版本号:https://hub.docker.com/search/?type=image
- 里面有好多版本,我下载的是9.0.46-jdk8版本;
- 执行命令下载并运行:
命令:docker run -it -p 80:8080 --name tomcat01 tomcat:9.0.46-jdk8
说明:因为默认tomcat使用的是8080端口,因此将宿主机的80端口和docker的8080做映射关系;
# 程序开始下载,这个过程省略;
quxianglin@quxianglin-PC:~$ docker run -it -p 80:8080 --name tomcat01 tomcat:9.0.46-jdk8
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/openjdk-8
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:
01-Jun-2021 03:34:42.020 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name: Apache Tomcat/9.0.46
01-Jun-2021 03:34:42.021 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: May 8 2021 17:35:52 UTC
01-Jun-2021 03:34:42.022 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.46.0
01-Jun-2021 03:34:42.022 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux
...
01-Jun-2021 03:34:42.238 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
01-Jun-2021 03:34:42.282 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [381] milliseconds
01-Jun-2021 03:34:42.313 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
01-Jun-2021 03:34:42.314 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/9.0.46]
01-Jun-2021 03:34:42.331 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
01-Jun-2021 03:34:42.354 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [71] milliseconds
# 上面截取了一部分数据,最终会看到熟悉的打印内容;
- 在宿主机的浏览器里输入:http://localhost,会发现:啥都没有,不过说明,tomcat已经启动成功了,并且80端口已经绑定了;
2. 退出系统
- 这时候就停止运行了,当我们再次在浏览器访问地址时,提示连接失败:
命令:Ctrl+C
连接失败原因:因为启动时参数设置,没有让tomcat在后台运行,命令中添加-d即可,全命令如下:
docker run -itd -p 80:8080 --name tomcat01 tomcat:9.0.46-jdk8
但是直接执行应该还会报错,因为80端口映射已经被绑定,已经有了一个tomcat01别名,因此可以删除容器,然后再次运行,或者换一组端口号和别名;
删除容器命令:docker rm tomcat01
01-Jun-2021 03:43:26.415 INFO [Thread-4] org.apache.coyote.AbstractProtocol.pause Pausing ProtocolHandler ["http-nio-8080"]
01-Jun-2021 03:43:26.423 INFO [Thread-4] org.apache.catalina.core.StandardService.stopInternal Stopping service [Catalina]
01-Jun-2021 03:43:26.424 INFO [Thread-4] org.apache.coyote.AbstractProtocol.stop Stopping ProtocolHandler ["http-nio-8080"]
01-Jun-2021 03:43:26.469 INFO [Thread-4] org.apache.coyote.AbstractProtocol.destroy Destroying ProtocolHandler ["http-nio-8080"]
3. 调试系统
在上一步留了一个问题:启动后没有出现熟悉的界面,怎么回事?
- 重启tomcat容器:
命令:docker start tomcat01
不能再用docker run命令了,这个命令是创建新的容器的;
- 进入容器,排查错误:
命令:docker exec -it tomcat01 /bin/bash
quxianglin@quxianglin-PC:~$ docker exec -it tomcat01 /bin/bash
root@88b1abe46a17:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@88b1abe46a17:/usr/local/tomcat# cd webapps ##进入到webapps
root@88b1abe46a17:/usr/local/tomcat/webapps# ls
root@88b1abe46a17:/usr/local/tomcat/webapps# ##发现里面都是空的,啥都没有
root@88b1abe46a17:/usr/local/tomcat/webapps# cd .. ##重新退出来,返回上一级目录
root@88b1abe46a17:/usr/local/tomcat# cd webapps.dist ##不过我们发现了webapps.dist目录,我们进去看看
root@88b1abe46a17:/usr/local/tomcat/webapps.dist# ls ##果然,啥都有,所有的默认页面都在这里面
ROOT docs examples host-manager manager
root@88b1abe46a17:/usr/local/tomcat/webapps.dist#
root@88b1abe46a17:/usr/local/tomcat/webapps.dist# cd .. ##退出,返回到上一级
root@88b1abe46a17:/usr/local/tomcat# cp -r webapps.dist/\* webapps ##\*是转义字符:拷贝webapps.dist下面的所有文件到webapps下面
root@88b1abe46a17:/usr/local/tomcat# cd webapps
root@88b1abe46a17:/usr/local/tomcat/webapps# ls ##查看结果
ROOT docs examples host-manager manager
root@88b1abe46a17:/usr/local/tomcat/webapps#
- 使用ls命令可以看到tomcat里面的内容,文件和文件夹跟我们实际安装的一模一样,就是多了一个webapps.dist;
- 使用命令cd webapps进去看看,哇,真空,啥都没有,所以在浏览器会啥都没有;
- 我们进去webapps.dist看看,发现默认的页面都在这里,我们可以把里面的内容复制到webapp里面;
命令:root@3f3c2a38a0ca:/usr/local/tomcat# cp -r webapps.dist/* webapps- 查看结果:
4. 退出系统
- 返回到/usr/local/tomcat目录下执行Ctrl+C,或者直接在webapps页面执行exit退出;
- 不影响页面访问;
5. 问题:
- 怎么将docker 容器中的文件/文件夹拷贝到宿主机电脑?
## 将tomcat下的webapps文件夹拷贝到 宿主机D盘下的dockercopyfiles
## 前提我已经将webapps.dist下的文件拷贝到webapps下了;
$ docker cp tomcat01:/usr/local/tomcat/webapps d:/dockercopyfiles
效果如下:
- 怎么将项目放到tomcat中,如果tonmcat容器不小心被删除了,项目怎么保留下来?
第一个问题:怎么将文件从宿主机拷贝到容器?
## 将 宿主机D:/dockercopyfiles/test.java 拷贝到tomcat下的webapps文件夹内;
##
$ docker cp d:/dockercopyfiles/test.java tomcat01:/usr/local/tomcat/webapps
$ docker exec -it tomcat01 /bin/bash ## 进入项目
root@5d7dd5dff52c:/usr/local/tomcat# ls ## 查看列表
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@5d7dd5dff52c:/usr/local/tomcat# cd webapps ## 进入到webapps文件夹
root@5d7dd5dff52c:/usr/local/tomcat/webapps# ls ## 查看列表里面已经有test.java文件了
ROOT docs examples host-manager manager test.java
效果如下:
使用卷命令,可以打通容器内和容器外的目录,这是一种同步方案,将数据同步到容器外的目录;
- 将程序和数据分开?怎么实现?
- 怎么制作自己的镜像?
6. 遇到的问题:
> \\\"/mnt/sda1/var/lib/docker/overlay2/fe77399e127bcfe161d43d787c4bd4ef398fbd2473791b2fed90498c44e999aa/merged/usr/local/tomcat/conf/server.xml\\\" caused \\\"not a directory\\\"\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type.
重点是这句话:Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
原因是:在第一次就配置文件夹的映射关系,导致在宿主机上没有配置文件,系统默认会在宿主机上创建一个同名文件夹,就出现了这个错误,解决方法是,提前在宿主机创建好配置文件,然后再做卷映射,就可以了;
7. 所有命令
- 需要先生成一个容器,将需要和程序分离的数据文件和配置文件(文件夹)拷贝到宿主机
docker run -d -p 8080:8080 --name tomcat01 tomcat:9.0.46-jdk8
docker cp tomcat01:/usr/local/tomcat/conf /usr/local/docker/tomcat01/conf
docker cp tomcat01:/usr/local/tomcat/webapps /usr/local/docker/tomcat01/webapps
- 删除刚刚创建的容器,再重新创建一个容器,添加映射关系的配置
docker rm -f tomcat01
docker run -d -p 8080:8080 -v /usr/local/docker/tomcat01/conf:/usr/local/tomcat/conf -v /usr/local/docker/tomcat01/webapps:/usr/local/tomcat/webapps --name tomcat01 tomcat:9.0.46-jdk8