
适用对象:Docker 初学者及运维人员
目标:通过清晰分类、详实示例,覆盖日常操作、排错、资源扩容及容器内数据操作(含
exec进入数据库并导入文件)。
一、基础信息查看
| 命令 | 说明 |
|---|---|
docker version |
查看 Docker 客户端与服务端版本信息 |
docker info |
查看系统级信息(镜像数、容器数、存储驱动、根目录等) |
docker <命令> --help |
查看任意子命令的帮助文档 |
示例:
bash
docker version
docker info
docker run --help
二、镜像管理(Image)
1. 列出本地镜像
bash
docker images # 默认显示所有顶层镜像
docker images -a # 显示所有层(含中间层)
docker images -q # 只显示镜像 ID
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" # 自定义输出格式
2. 搜索远程镜像(Docker Hub)
bash
docker search nginx # 搜索 nginx
docker search mysql --filter=STARS=3000 # 仅显示 stars ≥ 3000 的镜像
3. 拉取镜像
bash
docker pull nginx:latest # 拉取最新版
docker pull mysql:5.7 # 拉取指定 tag
4. 删除镜像
bash
docker rmi <image_id> # 删除指定镜像(需无容器使用)
docker rmi -f <image_id> # 强制删除
docker rmi -f $(docker images -aq) # 删除所有镜像(危险操作)
三、容器管理(Container)
1. 创建并启动容器
基本语法:
bash
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用选项:
| 选项 | 作用 |
|---|---|
--name <name> |
指定容器名称 |
-d |
后台运行(detach) |
-it |
交互式(如进入 bash) |
-p 主机端口:容器端口 |
端口映射 |
-v 主机目录:容器目录 |
挂载数据卷(持久化) |
--restart=always |
自动重启策略 |
--privileged=true |
赋予特权(用于 systemd 等) |
-h <hostname> |
设置容器主机名 |
--cpus、-m |
限制 CPU / 内存(见扩容部分) |
示例:
bash
# 创建并运行一个交互式 centos 容器
docker run -it --name mycentos centos:7 /bin/bash
# 后台运行 nginx,映射 8080 端口
docker run -d --name web -p 8080:80 nginx
# 运行 MySQL 并挂载数据卷
docker run -d --name mysql57 -p 3306:3306 -v /my/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
2. 列出容器
bash
docker ps # 仅显示运行中的容器
docker ps -a # 显示所有容器(含已停止)
docker ps -n 5 # 显示最近创建的 5 个容器
docker ps -q # 只显示容器 ID
3. 启动 / 停止 / 重启 / 强制停止
bash
docker start <container_id/name>
docker stop <container_id/name>
docker restart <container_id/name>
docker kill <container_id/name> # 强制停止(SIGKILL)
4. 删除容器
bash
docker rm <container_id> # 删除已停止的容器
docker rm -f <container_id> # 强制删除运行中的容器
docker rm -f $(docker ps -aq) # 删除所有容器(危险)
docker ps -a -q | xargs docker rm # 同上
5. 进入运行中的容器(重点)
方式一:docker exec(推荐,新开进程)
bash
docker exec -it <container> <command>
-it交互式终端- 常用命令:
/bin/bash、sh、/bin/sh
示例:
bash
# 进入容器 bash
docker exec -it mycentos /bin/bash
# 直接在容器内执行命令(不进入)
docker exec -it mycentos ls -l /home
# 进入 MySQL 容器并执行 mysql 客户端
docker exec -it mysql57 mysql -uroot -p
方式二:docker attach(连接到主进程)
bash
docker attach <container>
会连接到容器的主进程(如 nginx 的 PID 1),通常不用来执行管理操作。
6. 从容器内拷贝文件
宿主机 → 容器:
bash
docker cp /host/file.txt <container>:/container/path/
容器 → 宿主机:
bash
docker cp <container>:/container/file.txt /host/path/
示例:
bash
# 将本地 dump.sql 拷贝到 MySQL 容器内
docker cp ./dump.sql mysql57:/tmp/
# 然后在容器内执行导入
docker exec -it mysql57 mysql -uroot -p123456 -e "source /tmp/dump.sql"
实战技巧 :也可以直接用重定向导入,无需拷贝文件
docker exec -i mysql57 mysql -uroot -p123456 < ./dump.sql(
-i保持 stdin 打开,<重定向本地文件)
四、日志与调试
1. 查看容器日志
bash
docker logs <container> # 输出全部日志
docker logs -f <container> # 跟踪实时日志(类似 tail -f)
docker logs --tail 100 -f <container> # 仅显示最后 100 行并跟踪
docker logs -t <container> # 显示时间戳
2. 查看容器内进程
bash
docker top <container>
3. 查看容器详细信息(元数据)
bash
docker inspect <container> # 返回 JSON 格式,包含网络、挂载、配置等
docker inspect --format='{{.NetworkSettings.IPAddress}}' <container> # 仅获取 IP
4. 容器资源实时监控
bash
docker stats # 显示所有运行中容器的 CPU、内存、网络等
docker stats <container> # 仅查看指定容器
五、数据卷(Volume)与持久化
1. 创建数据卷
bash
docker volume create myvolume
2. 查看所有卷
bash
docker volume ls
3. 挂载卷(在 docker run 时)
bash
# 使用已创建的卷
docker run -d -v myvolume:/app/data --name app alpine
# 绑定挂载(主机目录)
docker run -d -v /host/data:/container/data --name app alpine
# 使用 --mount(更明确的语法)
docker run -d --mount source=myvolume,target=/app/data --name app alpine
4. 删除卷
bash
docker volume rm <volume_name>
docker volume prune # 删除所有未使用的卷
六、资源限制与扩容(Storage & Resource Scaling)
1. 查看 Docker 磁盘占用
bash
docker system df # 查看镜像、容器、卷、构建缓存的空间占用
docker system df -v # 显示详细信息(逐项列出)
2. 清理无用数据(释放磁盘空间)
bash
docker system prune # 删除停止的容器、未被使用的网络、悬空镜像、构建缓存
docker system prune -a # 更彻底,删除所有未被使用的镜像
docker image prune # 清理悬空镜像
docker container prune # 清理停止的容器
docker volume prune # 清理未使用的卷
docker builder prune # 清理构建缓存
3. 调整容器资源限制(CPU / 内存)
创建时指定:
bash
docker run -d --name app --cpus="2.0" -m="1g" nginx
--cpus:允许使用的 CPU 核数(可小数)-m或--memory:最大内存--memory-swap:swap 限制(默认与内存相同)
运行中动态调整(需要 Docker 19.03+):
bash
docker update --cpus="1.5" -m="512m" <container>
注意:内存限制只能在容器启动时设置,
update可以调整,但有些参数需重启生效。
4. Docker 存储空间扩容(针对数据目录)
Docker 默认存储在 /var/lib/docker。当磁盘不足时,可采取以下方案:
-
方案一:将 Docker 数据目录迁移到更大的磁盘
bashsystemctl stop docker mv /var/lib/docker /new/location/docker ln -s /new/location/docker /var/lib/docker # 软链接 systemctl start docker或修改
/etc/docker/daemon.json中的"data-root": "/new/path"。 -
方案二 (适用于 Overlay2):如果使用 LVM,可扩展逻辑卷,然后扩充文件系统。
具体操作:
- 扩展物理卷 / 逻辑卷
lvextend -L +100G /dev/mapper/docker-dockerxfs_growfs或resize2fs扩展文件系统
此操作较高级,需保证 Docker 服务停止。
-
方案三:定期清理无用数据(见上方 prune)并合理使用卷,避免无限增长。
七、高级操作:提交容器为镜像 & 导入导出
1. 将容器保存为新镜像(commit)
bash
docker commit -m "added custom config" -a "author" <container> <new_image:tag>
2. 导出容器为 tar 归档(export)
bash
docker export <container> > container.tar
3. 从 tar 导入为镜像(import)
bash
docker import container.tar mynewimage:latest
4. 保存镜像为 tar(save)与加载(load)
bash
docker save -o myimage.tar nginx:latest
docker load -i myimage.tar
八、常用运维综合示例
示例 1:启动 MySQL 并导入数据
bash
# 1. 运行 MySQL 容器
docker run -d --name mysql57 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root123 mysql:5.7
# 2. 等待 MySQL 就绪(可用 docker logs 查看)
docker logs -f mysql57 # 看到 ready for connections 后 Ctrl+C 退出
# 3. 拷贝本地 SQL 文件到容器
docker cp ./init.sql mysql57:/tmp/
# 4. 执行导入(方式一:进入容器执行)
docker exec -it mysql57 bash
# 在容器内执行:
mysql -uroot -proot123 < /tmp/init.sql
exit
# 方式二:直接通过管道导入(无需拷贝)
docker exec -i mysql57 mysql -uroot -proot123 < ./init.sql
docker exec -it mysql sh -c "mysql -uroot -p 数据库名 < 导入路径"
docker exec -i mysql57 mysql -uroot -p123456 -v mydb < ./backup.sql
示例 2:进入正在运行的 Nginx 容器修改配置
bash
docker exec -it web /bin/bash
# 修改 /etc/nginx/nginx.conf 或 /usr/share/nginx/html 内容
# 退出后执行 nginx -s reload(但容器内无信号,建议重启容器或使用 docker exec 发送信号)
docker exec web nginx -s reload
示例 3:清理磁盘空间(安全操作)
bash
# 先查看占用情况
docker system df
# 删除所有停止的容器、未使用的网络、悬空镜像、构建缓存
docker system prune
# 若确定要释放更多,可加上 -a(删除所有未使用的镜像)
docker system prune -a
# 单独清理卷(注意:会删除未使用的卷,可能丢失数据)
docker volume prune
示例 4:迁移 Docker 数据目录到新磁盘
假设新磁盘挂载在 /mnt/docker:
bash
systemctl stop docker
mkdir -p /mnt/docker
rsync -avxP /var/lib/docker/ /mnt/docker/
mv /var/lib/docker /var/lib/docker.bak # 备份旧目录(可选)
ln -s /mnt/docker /var/lib/docker
systemctl start docker
# 检查确认无误后,删除备份:rm -rf /var/lib/docker.bak
九、常见问题排查
| 问题 | 排查与解决 |
|---|---|
| 容器启动后立即退出 | 查看日志 docker logs <container>;可能前台进程不存在,需指定执行命令 |
| 端口被占用 | 修改映射端口,或 netstat -tulpn 查看占用进程 |
| 磁盘空间不足 | docker system df 并清理,或扩容数据目录 |
| 无法进入容器(无 bash) | 尝试 /bin/sh,或使用 docker exec -it <container> sh |
| 容器内时间错误 | 挂载 /etc/localtime:-v /etc/localtime:/etc/localtime:ro |
| 容器网络不通 | 检查端口映射,或使用 --network host(不推荐) |
十、附录:常用命令速查表
| 功能 | 命令 |
|---|---|
| 查看镜像 | docker images |
| 搜索镜像 | docker search <name> |
| 拉取镜像 | docker pull <name:tag> |
| 删除镜像 | docker rmi <id> |
| 运行容器 | docker run [options] <image> |
| 列出容器(运行中) | docker ps |
| 列出所有容器 | docker ps -a |
| 停止容器 | docker stop <container> |
| 启动容器 | docker start <container> |
| 重启容器 | docker restart <container> |
| 强制停止 | docker kill <container> |
| 删除容器 | docker rm <container> |
| 进入容器(新进程) | docker exec -it <container> /bin/bash |
| 查看日志 | docker logs -f <container> |
| 拷贝文件 | docker cp <src> <container>:<dest> |
| 查看资源使用 | docker stats |
| 查看磁盘占用 | docker system df |
| 清理无用资源 | docker system prune |
| 更新资源限制 | docker update [options] <container> |
| 查看元数据 | docker inspect <container> |
| 提交容器为镜像 | docker commit <container> <image:tag> |
最后叮嘱 :所有删除操作(
rm、rmi、prune)请谨慎执行,尤其是带-f或-a参数时,务必确认数据已备份或不需要保留。生产环境中,建议对重要数据使用
-v持久化卷,并定期备份卷内容。
EOF