ubuntu下搭建docker 部署tomcat 发布springboot war包 实现过程及问题记录

12 篇文章 1 订阅
8 篇文章 1 订阅

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是一个很好的东西, 我也是刚刚开始研究, 据说这东西很厉害, 慢慢学习吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值