# Docker 常用命令 > 按「生命周期」组织,从拉取镜像到清理收尾,日常 90% 的操作都在以下命令中。 --- ## 一、镜像管理(Image) ```bash # 拉取镜像 docker pull nginx:latest # 拉取最新标签 docker pull redis:7-alpine # 拉取精简版(alpine 体积更小) docker pull node:20-slim # 查看所有镜像 docker images # 或 docker image ls # 搜索镜像 docker search nginx # 搜索官方和社区镜像 # 给镜像打标签 docker tag my-app:latest myrepo/my-app:v1.0 # 删除镜像 docker rmi nginx # 删除单个 docker rmi $(docker images -q) # 删除所有镜像(谨慎) # 构建镜像 docker build -t my-app:v1.0 . # 当前目录构建(默认用 Dockerfile) docker build -t my-app:v1.0 -f Dockerfile.prod . # 指定 Dockerfile ``` **镜像分层缓存:** `docker build` 从上到下逐行执行,每一行都会生成一层缓存。把**不变的部分放前面**(安装依赖),**变化的部分放后面**(复制代码),充分利用缓存加速。 --- ## 二、容器管理(Container) ```bash # 运行容器 docker run -d -p 8080:80 --name web nginx # -d 后台运行(detached) # -p 8080:80 宿主机端口:容器端口 # --name 容器名称(方便后续操作) # 前台运行(查看日志用) docker run -it --rm nginx bash # -i 交互式 -t 终端 --rm 退出后自动删除 # 查看所有容器(含已停止的) docker ps -a # 或 docker container ls -a # 查看运行中的容器 docker ps # 启动/停止/重启容器 docker start web docker stop web # 优雅停止(发 SIGTERM,等 10s 后 SIGKILL) docker restart web docker kill web # 强制停止(发 SIGKILL) # 进入运行中的容器 docker exec -it web bash # 在运行中的容器里执行命令 docker exec -it web sh # 有些精简镜像没有 bash,用 sh # 删除容器 docker rm web # 删除已停止的容器 docker rm -f web # 强制删除运行中的容器 # 查看容器日志 docker logs web docker logs -f web # 实时跟踪日志(类似 tail -f) docker logs --tail 100 web # 只看最后 100 行 ``` **`docker run` 常用参数速查:** | 参数 | 作用 | |------|------| | `-d` | 后台运行 | | `-p host:container` | 端口映射 | | `-v host:container` | 挂载卷 | | `-e KEY=VALUE` | 设置环境变量 | | `--name` | 容器名称 | | `--network` | 指定网络 | | `--restart=always` | 容器崩溃/开机自动重启 | | `--rm` | 退出后自动删除(临时调试用) | | `-it` | 交互式终端 | | `--gpus all` | 启用 GPU(NVIDIA) | --- ## 三、网络管理(Network) ```bash # 查看所有网络 docker network ls # 创建自定义网络 docker network create my-network # 容器加入指定网络 docker run -d --name web1 --network my-network nginx docker run -d --name db1 --network my-network mysql # 容器间通过名称互相访问(自动 DNS 解析) docker exec web1 ping db1 # 在同一网络下可直接 ping 容器名 # 删除网络 docker network rm my-network ``` > **为什么需要自定义网络?** Docker 默认的 `bridge` 网络不支持容器名 DNS 解析。自定义网络(`docker network create`)可以让容器通过**名字**互相通信。 --- ## 四、数据卷(Volume) ```bash # 查看所有卷 docker volume ls # 创建卷 docker volume create my-data # 挂载卷到容器 docker run -d -v my-data:/data --name app nginx # 挂载宿主机目录到容器(bind mount) docker run -d -v /host/path:/container/path nginx # 只读挂载 docker run -d -v my-data:/data:ro nginx # 查看卷详情 docker volume inspect my-data ``` > **数据持久化原则:** 容器是** ephemeral(易失的)**——删除容器,容器内的数据就没了。必须用 `-v` 把数据存到宿主机或 Docker Volume 中。 --- ## 五、日志与调试 ```bash # 进入容器 docker exec -it <容器名> bash # 查看容器资源占用 docker stats # 查看容器详情 docker inspect web # 查看容器进程 docker top web # 拷贝文件进出容器 docker cp container.log web:/tmp/ docker cp web:/tmp/remote.log ./local.log # 查看容器创建命令 docker history my-app:v1.0 # 查看镜像构建历史 ``` --- ## 六、清理命令(重要!) ```bash # 删除所有已停止的容器 docker container prune # 删除所有未使用的镜像 docker image prune -a # 删除所有未使用的卷 docker volume prune # 一键清理(容器+镜像+卷+网络,谨慎使用) docker system prune -a # 查看磁盘占用 docker system df ``` --- ## 七、常用完整命令场景 ### 7.1 运行 Nginx ```bash docker run -d \ -p 80:80 \ -v ./nginx.conf:/etc/nginx/nginx.conf:ro \ -v ./html:/usr/share/nginx/html \ --name my-nginx \ --restart=always \ nginx:alpine ``` ### 7.2 运行 MySQL ```bash docker run -d \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=root123 \ -e MYSQL_DATABASE=mydb \ -v mysql-data:/var/lib/mysql \ --name my-mysql \ --restart=always \ mysql:8.0 ``` ### 7.3 运行 Redis ```bash docker run -d \ -p 6379:6379 \ -v redis-data:/data \ --name my-redis \ redis:7-alpine redis-server --appendonly yes --restart=always ``` ### 7.4 运行 Node 开发环境 ```bash docker run -it \ -p 3000:3000 \ -v $(pwd):/app \ -w /app \ node:20 \ bash # -v $(pwd):/app 挂载项目目录,修改代码实时生效 # -w /app 设置工作目录 ``` --- ## 七、进阶:Docker 网络模式 ```bash # Docker 提供四种网络模式 # 1. bridge(默认)— 桥接网络,容器有独立 IP docker run -d --network bridge nginx # 2. host — 共享宿主机网络,性能最好但端口会冲突 docker run -d --network host nginx # 3. none — 无网络(隔离) docker run -d --network none nginx # 4. container — 共享另一个容器的网络命名空间 docker run -d --network container:web nginx # 推荐使用自定义 bridge 网络(前面已讲过) docker network create my-net docker run -d --network my-net --name app nginx ``` ## 八、进阶:Docker 日志驱动 ```bash # 查看容器的日志配置 docker inspect web | grep LogConfig # 日志驱动类型 # json-file — 默认,日志写入文件 # local — 循环写入,控制大小 # syslog — 发送到 syslog # journald — 发送到 systemd journal # none — 不记录日志 # docker-compose 中限制日志大小 services: api: logging: driver: json-file options: max-size: "10m" # 单个日志文件最大 10MB max-file: "3" # 最多保留 3 个文件 ``` ## 九、进阶:Docker 资源限制 ```bash # 限制 CPU 和内存 docker run -d \ --cpus="1.5" \ # 限制 1.5 个 CPU 核心 --memory="512m" \ # 限制 512MB 内存 --memory-swap="1g" \ # 允许使用的 swap 总量 --pids-limit=100 \ # 最多 100 个进程(防 fork 炸弹) nginx # docker-compose 中配置 services: api: deploy: resources: limits: cpus: '1.5' memory: 512M reservations: cpus: '0.5' memory: 128M ``` ## 十、进阶:Docker Swarm(简易集群) ```bash # 初始化集群(单节点) docker swarm init # 查看节点 docker node ls # 创建服务(Swarm 管理方式) docker service create --name web -p 80:80 --replicas 3 nginx # 扩容 docker service scale web=5 # 查看服务 docker service ls # 更新服务(零停机滚动更新) docker service update --image nginx:1.25 web # 删除服务 docker service rm web # 退出集群 docker swarm leave # 初始化集群 + 管理节点令牌 + 工作节点令牌 docker swarm init --advertise-addr docker swarm join-token manager # 添加管理节点 docker swarm join-token worker # 添加工作节点 ``` > Swarm 适合轻量级部署。大规模生产环境建议用 Kubernetes。 ## 十一、快速速查表 | 操作 | 命令 | |------|------| | 启动 Docker 服务 | `systemctl start docker` | | 查看版本 | `docker --version` | | 查看信息 | `docker info` | | 登录镜像仓库 | `docker login` | | 推送镜像 | `docker push my-app:v1.0` | | 导出镜像 | `docker save -o my-app.tar my-app:v1.0` | | 导入镜像 | `docker load -i my-app.tar` | | 查看容器日志 | `docker logs -f <容器名>` | | 进入容器 | `docker exec -it <容器名> bash` | | 停止所有容器 | `docker stop $(docker ps -q)` | | 删除所有容器 | `docker rm -f $(docker ps -aq)` | | 查看磁盘占用 | `docker system df` | | 全面清理 | `docker system prune -a` |