122
社区成员
发帖
与我相关
我的任务
分享| 这个作业属于哪个课程 | 2302软件工程社区 |
|---|---|
| 这个作业要求在哪里 | 软件工程实践总结&个人技术博客 |
| 这个作业的目标 | 个人技术总结 |
| 其他参考文献 | 《构建之法》 |
在开发复杂的应用程序时,环境一致性是一个常见问题。Docker通过容器化技术解决了这一问题,允许开发者将应用及其依赖打包在容器中,确保在不同环境之间无缝迁移。此外,Docker还简化了微服务架构的部署,使得每个服务可以独立运行和扩展。
Docker已成为云计算和容器化技术的行业标准。学习Docker不仅有助于提升个人技术能力,也是响应当前软件开发行业对高效部署流程的需求。掌握Docker的使用,可以为开发者在微服务、持续集成/持续部署(CI/CD)等领域打下坚实基础。
Dockerfile来定制化镜像构建过程。Docker使用Linux内核技术,如cgroups和namespaces,来隔离容器。它允许用户在容器内运行应用及其所有依赖,而不需要依赖特定的基础设施。
Vue 3引入了Composition API,提供了更灵活的方式来组织组件逻辑。此外,Vue 3还提供了更好的性能和更小的体积,以及对TypeScript的原生支持。
Spring Boot简化了Spring应用的配置和部署。它通过自动配置和无需XML配置,使得Spring应用的初始搭建变得非常简单快捷。
确保系统上安装了Docker Engine和Docker Compose。可以通过以下命令来安装Docker:
# 对于Ubuntu系统
sudo apt-get update
sudo apt-get install docker.io docker-compose
对于Vue 3前端项目的Dockerfile (vue-app/Dockerfile):
# 使用官方Node.js作为基础镜像
FROM node:16
# 设置工作目录
WORKDIR /usr/src/app
# 复制package.json和package-lock.json
COPY package*.json ./
# 安装项目依赖
RUN npm install
# 复制项目文件到工作目录
COPY . .
# 构建前端应用
RUN npm run build
# 设置Nginx作为静态资源服务器
RUN apt-get update && apt-get install -y nginx \
&& rm -rf /etc/nginx/sites-enabled/*
# 配置Nginx
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 暴露80端口
EXPOSE 80
# 启动Nginx服务
CMD ["nginx", "-g", "daemon off;"]
对于Spring Boot后端项目的Dockerfile (spring-boot-app/Dockerfile):
# 使用官方OpenJDK作为基础镜像
FROM openjdk:8-jre-slim
# 设置工作目录
WORKDIR /app
# 复制Jar包到工作目录
COPY target/*.jar ./spring-boot-app.jar
# 暴露8080端口
EXPOSE 8080
# 启动Spring Boot应用
CMD ["java", "-jar", "spring-boot-app.jar"]
version: '3.8'
services:
vue-app:
build: ./vue-app
ports:
- "80:80"
spring-boot-app:
build: ./spring-boot-app
ports:
- "8080:8080"
depends_on:
- vue-app
environment:
- SPRING_PROFILES_ACTIVE=docker
在项目根目录下运行以下命令构建前端和后端的Docker镜像:
docker-compose build
使用以下命令启动整个应用堆栈:
docker-compose up
这将启动Vue 3前端应用和Spring Boot后端应用,前端应用可通过浏览器访问,后端应用将监听8080端口。
nginx.conf (vue-app/nginx.conf):
# http server
server {
listen 80;
server_name 123.207.40.200;
location / {
root /usr/share/nginx/html/dist;
index index.html index.htm;
# 解决vue3使用 history 路由模式刷新404
try_files $uri $uri/ /index.html;
}
# location /bili { # /bili/test/api /test/api
# proxy_pass http://bili:9898/; # 加/代表会丢弃/bili
# proxy_pass bili; # 加/代表会丢弃/bili
# }
# rewrite ^(.*)$ https://$host$1 permanent;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
这个配置文件将静态文件服务和API请求代理到Spring Boot应用。
Dockerfile,配置Node.js环境,安装依赖,并构建前端资源。docker build命令,根据Dockerfile构建Vue 3项目的Docker镜像。Dockerfile,配置Java环境,添加Jar包,并设置运行命令。docker-compose.yml中定义环境变量和连接字符串。docker build命令,根据Dockerfile构建Spring Boot项目的Docker镜像。创建docker-compose.yml文件,在项目根目录下定义Vue 3前端服务和Spring Boot后端服务,模板如下:
前端项目这里叫vue-app ,后端项目叫spring-boot-app。
version: '3.8'
services:
vue-app:
build: ./vue-app
ports:
- "80:80"
depends_on:
- spring-boot-app
spring-boot-app:
build: ./spring-boot-app
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb
- SPRING_DATASOURCE_USERNAME=user
- SPRING_DATASOURCE_PASSWORD=password
depends_on:
- db
# 使用MySQL数据库 也可以是其他的数据库 换掉镜像即可
db:
image: mysql:5.7
volumes:
- db-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_DATABASE=mydb
- MYSQL_USER=user
- MYSQL_PASSWORD=password
# 如果需要Redis服务
redis:
image: redis:alpine
volumes:
- redis-data:/data
volumes:
db-data:
redis-data:
Docker Compose会自动创建一个默认网络,所有在docker-compose.yml中定义的服务都会连接到这个网络,从而实现服务间的通信。
在docker-compose.yml中,我们为数据库服务db定义了db-data数据卷,用于持久化MySQL的数据。如果需要,也可以为Redis服务定义redis-data数据卷。
在项目根目录下运行以下命令启动服务:
docker-compose up -d
-d标志表示在后台运行服务。
如果需要扩展服务,比如添加Redis缓存服务,可以通过修改docker-compose.yml文件来实现。更新后,重新启动服务:
docker-compose up -d
这将根据新的配置重新启动所有服务,包括新添加的Redis服务。
./vue-app和./spring-boot-app目录中包含相应的Dockerfile。SPRING_DATASOURCE_URL、MYSQL_ROOT_PASSWORD等环境变量。问题描述:在开发过程中,Vue 3前端应用需要与Spring Boot后端应用进行通信。最初,我发现前端请求后端API时出现了连接错误。
解决过程:
docker-compose.yml文件,确认所有服务是否都在同一个默认网络下,并且容器名称正确无误。docker-compose.yml中的端口映射设置无误,前端容器能够访问到后端服务的端口。docker-compose.yml中使用depends_on选项确保后端服务先于前端服务启动。结果:经过上述步骤的调整,容器间的通信问题得到解决,前端能够成功调用后端API。
问题描述:在构建Docker镜像时,我发现构建过程非常缓慢,尤其是在初次构建时。
解决过程:
Dockerfile中的指令,合理安排指令顺序,减少不必要的缓存失效。RUN指令到一个层中,减少镜像层数。结果:优化后的Dockerfile显著提高了镜像构建的速度。
问题描述:在容器重启后,我发现数据库中的数据丢失了。
解决过程:
docker-compose.yml文件,确保为数据库服务配置了数据卷。结果:通过正确配置数据卷,数据库数据持久化问题得到解决。
问题描述:在部署过程中,我需要在多个地方管理环境变量和配置,这增加了管理的复杂性和出错的可能性。
解决过程:
.env文件来统一管理环境变量,并通过docker-compose.yml文件引用这些变量。结果:通过集中管理环境变量和配置,简化了部署流程,降低了出错率。
在这次软件工程实践课程中,我获得了宝贵的经验,特别是在Docker和Docker Compose的学习和应用上。以下是我的主要收获和体会:
技术学习与应用: 通过本学期的实践,我对Docker容器化技术有了更深入的了解。从安装配置Docker环境,到使用Dockerfile构建镜像,再到利用Docker Compose管理多容器应用,我逐步掌握了容器化技术在软件开发中的应用流程。
技术难点克服: 在学习过程中,我遇到了容器网络配置、数据卷持久化以及容器间服务通信等问题。通过查阅文档、不断尝试和与同学的交流,我成功地解决了这些问题。这些挑战不仅增强了我的技术实力,也锻炼了我的问题解决和自主学习能力。
实践中的收获: 在实际项目部署中,我深刻体会到了容器化技术在提高开发效率、确保环境一致性以及简化部署流程方面的重要性。通过使用Docker和Docker Compose,我不仅在技术层面有所提升,更在项目管理、团队协作和系统部署等方面获得了宝贵的经验。
通过本次实践,我对软件开发的全流程有了更加全面的认识,同时也对容器化技术在未来软件开发中的应用前景充满了期待。我相信,这些知识和技能将在我的未来职业道路上发挥重要作用。