Docker Engine 通过 dockerd、containerd 和 runc 管理容器。镜像是分层的只读模板,容器是镜像的运行实例;容器隔离依赖 Linux namespaces、cgroups 和安全机制,不等同虚拟机。
安装
生产主机使用 Docker 官方仓库或受支持发行版包,阅读防火墙兼容说明。便利安装脚本只适合测试。安装后验证:
docker version
docker info
systemctl status docker
docker run --rm hello-world
加入 docker 组等同授予接近 root 的权限,应严格控制成员。优先评估 rootless 模式或通过受控平台操作。
常用命令
docker image ls
docker pull nginx:1.28
docker run -d --name web -p 8080:80 nginx:1.28
docker logs -f web
docker exec -it web sh
docker inspect web
docker stats
docker stop web && docker rm web
不要用 latest 发布生产;记录镜像摘要。删除和 prune 前检查范围,卷删除可能造成数据丢失。
网络与卷
用户自定义 bridge 网络提供容器 DNS。端口发布可能绕过部分 ufw/firewalld 规则,应检查 DOCKER-USER 链和实际公网暴露。
docker network create app-net
docker volume create app-data
docker run -d --network app-net -v app-data:/data IMAGE
数据放卷或外部存储,容器本身保持可替换。卷必须独立备份并恢复演练。
Dockerfile
# syntax=docker/dockerfile:1
FROM python:3.13-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt
FROM python:3.13-slim
RUN useradd --create-home app
WORKDIR /app
COPY --from=builder /wheels /wheels
COPY . .
RUN pip install --no-cache-dir /wheels/*
USER app
CMD ["python", "app.py"]
使用多阶段构建、可信最小基础镜像、.dockerignore、非 root 用户和 exec 形式 CMD。构建时不把 Secret COPY 进层;在 CI 扫描、生成 SBOM、签名并固定摘要。
私有仓库
测试可运行 CNCF Distribution Registry,生产必须配置 TLS、认证、持久存储、访问控制、扫描、保留和备份。不要长期配置 insecure-registry。
docker tag app:1.0 registry.example.com/team/app:1.0
docker login registry.example.com
docker push registry.example.com/team/app:1.0
凭证使用 credential helper,不写脚本。
排障
docker info 与 daemon 日志。
inspect 查看状态、退出码、挂载和网络。
logs 与应用健康检查。
主机磁盘/inode、内存、iptables/nftables 与 DNS。
镜像架构、入口命令和文件权限。
容器退出是结果,不是根因。生产容器还要设置资源限制、只读文件系统、capability drop、seccomp、健康检查和集中日志。
参考:https://docs.docker.com/get-started/ 与 https://docs.docker.com/build/building/best-practices/
生产部署建议
镜像使用明确版本并记录 digest,构建过程固定基础镜像和依赖版本。
容器以非 root 用户运行,删除不必要 capabilities,启用只读根文件系统并限制资源。
配置健康检查、优雅停止时间、日志轮转和重启策略,但避免用无限重启掩盖故障。
状态数据放在受控卷或外部存储,并完成备份恢复演练。
docker run -d --name app --read-only --cap-drop ALL --memory 512m --cpus 1.0 --restart unless-stopped --health-cmd 'wget -qO- http://127.0.0.1/health || exit 1' registry.example.com/app:1.0.0常见故障排查
docker ps -a
docker inspect <CONTAINER>
docker logs --since 30m <CONTAINER>
docker stats --no-stream
docker system df -v
docker network inspect <NETWORK>
journalctl -u docker --since "30 min ago"容器退出先看 ExitCode、OOMKilled 和应用日志;网络问题对比容器 DNS、端口监听和宿主机防火墙;磁盘问题检查镜像层、容器日志和可写层。不要在未确认范围时执行全局 prune。
上线检查清单
□ 镜像来源、版本、摘要和漏洞扫描均可追溯
□ 非 root、资源限制、健康检查和优雅停止已配置
□ 网络暴露面、DOCKER-USER 链和 TLS 已核对
□ 数据卷有备份、恢复验证和容量告警
□ 日志轮转、监控、告警和回滚镜像已准备
总结
Docker 入门不只是记住 run 命令。理解镜像、进程、网络和存储边界,并把安全、资源、可观测性、数据保护和回滚放进发布流程,才能让容器真正适用于生产。