为什么用 Docker
Docker 容器化部署让应用与依赖打包在一起,环境一致、迁移方便。DMIT 云服务器支持 Docker,本文介绍在 DMIT 上使用 Docker 部署服务的完整流程。
安装 Docker
# Debian/Ubuntu
apt update
apt install ca-certificates curl gnupg -y
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" > /etc/apt/sources.list.d/docker.list
apt update
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
# 验证
docker --version
docker compose version
docker run hello-world
安装 Docker Compose
Docker Compose 已通过 docker-compose-plugin 安装。验证:
docker compose version
使用 docker compose(空格)而非旧版 docker-compose(连字符)。
基本用法
运行单个容器
# 运行 Nginx
docker run -d --name web -p 80:80 nginx:alpine
# 查看运行中的容器
docker ps
# 查看日志
docker logs web
# 进入容器
docker exec -it web sh
# 停止和删除
docker stop web
docker rm web
使用 Dockerfile 构建镜像
# Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --production
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]
# 构建和运行
docker build -t myapp:latest .
docker run -d --name myapp -p 3000:3000 myapp:latest
Docker Compose 多服务编排
典型 Web 应用:Nginx + Node.js + PostgreSQL。
# docker-compose.yml
services:
web:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./certs:/etc/nginx/certs
depends_on:
- app
app:
build: ./app
ports:
- "3000:3000"
environment:
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
depends_on:
- db
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
# 启动所有服务
docker compose up -d
# 查看状态
docker compose ps
# 查看日志
docker compose logs -f
# 停止
docker compose down
# 重建并启动
docker compose up -d --build
数据持久化
容器本身是无状态的,数据需要通过 volumes 持久化:
# 命名卷(由 Docker 管理)
volumes:
- db_data:/var/lib/postgresql/data
# 绑定挂载(映射到主机目录)
volumes:
- ./uploads:/app/uploads
- ./config:/app/config
网络配置
# 创建自定义网络
docker network create mynet
# 容器间通过服务名通信
services:
app:
networks:
- mynet
db:
networks:
- mynet
networks:
mynet:
driver: bridge
同一网络内的容器可以用服务名互相访问(如 db:5432),无需暴露端口到主机。
IPv6 与 Docker
DMIT 默认分配 IPv6,Docker 也支持 IPv6。在 /etc/docker/daemon.json 中启用:
{
"ipv6": true,
"fixed-cidr-v6": "fd00:dead:beef::/64",
"experimental": true,
"ip6tables": true
}
systemctl restart docker
更多 IPv6 配置见《IPv6 配置教程》。
资源限制
限制容器资源防止单个容器耗尽主机资源:
services:
app:
deploy:
resources:
limits:
cpus: "1.0"
memory: 512M
reservations:
memory: 256M
更多资源管理方法见《性能调优指南》。
日志管理
Docker 日志默认无限制增长,需配置日志轮转:
# /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
安全注意事项
- 不要以 root 运行容器内进程——使用
USER指令 - 限制容器权限:
security_opt: [no-new-privileges:true] - 不要暴露 Docker Socket(2375/2376 端口)到公网
- 定期更新镜像:
docker compose pull && docker compose up -d - 使用
.dockerignore排除敏感文件
SSH 安全加固见《SSH 安全加固》。
备份 Docker 数据
# 备份命名卷
docker run --rm -v db_data:/data -v $(pwd):/backup alpine tar czf /backup/db_data.tar.gz /data
# 恢复
docker run --rm -v db_data:/data -v $(pwd):/backup alpine tar xzf /backup/db_data.tar.gz /data
更多备份策略见《监控与备份》。
常见问题
容器无法访问外网?
# 检查 DNS
docker run --rm alpine nslookup google.com
# 检查网络
docker network inspect bridge
端口被占用?
# 查看占用进程
ss -tlnp | grep :80
# 停止占用进程或更换映射端口
磁盘空间不足?
# 清理无用镜像和容器
docker system prune -a --volumes
# 查看磁盘使用
docker system df
更多故障排查见《故障排查指南》。
检查清单
| 项目 | 状态 |
|---|---|
| Docker 已安装 | ✓ docker --version |
| Compose 已安装 | ✓ docker compose version |
| 容器以非 root 运行 | ✓ USER 指令 |
| 日志轮转已配置 | ✓ daemon.json |
| 数据已持久化 | ✓ volumes 配置 |
| 资源限制已设置 | ✓ deploy.resources |
| Docker Socket 未暴露 | ✓ 不开放 2375 |
相关文章:《初次部署检查清单》、《迁移指南》、《成本优化》。
本文核对日期:2026-08-18。Docker 安装命令以官方文档为准。