Web 应用容器化
本教程将演示如何将不同类型的 Web 应用容器化。
Node.js 应用
创建示例应用
首先创建一个简单的 Node.js 应用:
javascript
// app.js
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello from Docker!\n');
});
server.listen(3000, '0.0.0.0', () => {
console.log('Server running on port 3000');
});json
// package.json
{
"name": "node-docker-app",
"version": "1.0.0",
"main": "app.js"
}编写 Dockerfile
dockerfile
# 使用官方 Node.js 运行时作为基础镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制 package.json 并安装依赖
COPY package.json .
RUN npm install
# 复制应用代码
COPY app.js .
# 暴露端口
EXPOSE 3000
# 启动应用
CMD ["node", "app.js"]构建和运行
sh
# 构建镜像
docker build -t my-node-app .
# 运行容器
docker run -d -p 3000:3000 --name my-app my-node-app
# 访问应用
curl http://localhost:3000Python 应用
创建示例应用
python
# app.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello from Docker!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)text
# requirements.txt
Flask==2.3.0编写 Dockerfile
dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]构建和运行
sh
docker build -t my-python-app .
docker run -d -p 5000:5000 --name my-python-app my-python-appJava 应用
创建示例应用
使用 Spring Boot 创建一个简单的 REST API:
java
// Application.java
@SpringBootApplication
@RestController
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@GetMapping("/")
public String hello() {
return "Hello from Docker!";
}
}编写 Dockerfile
dockerfile
# 多阶段构建
FROM maven:3.8-openjdk-17 AS build
WORKDIR /app
COPY pom.xml .
COPY src ./src
RUN mvn clean package -DskipTests
FROM openjdk:17-jre-slim
WORKDIR /app
COPY --from=build /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]提示
多阶段构建可以显著减小最终镜像的大小。更多信息请参考 多阶段构建 教程。
最佳实践
1. 使用 .dockerignore
创建 .dockerignore 文件,排除不需要的文件:
text
node_modules
npm-debug.log
.git
.gitignore
README.md
.env2. 优化层缓存
将不经常变化的文件(如依赖文件)放在前面:
dockerfile
# 好的做法:先复制依赖文件
COPY package.json .
RUN npm install
# 然后复制应用代码
COPY . .3. 使用非 root 用户
dockerfile
FROM node:18-alpine
# 创建非 root 用户
RUN addgroup -g 1001 -S nodejs && \
adduser -S nodejs -u 1001
WORKDIR /app
# 更改文件所有者
COPY --chown=nodejs:nodejs . .
USER nodejs
EXPOSE 3000
CMD ["node", "app.js"]BSFC Tech Pro Tip
生产环境必须使用非 root 用户运行容器,这是安全最佳实践。