ubuntu下搭建docker 部署tomcat 发布springboot war包 实现过程及问题记录
1.ubuntu下搭建docker
1.1 安装docker
为确保运行的不是旧版Docker
sudo apt-get remove docker docker-engine docker.io
添加Docker COmmunity Edition 所需的软件依赖和apt仓库,确保包有正确的签名
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
安装Docker
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install docker-ce
注意以上步骤需要在服务器可以访问外网的情况下, 才能正确执行!
设置在每次引导系统时启动Docker服务器
sudo systemctl enable docker
2 sudo systemctl start docker
1.2 查看docker服务状态
$ systemctl status docker
看到如上界面就表示, docker已经搭建完成了, 也运行起来了
是不是觉得有点太容易了, 没错 , 就是这么简单
若未启动,则启动docker服务
$ sudo systemctl start docker
1.3 测试运行经典的hello world
$ sudo docker run hello-world
1.4 设置docker开机启动
sudo systemctl enable docker
1.5 关闭docker
systemctl stop docker
2.docker下 搭建tomcat
2.1 提示报错Permission denied
Permission denied
这是权限不够的问题,需要为操作的目录添加权限(具体到文件也是可以的)
sudo chmod -R 777 目录路径
# 例如将tomcat下所有文件和文件夹都添加权限
sudo chmod -R /usr/local/tomcat/
2.4 安装tomcat
docker pull tomcat:标签
如果标签不配置的话, 默认是latest, 此时简写为
docker pull tomcat
查看tomcat容器
docker ps -a
-a
参数是查看所有容器, 如果不加-a
的话, 则查看运行中的容器, 可以看到容器的id(CONTAINER ID), 通过id可以对容器进行很多操作, 下面一一列举
启动容器
docker start 容器id
停止运行中的容器
docker stop 容器id
删除容器
docker rm 容器id
2.3 部署war包
进入到war包所在目录下, 运行如下命令, 命令格式为:
docker cp war包路径 容器id:/usr/local/tomcat/webapps
docker cp logstash.war bf4e103f6448 :/usr/local/tomcat/webapps
2.4 启动tomcat容器
docker run -d -p 8888:8080 --name='tomcat1' tomcat
参数说明
-d:表示后台运行
-p:表示端口映射,这里的8888是docker的端口,8080是tomcat端口, 访问时需要访问8888, 然后映射到tomcat的8080端口
–name:表示给容器指定一个别名
最后的tomcat是容器名称
启动完成之后, 就发现会报错了
2.5 报错
2.5.1 访问tomcat首页404
tomcat启动之后, 访问ip:8888地址时, 发现报错404, 正常tomcat启动之后, 访问根路径应该是返回tomcat首页啊, 这里为什么会是404呢?
首先你需要检查一下ubuntu的防火墙有没有对8888端口放行, 如果没有放行需要设置一下, 或者直接关闭防火墙
sudo ufw status #查看防火墙状态
sudo ufw enable #开启防火墙
sudo ufw disable#关闭防火墙
sudo ufw allow 8888#开放8888端口
sudo ufw delete allow 8888 #关闭8888端口
sudo ufw reload #防火墙重新加载, 使配置生效
防火墙设置完之后, 再去刷新一下请求地址, 如果可以看到首页那就是正确的了, 如果看不到首页, 那就是另外的问题
tomcat的问题
执行如下命令进入到tomcat容器内部
docker exec -it 容器id /bin/bash
可以进入到tomcat目录下, 我们看一下目录结构, 这里需要使用ls或者dir查看, ll命令不识别
我们需要访问的tomcat首页是在webapps中的, 但是我们进去之后看到的是空(2位置), 不存在任何文件的, 反而是webapps.dist文件中, 存放着webapps中的那些文件(3位置), 这是什么问题呢???
不管了, 把webapps.dist中的东西挪一下, 整到webapps中就行了
回到tomcat目录
mv webapps.dist/* webapps
rm -rf webapps.dist
然后重启一下tomcat, 注意这里不要关闭后重启, 需要通过容器id来重启
docker ps#查看tomcat容器id
docker restart bf4e103f6448
这时重启之后会发现, 已经可以访问tomcat首页了
回过头来我们说一下, 为什么不能停止tomcat, 然后再重新启动呢? 原因是我们刚刚修改的内容, 只是在运行的容器上修改了, 如果停止之后重新启动tomcat, 那就又是一个新的容器了, 问题的根源在于tomcat镜像, 如果镜像没有被修改, 每次启动都是一个全新的容器, 我们修改的内容会随着tomcat的停止而不被保存, 治标不治本, 这时需要将运行中的tomcat生成一个全新的镜像文件, 以后每次都启动这个新镜像就可以了
生成全新的镜像文件
首先在tomcat容器中, 把webapps和webapps.dist文件夹处理好之后, 同时按住ctrl+p+q
键, 这是在不退出容器的方式下, 回到宿主机中
使用docker commit命令将修改后的容器生成新的镜像
docker commit命令详解:
1.作用:将运行着的容器映射成新的镜像
2.格式: docker commit -a=‘这个随意写’ -m=’‘修改内容–随意写’ 容器名称或者ID 新生成镜像的名称
3.例子:
docker commit -a='a_info' -m='m_info' bf4e103f6448 idea_tomcat # 生成新的镜像
docker stop bf4e103f6448 # 关闭原来的tomcat容器
docker run -d -p 8888:8080 --name='tomcat2' idea_tomcat #启动新的tomcat容器
此时访问ip:8888就可以直接看到tomcat首页了
2.5.2 访问项目首页404
springboot项目自动生成之后,需要进行一些打包配置, 才能部署到tomcat, 这里只说常见的
在pom.xml文件中加上下面的两个依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 打包时去掉自带的tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
<!-- <scope>provided</scope> -->
</dependency>
在启动类的同级下创建一个类, 继承SpringBootServletInitializer, 重写configure方法
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class MyApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这里要指向原先用main方法执行的Application启动类
return builder.sources(DemoApplication.class);
}
}
然后使用maven进行clean package就可以了
2.6 设置开机启动
在启动容器的命令后面加上--restart=always
, 就可以配置tomcat随着docker一起启动,
docker run -d -p 8888:8080 --restart always --name='tomcat' idea_tomcat
3.问题总结
docker是一个很好的东西, 我也是刚刚开始研究, 据说这东西很厉害, 慢慢学习吧