Docker 部署与项目需求分析
前言
人总是本能地恐惧未知,令生活陷入到经验主义的循环之中。但我们终将面对。今天的目标是把 Docker 部署学完,然后对项目进行需求分析。
日程
- 下午 4:30:Docker 部署项目部分学完了,做下笔记。
- 晚上 6:30:对项目进行需求分析。
学习记录
学习内容
省流
- Docker 自定义镜像
- Docker 网络
- Docker Compose
- 关于二轮项目的需求分析
1. Docker 自定义镜像
准备一个 Docker 镜像,通常需要以下几个部分:
- 系统运行环境
- 相关的依赖和程序
- 运行脚本
Dockerfile 提供了用于构建镜像的指令,如下表所示:
指令 | 说明 | 示例 |
---|---|---|
FROM | 指定基础镜像 | FROM centos:7 |
ENV | 设置环境变量,可在后面指令使用 | ENV key=value |
COPY | 拷贝本地文件到镜像的指定目录 | COPY ./jdk17.tar.gz /tmp |
RUN | 执行 Linux 的 shell 命令,一般是安装过程的命令 | RUN tar -zxvf /tmp/jdk17.tar.gz |
EXPOSE | 指定容器运行时监听的端口,是给镜像使用者看的 | EXPOSE 8080 |
ENTRYPOINT | 镜像中应用的启动命令,容器运行时调用 | ENTRYPOINT java -jar xx.jar |
注意:Dockerfile 的文件名称就叫 Dockerfile
。
示例
# 使用 CentOS 7 作为基础镜像
FROM centos:7# 添加 JDK 到镜像中
COPY jdk17.tar.gz /usr/local/
RUN tar -xzf /usr/local/jdk17.tar.gz -C /usr/local/ && rm /usr/local/jdk17.tar.gz# 设置环境变量
ENV JAVA_HOME=/usr/local/jdk-17.0.10
ENV PATH=$JAVA_HOME/bin:$PATHENV OSS_ACCESS_KEY_ID=LTAI5tP6dc4cvccdvvySE39X
ENV OSS_ACCESS_KEY_SECRET=ZSyIT31qhxIkS0dH1H9WzHqPiyM3Ot# 统一编码
ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8# 创建应用目录
RUN mkdir -p /tlias
WORKDIR /tlias# 复制应用 JAR 文件到容器
COPY tlias.jar tlias.jar# 暴露端口
EXPOSE 8080# 运行命令
ENTRYPOINT ["java","-jar","/tlias/tlias.jar"]
执行以下语句来构建镜像:
docker build -t myImage:1.0 .
注意:末尾的 .
是指定 Dockerfile 所在的目录,在当前目录则为 .
。
2. Docker 网络
默认情况下,Docker 给所有的容器提供了默认的 bridge 网桥来实现相互沟通。但是因为容器的 IP 地址分配是不固定的,这导致我们在部署项目时有不必要的麻烦。在自定义的网络下,容器可以通过容器名代替 IP 地址来相互访问。
Docker 网络命令
命令 | 说明 |
---|---|
docker network create | 创建一个网络 |
docker network ls | 查看所有网络 |
docker network rm | 删除指定网络 |
docker network prune | 清除未使用的网络 |
docker network connect | 使指定容器连接加入某网络 |
docker network disconnect | 使指定容器连接离开某网络 |
docker network inspect | 查看网络详细信息 |
示例
创建一个网络:
docker network create netcat
在创建容器时设置连接到该网桥:
docker run -d --name myapp -p 8080:8080 --network netcat app:1.0
或者将一个现存容器加入到该网桥(使用该方法时,容器仍然保留原来的默认网桥连接):
docker network connect netcat myapp
3. Docker Compose
通过配置 docker-compose.yml
文件来实现多个关联的 Docker 容器的快速部署。
Docker Compose 指令
docker compose 【Options】【Commands】
类型 | 参数或指令 | 说明 |
---|---|---|
Options | -f | 指定 compose 文件的路径和名称 |
-p | 指定 project 名称 | |
Commands | up | 创建并启动所有 service 容器 |
down | 停止并移除所有容器、网络 | |
ps | 列出所有启动的容器 | |
logs | 查看指定容器的日志 | |
stop | 停止容器 | |
start | 启动容器 | |
restart | 重启容器 | |
top | 查看运行的进程 |
docker-compose.yml
文件示例
services:mysql:image: mysql:8container_name: mysqlports:- "3307:3306"environment:TZ: Asia/ShanghaiMYSQL_ROOT_PASSWORD: 123volumes:- "/usr/local/app/mysql/conf:/etc/mysql/conf.d"- "/usr/local/app/mysql/data:/var/lib/mysql"- "/usr/local/app/mysql/init:/docker-entrypoint-initdb.d"networks:- tlias-nettlias:build: context: .dockerfile: Dockerfilecontainer_name: tlias-serverports:- "8080:8080"networks:- tlias-netdepends_on:- mysqlnginx:image: nginx:1.20.2container_name: nginx-tliasports:- "80:80"volumes:- "/usr/local/app/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"- "/usr/local/app/nginx/html:/usr/share/nginx/html"depends_on:- tliasnetworks:- tlias-netnetworks: #指定网络tlias-net:name: itheima
在当前目录下创建容器并后台启动:
docker compose up -d
4. 关于二轮项目的需求分析
注意:只关注需要实现的模块,其他的数据从数据调用即可。
1)学生模块
- 课程页面:可以显示习题总数、简单介绍以及完成情况,有一个按钮跳转到对应的练习列表。
- 练习列表:显示练习名称、题数、总分(自己获得的)、截止时间、已完成题数、练习状态。查看详情时进入到做题页面。
- 做题界面:
- 进入一道题后,如果已经提交过,会显示上一次提交的记录。
- 提交答案按钮,点击提交后跳转回练习列表,更新答题情况。
- 提交过后展示已提交过的答案和正确答案,不能再修改/提交答案。
2)教师模块
- 管理练习功能:
- 以表格形式展示,练习名称、课程名称、班级名称模糊查询。
select
框选择学期。- 每一个练习有 3 种状态:未开始、进行中、已结束。
- 可以修改、添加练习。
- 添加练习功能:
- 下拉框选择,课程单选,班级可多选。
- 管理员的练习名称可以重复。
- 单教师、单学期对于一个班级的练习名称不可重复。
- 可以自己添加题目,或者从题库选择。
- 修改练习功能:对添加练习功能 + 查询回显即可。
- 复用练习:
- 自动沿用该练习的题目。
- 作业名称、课程、班级重新输入。
- 应当注意到的层次结构:课程 -> 练习 -> 题目。
- 添加题目:
- 表格形式。
- 单选栏:选择题/简答题。
- 题目描述、难度、题干、答案。
- 确定/返回。
- 从题库添加题目:
- 选择题库 -> 可多选题目。
- 添加/返回。
- 批改练习页面:
- 展示 table:学生姓名、学号、题干信息(总分值)、题 1,题 2…题 n 情况。
- 人工批改简单题部分。
- 表格显示班级、学号、姓名、完成题数、总分、各题批改情况/完成情况。
- 对应题目一栏,显示提交情况:未/已提交,已批改(显示分数)。
- 已提交 -> 题目的情况(题干信息、标准答案、学生答案),批改分数,评分,备注,确定/返回。
- 已批改 -> 批改情况。
- 未提交(考虑向学生发送提醒,可不做)。
进阶需求
- Maven 分模块化构建项目。
- 完成数据库连接池,支持动态扩缩容(c3p0、druid)(并发安全(hard))。
- 后端以多线程模式运行,保证并发安全。
- SQL 构建器 + 自定义 SQL,高兼容性的结果映射。
- 用
DispatcherController
来统一接收数据,并转发给路径给对应 Controller 处理。 - 自定义异常抛出,全局异常处理器,过滤器。
- 输出日志文件。
- 将常量配置转移到
yml
配置文件。 - 统一接收 JSON 格式数据,对数据进行混合加密(RSA + AES)。
- 通过依赖注入(DI)进行控制反转(IOC),使用全局上下文进行全局对象的对象间依赖注入(使用注解)。
- 实现 AOP 动态代理。
- 判题机制,可以运行 C++ 代码。
- Nginx 部署前端 + Docker 容器技术。
- 将项目部署到公网。
注意:二轮考核截止时间:5 月 22 日。
方针:截至五一结束之前,尽可能多地完成进阶部分的功能(甚至只需要留 10 天来完成,不过考虑到还要上课、比赛等情况,留足至少 12 天是比较稳妥的)。
结语
结果因为修 bug 修到了第二天。