在CentOS服务器中使用Docker部署Node.js + Express + SQLite项目具体步骤如下:
1. 环境准备
安装Docker
bash
# 更新系统
sudo yum update -y
# 安装Docker
sudo yum install -y docker
# 启动Docker服务
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker --version
将用户添加到docker组(可选)
bash
sudo usermod -aG docker $USER
# 重新登录生效
2. 项目结构准备
确保项目结构如下:
your-project/
├── Dockerfile
├── .dockerignore
├── package.json
├── app.js
├── database/
│ └── (SQLite数据库文件)
├── routes/
├── public/
└── ...
3. 创建Dockerfile
dockerfile
# 使用Node.js官方镜像
FROM node:18-alpine
# 安装SQLite3依赖
RUN apk add --no-cache sqlite
# 创建应用目录
WORKDIR /usr/src/app
# 复制package文件
COPY package*.json ./
# 安装依赖
RUN npm install
# 复制应用源代码
COPY . .
# 创建数据库目录并设置权限
RUN mkdir -p /usr/src/app/database && \
chown -R node:node /usr/src/app
# 切换用户(安全考虑)
USER node
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["npm", "start"]
4. 创建.dockerignore文件
.dockerignore
node_modules
npm-debug.log
.git
.gitignore
README.md
.env
.nyc_output
coverage
.DS_Store
5. 创建docker-compose.yml(可选)
yaml
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
volumes:
- ./database:/usr/src/app/database
- ./logs:/usr/src/app/logs
environment:
- NODE_ENV=production
restart: unless-stopped
6. 部署步骤
上传项目到服务器
可以使用FinalShell上传文件到相应目录下
或
# 使用scp上传项目
scp -r your-project/ user@your-server-ip:/path/to/destination/
在服务器上构建和运行
bash
# 进入项目目录
cd /path/to/your-project
# 构建Docker镜像
docker build -t node-express-app .
# 运行容器 需根据需要更改名称、端口号、项目地址、项目名称
docker run -d --name node-app -p 3000:3000 -v $(pwd)/database:/usr/src/app/database node-express-app
# 查看容器状态
docker ps
# 查看日志
docker logs node
使用Docker Compose(推荐)
bash
# 启动服务
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down
7. 项目配置注意事项
确保Express应用正确配置
javascript
const express = require('express');
const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const app = express();
const PORT = process.env.PORT || 3000;
// 数据库路径配置
const dbPath = process.env.NODE_ENV === 'production'
? '/usr/src/app/database/mydb.sqlite'
: path.join(__dirname, 'database', 'mydb.sqlite');
// 中间件
app.use(express.json());
app.use(express.static('public'));
// 路由
app.get('/', (req, res) => {
res.json({ message: 'Hello from Docker!' });
});
app.listen(PORT, '0.0.0.0', () => {
console.log(`Server running on port ${PORT}`);
});
package.json脚本配置
json
{
"scripts": {
"start": "node app.js",
"dev": "nodemon app.js"
}
}
8. 数据库处理
初始化数据库脚本(可选)
javascript
// db-init.js
const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const dbPath = path.join(__dirname, 'database', 'mydb.sqlite');
const db = new sqlite3.Database(dbPath);
db.serialize(() => {
db.run(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
email TEXT UNIQUE,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)`);
});
db.close();
9. 管理和监控
常用Docker命令
bash
# 查看运行中的容器
docker ps
# 查看所有容器
docker ps -a
# 查看容器日志
docker logs node-app
# 进入容器
docker exec -it node-app sh
# 停止容器
docker stop node-app
# 删除容器
docker rm node-app
# 查看镜像
docker images
# 删除镜像
docker rmi node-express-app
10. 使用Nginx反向代理(可选)
bash
# 安装Nginx
sudo yum install -y nginx
# 配置反向代理
sudo nano /etc/nginx/conf.d/node-app.conf
Nginx配置示例:
nginx
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
11. 安全考虑(可选)
使用环境变量
bash
# 创建.env文件
echo "NODE_ENV=production" >> .env
echo "DB_PATH=/usr/src/app/database/mydb.sqlite" >> .env
在Docker Compose中使用环境变量
yaml
environment:
- NODE_ENV=production
- DB_PATH=/usr/src/app/database/mydb.sqlite
这样就完成了在CentOS服务器上使用Docker部署Node.js + Express + SQLite项目的全部流程。记得在部署前测试应用在本地Docker环境中的运行情况。