Skip to content

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:3000

Python 应用

创建示例应用

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-app

Java 应用

创建示例应用

使用 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
.env

2. 优化层缓存

将不经常变化的文件(如依赖文件)放在前面:

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 用户运行容器,这是安全最佳实践。

下一步


由 BSFC Tech 提供技术支持