使用Dockerfile部署前后端分离项目
1. 创建专用网络
运行以下命令创建一个名为appnet的自定义网络:
docker network create appnet
2. 配置数据库服务
2.1 准备工作
首先,创建一个用于存放数据库文件的目录:
mkdir -p project/db
然后启动一个临时MySQL容器以导出配置文件:
cd project/db
docker run --name temp_mysql -itd -e MYSQL_ROOT_PASSWORD=secret mysql:latest
docker cp temp_mysql:/etc/mysql/my.cnf .
docker cp temp_mysql:/etc/mysql/conf.d .
docker rm -f temp_mysql
编辑my.cnf文件,确保字符集为utf8mb4:
[mysql]
default-character-set=utf8mb4
[mysql.server]
default-character-set=utf8mb4
如果有初始化脚本,请将其命名为init.sql并放入当前目录。
2.2 构建Docker镜像
创建Dockerfile:
# 使用官方MySQL镜像作为基础
FROM mysql:latest
# 将初始化脚本复制到容器中
COPY init.sql /docker-entrypoint-initdb.d/
构建镜像:
docker build -t custom-mysql .
运行容器:
docker run --name db_container -d \
-p 3306:3306 \
-v ./my.cnf:/etc/mysql/my.cnf \
-v ./conf.d:/etc/mysql/conf.d \
-v ./data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
--network appnet \
custom-mysql
3. 配置后端服务
3.1 准备工作
创建后端项目的目录结构:
mkdir -p project/backend
在project/backend目录下创建application.yml:
spring:
datasource:
url: jdbc:mysql://db_container:3306/testdb
打包后端代码(假设使用Maven):
mvn clean package
生成的JAR文件应放置在project/backend目录下。
3.2 构建Docker镜像
创建Dockerfile:
FROM amazoncorretto:17
WORKDIR /app
COPY backend.jar .
EXPOSE 9000
CMD ["java", "-jar", "backend.jar"]
构建镜像:
docker build -t custom-backend .
运行容器:
docker run --name backend_container -d \
-p 9000:9000 \
-v ./application.yml:/app/application.yml \
--network appnet \
custom-backend
4. 配置前端服务
4.1 准备工作
创建前端项目的目录结构:
mkdir -p project/frontend/static
打包前端代码(假设使用Vue.js或React):
npm run build
将生成的静态文件复制到project/frontend/static。
从Nginx容器导出默认配置文件:
cd project/frontend
docker run --name temp_nginx -itd nginx:latest
docker cp temp_nginx:/etc/nginx/nginx.conf ./nginx.conf
docker cp temp_nginx:/etc/nginx/conf.d ./conf.d
docker rm -f temp_nginx
编辑conf.d/default.conf:
upstream backend_server {
server backend_container:9000;
}
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri /index.html;
}
location /api/ {
proxy_pass http://backend_server;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
4.2 构建Docker镜像
创建Dockerfile:
FROM nginx:latest
COPY ./static /usr/share/nginx/html
COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./conf.d /etc/nginx/conf.d
EXPOSE 80
构建镜像:
docker build -t custom-frontend .
运行容器:
docker run --name frontend_container -d \
-p 8080:80 \
--network appnet \
custom-frontend