使用 Docker Compose 部署前后端应用
在现代软件开发中,Docker 和 Docker Compose 已成为部署应用程序的利器。尤其是在前后端分离的架构中,使用 Docker Compose 可以有效地管理多个服务。本文将介绍如何通过 Docker Compose 部署一个简单的前后端应用,并使用图示说明相关结构。
什么是 Docker Compose?
Docker Compose 是 Docker 的一个工具,能够定义和运行多个 Docker 容器的应用。通过一个配置文件(通常是 docker-compose.yml
),开发者可以轻松管理应用的构建、连接和服务。
项目结构
我们将创建一个简单的 Node.js 后端和一个基于 React 的前端应用。项目结构如下:
my-app/
├── backend/
│ ├── app.js
│ └── Dockerfile
├── frontend/
│ ├── index.js
│ └── Dockerfile
└── docker-compose.yml
后端代码
首先,创建一个简单的 Node.js 后端,假设我们需要提供一个 API。
backend/app.js:
const express = require('express');
const app = express();
const PORT = process.env.PORT || 5000;
app.get('/api/message', (req, res) => {
res.json({ message: 'Hello from backend!' });
});
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
backend/Dockerfile:
# 使用官方 Node.js 镜像
FROM node:14
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用代码
COPY . .
# 暴露端口
EXPOSE 5000
# 启动应用
CMD ["node", "app.js"]
前端代码
接下来,创建 React 前端以调用后端 API。
frontend/index.js:
import React, { useEffect, useState } from 'react';
import ReactDOM from 'react-dom';
function App() {
const [message, setMessage] = useState('');
useEffect(() => {
fetch('/api/message')
.then(response => response.json())
.then(data => setMessage(data.message));
}, []);
return (
<div>
{message}
</div>
);
}
ReactDOM.render(<App />, document.getElementById('root'));
frontend/Dockerfile:
# 使用官方 Node.js 镜像
FROM node:14
# 设置工作目录
WORKDIR /app
# 复制 package.json 和 package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用代码
COPY . .
# 构建应用
RUN npm run build
# 使用静态文件服务器
FROM serve:latest
COPY --from=0 /app/build /srv/serve
EXPOSE 3000
CMD ["serve", "-s", "/srv/serve"]
Docker Compose 配置
最后,我们需要创建一个 docker-compose.yml
文件以连接前后端服务。
docker-compose.yml:
version: '3.8'
services:
backend:
build:
context: ./backend
ports:
- "5000:5000"
frontend:
build:
context: ./frontend
ports:
- "3000:3000"
depends_on:
- backend
启动应用
使用以下命令启动应用:
docker-compose up --build
访问 http://localhost:3000
可以看到前端页面,并通过该页面可以调用后端提供的 API。
可视化结构
在理解了代码之后,我们来看看系统的服务结构以及类图。
服务架构图
pie
title 服务架构
"Frontend": 50
"Backend": 50
类图
classDiagram
class App {
+String message
+void fetchMessage()
}
class Express {
+void get(String path, Function callback)
}
App --> Express : uses
结论
本文介绍了如何使用 Docker Compose 部署一个简单的前后端分离应用。通过 Docker 和 Docker Compose,开发者可以轻松地管理和部署多服务应用,提高开发效率。在未来的项目中,考虑使用 Docker 可以大大简化环境配置和应用部署的复杂性。希望这篇文章能够帮助到你,开启你的 Docker 之旅!