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 修到了第二天。