Docker Engine 通过 dockerd、containerd 和 runc 管理容器。镜像是分层的只读模板,容器是镜像的运行实例;容器隔离依赖 Linux namespaces、cgroups 和安全机制,不等同虚拟机。
## 安装
生产主机使用 Docker 官方仓库或受支持发行版包,阅读防火墙兼容说明。便利安装脚本只适合测试。安装后验证:
```bash
docker version
docker info
systemctl status docker
docker run --rm hello-world
```
加入 docker 组等同授予接近 root 的权限,应严格控制成员。优先评估 rootless 模式或通过受控平台操作。
## 常用命令
```bash
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 链和实际公网暴露。
```bash
docker network create app-net
docker volume create app-data
docker run -d --network app-net -v app-data:/data IMAGE
```
数据放卷或外部存储,容器本身保持可替换。卷必须独立备份并恢复演练。
## Dockerfile
```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。
```bash
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,不写脚本。
## 排障
1. docker info 与 daemon 日志。
2. inspect 查看状态、退出码、挂载和网络。
3. logs 与应用健康检查。
4. 主机磁盘/inode、内存、iptables/nftables 与 DNS。
5. 镜像架构、入口命令和文件权限。
容器退出是结果,不是根因。生产容器还要设置资源限制、只读文件系统、capability drop、seccomp、健康检查和集中日志。
参考:https://docs.docker.com/get-started/ 与 https://docs.docker.com/build/building/best-practices/