Docker 常用命令参考
镜像管理
# 查看所有镜像
docker images
# 搜索镜像
docker search <名称>
# 拉取镜像
docker pull <镜像名>:<标签>
# 删除镜像
docker rmi <镜像ID或名>
# 删除所有未被容器使用的镜像
docker image prune
# 查看镜像历史
docker history <镜像名>
# 将镜像保存为 tar 文件
docker save -o <文件名.tar> <镜像名>
# 从 tar 文件加载镜像
docker load -i <文件名.tar>
# 给镜像打标签
docker tag <源镜像> <新镜像名>:<标签>
镜像标签示例
docker pull nginx:latest
docker pull mysql:8.0
docker pull openjdk:17-jdk-slim
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
容器生命周期
# 创建并启动容器
docker run <选项> <镜像名> <命令>
# 启动已停止的容器
docker start <容器ID或名>
# 停止容器
docker stop <容器ID或名>
# 重启容器
docker restart <容器ID或名>
# 强制停止
docker kill <容器ID或名>
# 删除容器
docker rm <容器ID或名>
# 强制删除运行中的容器
docker rm -f <容器ID或名>
# 删除所有已停止的容器
docker container prune
docker run 常用选项
| 选项 |
作用 |
-d |
后台运行(detach) |
-it |
交互式终端 |
--name <名> |
指定容器名 |
-p 主机端口:容器端口 |
端口映射 |
-v 宿主机路径:容器路径 |
挂载卷 |
-e KEY=VALUE |
环境变量 |
--restart always |
自动重启 |
--network <网络名> |
指定网络 |
--rm |
容器停止后自动删除 |
docker run 示例
# 后台运行 nginx,映射端口
docker run -d --name my-nginx -p 8080:80 nginx:latest
# 运行 MySQL,设置密码和挂载数据
docker run -d --name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root123 \
-v /data/mysql:/var/lib/mysql \
mysql:8.0
# 交互式运行并进入容器
docker run -it --name ubuntu-test ubuntu:22.04 bash
# 容器停止后自动删除(适合测试)
docker run --rm -it alpine sh
容器管理
# 查看运行中的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 查看容器日志
docker logs <容器ID或名>
# 实时跟踪日志
docker logs -f <容器ID或名>
# 查看最近 N 条日志
docker logs --tail 100 <容器ID或名>
# 进入容器内部
docker exec -it <容器ID或名> bash
# 如果容器没有 bash 用 sh
docker exec -it <容器ID或名> sh
# 在容器内执行命令
docker exec <容器ID或名> <命令>
# 查看容器详情(JSON)
docker inspect <容器ID或名>
# 查看容器资源使用
docker stats
# 查看容器进程
docker top <容器ID或名>
# 从容器复制文件到宿主机
docker cp <容器ID>:<容器内路径> <宿主机路径>
# 从宿主机复制文件到容器
docker cp <宿主机路径> <容器ID>:<容器内路径>
# 重命名容器
docker rename <旧名> <新名>
Dockerfile 构建
# 基础镜像
FROM openjdk:17-jdk-slim
# 维护者
LABEL author="your-name"
# 设置工作目录
WORKDIR /app
# 复制文件到镜像
COPY target/app.jar app.jar
# 挂载卷声明
VOLUME /tmp
# 暴露端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
# 构建镜像
docker build -t <镜像名>:<标签> <Dockerfile目录>
# 指定 Dockerfile 构建
docker build -f <Dockerfile路径> -t <镜像名>:<标签> .
# 构建时不使用缓存
docker build --no-cache -t <镜像名>:<标签> .
# 多阶段构建示例(用 alpine 缩小体积)
docker build --target <阶段名> -t <镜像名>:<标签> .
构建示例
docker build -t my-app:1.0.0 .
docker build -f Dockerfile.prod -t my-app:prod .
网络管理
# 查看网络列表
docker network ls
# 创建网络
docker network create <网络名>
# 创建指定驱动的网络
docker network create --driver bridge <网络名>
# 查看网络详情
docker inspect <网络名>
# 将容器连接到网络
docker network connect <网络名> <容器ID>
# 断开容器网络
docker network disconnect <网络名> <容器ID>
# 删除网络
docker network rm <网络名>
# 删除所有未使用的网络
docker network prune
网络模式
| 模式 |
说明 |
bridge |
默认,容器间通过网桥通信 |
host |
容器直接使用宿主机网络 |
none |
无网络 |
overlay |
跨宿主机通信(Swarm) |
网络示例
# 创建自定义网络,容器间通过容器名通信
docker network create my-network
docker run -d --name mysql --network my-network mysql:8.0
docker run -d --name app --network my-network my-app:latest
# app 容器里可以直接用 hostname "mysql" 访问数据库
数据卷管理
# 创建数据卷
docker volume create <卷名>
# 查看所有数据卷
docker volume ls
# 查看数据卷详情
docker volume inspect <卷名>
# 删除数据卷
docker volume rm <卷名>
# 删除所有未使用的数据卷
docker volume prune
# 使用 bind mount(挂载宿主机目录)
docker run -v /宿主机/路径:/容器/路径 <镜像>
# 使用数据卷
docker run -v <卷名>:/容器/路径 <镜像>
# 只读挂载
docker run -v /宿主机/路径:/容器/路径:ro <镜像>
数据卷示例
docker volume create mydata
docker run -d --name mysql \
-v mydata:/var/lib/mysql \
mysql:8.0
Docker Compose
# docker-compose.yml 示例
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql
restart: always
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root123
volumes:
- mysql-data:/var/lib/mysql
app:
build: .
container_name: my-app
restart: always
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/db
depends_on:
- mysql
volumes:
mysql-data:
# 启动所有服务(后台)
docker-compose up -d
# 启动指定服务
docker-compose up -d mysql
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose stop
# 停止并删除容器
docker-compose down
# 停止并删除容器、网络、数据卷
docker-compose down -v
# 重新构建后启动
docker-compose up -d --build
# 查看配置
docker-compose config
# 重启服务
docker-compose restart
清理维护
# 查看磁盘使用
docker system df
# 清理所有未使用的资源(容器、网络、镜像、构建缓存)
docker system prune
# 包括数据卷一起清理
docker system prune -a --volumes
# 清理所有停止的容器
docker container prune
# 清理所有未使用的镜像
docker image prune
# 清理所有未使用的镜像(包括没有标签的)
docker image prune -a
# 清理所有未使用的数据卷
docker volume prune
# 清理构建缓存
docker builder prune
日志与调试
# 查看 Docker 系统事件
docker events
# 查看 Docker 系统信息
docker info
# 查看容器日志(带时间戳)
docker logs -t <容器ID>
# 查看容器改动文件
docker diff <容器ID>
# 导出容器文件系统
docker export <容器ID> -o <文件名.tar>
# 从快照导入镜像
docker import <文件名.tar> <镜像名>:<标签>
常用组合技巧
# 删除所有容器(包括运行中的)
docker rm -f $(docker ps -aq)
# 删除所有镜像
docker rmi -f $(docker images -q)
# 停止所有容器
docker stop $(docker ps -q)
# 批量删除名称包含关键字的容器
docker rm -f $(docker ps -a | grep <关键字> | awk '{print $1}')
容器内常用技巧
# 进入容器后查看 Alpine 包
apk add <包名>
# 进入容器后查看 Ubuntu/Debian 包
apt-get update && apt-get install -y <包名>
# 容器内查看网络
ip addr # 或 ifconfig
# 容器内测试网络连通
ping <目标地址>
telnet <目标地址> <端口>
curl <URL>
# 容器内查看进程
ps aux
常见问题排查
# 容器启动后立即退出
docker logs <容器ID> # 查看错误日志
# 端口被占用
netstat -ano | findstr :<端口号> # Windows
lsof -i :<端口号> # Linux
# 磁盘空间不足
docker system df
docker system prune -a
# 容器无法删除
docker rm -f <容器ID> # 强制删除
# 查看容器启动命令
docker inspect <容器ID> | grep Cmd