在 Debian 上使用 Docker 部署应用的完整流程
一 安装与准备
- 更新系统并安装依赖
- sudo apt update && sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
- 添加 Docker 官方 GPG 密钥与软件源(推荐 Debian 12 的方式)
- sudo install -m0755 -d /etc/apt/keyrings
- curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
- echo “deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 安装 Docker 引擎
- sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io
- 启动并设置开机自启
- sudo systemctl start docker && sudo systemctl enable docker
- 验证安装
- docker version 或 docker run --rm hello-world
- 可选 安装 Docker Compose 插件(推荐)
- sudo apt install -y docker-compose-plugin
- 可选 国内网络加速(编辑 /etc/docker/daemon.json)
- {
“registry-mirrors”: [“https://<你的镜像加速地址>”]
}
- 修改后执行:sudo systemctl restart docker
二 构建镜像与运行容器
- 示例一 直接运行官方镜像(Nginx 静态站点)
- docker run -d --name web -p 80:80 nginx:latest
- 示例二 使用 Dockerfile 构建 Python Flask 应用
- 目录结构
- app.py
- requirements.txt
- Dockerfile
- app.py
- from flask import Flask
app = Flask(name)
@app.route(“/”)
def hello(): return “Hello, Docker on Debian!”
if name == “main”: app.run(host=“0.0.0.0”, port=5000)
- requirements.txt
- Dockerfile
- FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD [“python”, “app.py”]
- 构建与运行
- docker build -t flask-web-app .
- docker run -d --name flask -p 5000:5000 flask-web-app
- 常用管理命令
- 查看:docker ps -a
- 日志:docker logs -f flask
- 进入:docker exec -it flask bash
- 停止/启动/删除:docker stop|start|rm flask
三 多服务与 Compose 编排
- 示例 docker-compose.yml(Flask + PostgreSQL)
- version: “3.8”
services:
web:
build: .
ports:
- “5000:5000”
environment:
- POSTGRES_DB=appdb
- POSTGRES_USER=app
- POSTGRES_PASSWORD=secret
depends_on:
- db
db:
image: postgres:15
environment:
- POSTGRES_DB=appdb
- POSTGRES_USER=app
- POSTGRES_PASSWORD=secret
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
- 启动与常用操作
- 启动:docker compose up -d(或 docker-compose up -d)
- 查看日志:docker compose logs -f
- 停止:docker compose down
- 说明
- 生产环境建议为数据库设置强密码、持久化卷,并考虑使用 secrets 管理敏感信息。
四 反向代理与域名访问
- 安装 Nginx
- sudo apt install -y nginx
- 配置反向代理(/etc/nginx/sites-available/app.conf)
- server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
- 启用站点并热重载
- sudo ln -s /etc/nginx/sites-available/app.conf /etc/nginx/sites-enabled/
- sudo nginx -t && sudo systemctl reload nginx
- 防火墙与 DNS
- 开放端口:sudo ufw allow 80,443/tcp
- DNS 添加 A 记录:将 app.example.com 指向服务器公网 IP
五 安全与运维最佳实践
- 以非 root 用户运行容器(将用户加入 docker 组后使用 docker 命令)
- sudo usermod -aG docker $USER(重新登录生效)
- 镜像与系统持续更新(安全补丁)
- 定期执行:sudo apt update && sudo apt upgrade -y 与 docker image prune -f
- 日志与存储
- 配置日志轮转(/etc/docker/daemon.json):
- {
“log-driver”: “json-file”,
“log-opts”: { “max-size”: “10m”, “max-file”: “3” }
}
- 网络安全
- 仅暴露必要端口,使用 UFW 或云安全组限制来源 IP
- 数据库等敏感服务不对外映射端口,仅内网访问
- 敏感信息管理
- 使用环境变量或 Docker Secrets 管理密码与密钥,避免硬编码