作为容器化技术的核心工具,Docker命令体系就像瑞士军刀一样功能丰富。经过五年容器化实践,我整理出这份覆盖开发、测试、生产全场景的实用命令手册。不同于官方文档的平铺直叙,这里每个命令都附带真实环境验证过的参数组合和使用场景。
bash复制# 启动容器并进入交互模式(适合调试)
docker run -it --name my_container ubuntu:20.04 /bin/bash
# 后台运行容器并映射端口(生产环境常用)
docker run -d -p 8080:80 --name web_server nginx:alpine
# 优雅停止容器(发送SIGTERM信号)
docker stop web_server
# 强制终止容器(相当于kill -9)
docker kill web_server
经验:生产环境务必使用
--restart unless-stopped参数实现故障自愈,避免服务意外终止。
bash复制# 查看运行中容器(-a显示全部)
docker ps -a --format "table {{.ID}}\t{{.Names}}\t{{.Status}}"
# 查看容器资源占用
docker stats --no-stream
# 查看容器日志(--tail限制行数)
docker logs -f --tail 100 web_server
bash复制# 拉取镜像(指定版本避免兼容问题)
docker pull python:3.9-slim
# 查看镜像层结构(分析构建过程)
docker history nginx:alpine
# 删除悬空镜像(释放磁盘空间)
docker image prune -f
dockerfile复制# 多阶段构建示例(减小最终镜像体积)
FROM golang:1.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o server .
FROM alpine:latest
COPY --from=builder /app/server /
CMD ["/server"]
避坑指南:构建时用
--no-cache避免缓存污染,但会显著增加构建时间。
bash复制# 创建自定义网络(隔离不同服务)
docker network create --driver bridge my_net
# 查看容器IP地址
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web_server
# 端口映射检查(确认暴露端口)
docker port web_server 80
bash复制# 创建命名卷(生产推荐方案)
docker volume create db_data
# 挂载主机目录(开发环境常用)
docker run -v /host/path:/container/path mysql:8.0
# 备份卷数据(重要!)
docker run --rm -v db_data:/volume -v /backup:/backup alpine \
tar czf /backup/db_backup.tar.gz -C /volume .
bash复制# 进入运行中容器(推荐exec方式)
docker exec -it web_server /bin/sh
# 拷贝文件进出容器
docker cp web_server:/etc/nginx/nginx.conf ./nginx.conf.bak
# 查看容器进程树
docker top web_server -ef
bash复制# 限制容器内存(防止OOM)
docker run -d --memory="512m" --memory-swap="1g" redis
# 清理无用资源(定期执行)
docker system prune --volumes -f
bash复制# 批量停止所有容器
docker stop $(docker ps -aq)
# 删除所有已停止容器
docker rm $(docker ps -aq -f status=exited)
# 更新所有镜像(谨慎使用!)
docker images | grep -v REPOSITORY | awk '{print $1":"$2}' | xargs -L1 docker pull
bash复制# 自动重启不健康容器(需配合healthcheck)
docker run --health-cmd="curl -f http://localhost || exit 1" \
--health-interval=30s \
--health-retries=3 \
--health-start-period=10s \
nginx
bash复制# 以非root用户运行(必须!)
docker run -u 1000:1000 python:3.9
# 只读文件系统(增强安全性)
docker run --read-only alpine touch /tmp/test
bash复制# 日志驱动配置(生产推荐json-file)
docker run --log-driver=json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
经过三年容器化运维,最深刻的体会是:命令参数组合比记忆单条命令更重要。建议将常用命令封装成Makefile或shell脚本,比如这个服务重启脚本:
bash复制#!/bin/bash
container=$1
docker stop $container && \
docker rm $container && \
docker run -d --name $container \
--restart unless-stopped \
-v ${container}_data:/data \
${container}:latest