适用对象:Docker 初学者及运维人员
目标:通过清晰分类、详实示例,覆盖日常操作、排错、资源扩容及容器内数据操作(含exec进入数据库并导入文件)。
一、基础信息查看
| 命令 | 说明 |
|---|---|
docker version | 查看 Docker 客户端与服务端版本信息 |
docker info | 查看系统级信息(镜像数、容器数、存储驱动、根目录等) |
docker <命令> --help | 查看任意子命令的帮助文档 |
示例:
dockerversiondockerinfodockerrun--help二、镜像管理(Image)
1. 列出本地镜像
dockerimages# 默认显示所有顶层镜像dockerimages-a# 显示所有层(含中间层)dockerimages-q# 只显示镜像 IDdockerimages--format"table {{.Repository}}\t{{.Tag}}\t{{.Size}}"# 自定义输出格式2. 搜索远程镜像(Docker Hub)
dockersearch nginx# 搜索 nginxdockersearch mysql--filter=STARS=3000# 仅显示 stars ≥ 3000 的镜像3. 拉取镜像
dockerpull nginx:latest# 拉取最新版dockerpull mysql:5.7# 拉取指定 tag4. 删除镜像
dockerrmi<image_id># 删除指定镜像(需无容器使用)dockerrmi-f<image_id># 强制删除dockerrmi-f$(dockerimages-aq)# 删除所有镜像(危险操作)三、容器管理(Container)
1. 创建并启动容器
基本语法:
dockerrun[OPTIONS]IMAGE[COMMAND][ARG...]常用选项:
| 选项 | 作用 |
|---|---|
--name <name> | 指定容器名称 |
-d | 后台运行(detach) |
-it | 交互式(如进入 bash) |
-p 主机端口:容器端口 | 端口映射 |
-v 主机目录:容器目录 | 挂载数据卷(持久化) |
--restart=always | 自动重启策略 |
--privileged=true | 赋予特权(用于 systemd 等) |
-h <hostname> | 设置容器主机名 |
--cpus、-m | 限制 CPU / 内存(见扩容部分) |
示例:
# 创建并运行一个交互式 centos 容器dockerrun-it--namemycentos centos:7 /bin/bash# 后台运行 nginx,映射 8080 端口dockerrun-d--nameweb-p8080:80 nginx# 运行 MySQL 并挂载数据卷dockerrun-d--namemysql57-p3306:3306-v/my/data:/var/lib/mysql-eMYSQL_ROOT_PASSWORD=123456mysql:5.72. 列出容器
dockerps# 仅显示运行中的容器dockerps-a# 显示所有容器(含已停止)dockerps-n5# 显示最近创建的 5 个容器dockerps-q# 只显示容器 ID3. 启动 / 停止 / 重启 / 强制停止
dockerstart<container_id/name>dockerstop<container_id/name>dockerrestart<container_id/name>dockerkill<container_id/name># 强制停止(SIGKILL)4. 删除容器
dockerrm<container_id># 删除已停止的容器dockerrm-f<container_id># 强制删除运行中的容器dockerrm-f$(dockerps-aq)# 删除所有容器(危险)dockerps-a-q|xargsdockerrm# 同上5. 进入运行中的容器(重点)
方式一:docker exec(推荐,新开进程)
dockerexec-it<container><command>-it交互式终端- 常用命令:
/bin/bash、sh、/bin/sh
示例:
# 进入容器 bashdockerexec-itmycentos /bin/bash# 直接在容器内执行命令(不进入)dockerexec-itmycentosls-l/home# 进入 MySQL 容器并执行 mysql 客户端dockerexec-itmysql57 mysql-uroot-p方式二:docker attach(连接到主进程)
dockerattach<container>会连接到容器的主进程(如 nginx 的 PID 1),通常不用来执行管理操作。
6. 从容器内拷贝文件
宿主机 → 容器:
dockercp/host/file.txt<container>:/container/path/容器 → 宿主机:
dockercp<container>:/container/file.txt /host/path/示例:
# 将本地 dump.sql 拷贝到 MySQL 容器内dockercp./dump.sql mysql57:/tmp/# 然后在容器内执行导入dockerexec-itmysql57 mysql-uroot-p123456-e"source /tmp/dump.sql"实战技巧:也可以直接用重定向导入,无需拷贝文件
docker exec -i mysql57 mysql -uroot -p123456 < ./dump.sql
(-i保持 stdin 打开,<重定向本地文件)
四、日志与调试
1. 查看容器日志
dockerlogs<container># 输出全部日志dockerlogs-f<container># 跟踪实时日志(类似 tail -f)dockerlogs--tail100-f<container># 仅显示最后 100 行并跟踪dockerlogs-t<container># 显示时间戳2. 查看容器内进程
dockertop<container>3. 查看容器详细信息(元数据)
dockerinspect<container># 返回 JSON 格式,包含网络、挂载、配置等dockerinspect--format='{{.NetworkSettings.IPAddress}}'<container># 仅获取 IP4. 容器资源实时监控
dockerstats# 显示所有运行中容器的 CPU、内存、网络等dockerstats<container># 仅查看指定容器五、数据卷(Volume)与持久化
1. 创建数据卷
dockervolume create myvolume2. 查看所有卷
dockervolumels3. 挂载卷(在docker run时)
# 使用已创建的卷dockerrun-d-vmyvolume:/app/data--nameapp alpine# 绑定挂载(主机目录)dockerrun-d-v/host/data:/container/data--nameapp alpine# 使用 --mount(更明确的语法)dockerrun-d--mountsource=myvolume,target=/app/data--nameapp alpine4. 删除卷
dockervolumerm<volume_name>dockervolume prune# 删除所有未使用的卷六、资源限制与扩容(Storage & Resource Scaling)
1. 查看 Docker 磁盘占用
dockersystemdf# 查看镜像、容器、卷、构建缓存的空间占用dockersystemdf-v# 显示详细信息(逐项列出)2. 清理无用数据(释放磁盘空间)
dockersystem prune# 删除停止的容器、未被使用的网络、悬空镜像、构建缓存dockersystem prune-a# 更彻底,删除所有未被使用的镜像dockerimage prune# 清理悬空镜像dockercontainer prune# 清理停止的容器dockervolume prune# 清理未使用的卷dockerbuilder prune# 清理构建缓存3. 调整容器资源限制(CPU / 内存)
创建时指定:
dockerrun-d--nameapp--cpus="2.0"-m="1g"nginx--cpus:允许使用的 CPU 核数(可小数)-m或--memory:最大内存--memory-swap:swap 限制(默认与内存相同)
运行中动态调整(需要 Docker 19.03+):
dockerupdate--cpus="1.5"-m="512m"<container>注意:内存限制只能在容器启动时设置,
update可以调整,但有些参数需重启生效。
4. Docker 存储空间扩容(针对数据目录)
Docker 默认存储在/var/lib/docker。当磁盘不足时,可采取以下方案:
方案一:将 Docker 数据目录迁移到更大的磁盘
systemctl stopdockermv/var/lib/docker /new/location/dockerln-s/new/location/docker /var/lib/docker# 软链接systemctl startdocker或修改
/etc/docker/daemon.json中的"data-root": "/new/path"。方案二(适用于 Overlay2):如果使用 LVM,可扩展逻辑卷,然后扩充文件系统。
具体操作:- 扩展物理卷 / 逻辑卷
lvextend -L +100G /dev/mapper/docker-dockerxfs_growfs或resize2fs扩展文件系统
此操作较高级,需保证 Docker 服务停止。
方案三:定期清理无用数据(见上方 prune)并合理使用卷,避免无限增长。
七、高级操作:提交容器为镜像 & 导入导出
1. 将容器保存为新镜像(commit)
dockercommit-m"added custom config"-a"author"<container><new_image:tag>2. 导出容器为 tar 归档(export)
dockerexport<container>>container.tar3. 从 tar 导入为镜像(import)
dockerimportcontainer.tar mynewimage:latest4. 保存镜像为 tar(save)与加载(load)
dockersave-omyimage.tar nginx:latestdockerload-imyimage.tar八、常用运维综合示例
示例 1:启动 MySQL 并导入数据
# 1. 运行 MySQL 容器dockerrun-d--namemysql57-p3306:3306-eMYSQL_ROOT_PASSWORD=root123 mysql:5.7# 2. 等待 MySQL 就绪(可用 docker logs 查看)dockerlogs-fmysql57# 看到 ready for connections 后 Ctrl+C 退出# 3. 拷贝本地 SQL 文件到容器dockercp./init.sql mysql57:/tmp/# 4. 执行导入(方式一:进入容器执行)dockerexec-itmysql57bash# 在容器内执行:mysql-uroot-proot123</tmp/init.sqlexit# 方式二:直接通过管道导入(无需拷贝)dockerexec-imysql57 mysql-uroot-proot123<./init.sqldockerexec-itmysqlsh-c"mysql -uroot -p 数据库名 < 导入路径"dockerexec-imysql57 mysql-uroot-p123456-vmydb<./backup.sql示例 2:进入正在运行的 Nginx 容器修改配置
dockerexec-itweb /bin/bash# 修改 /etc/nginx/nginx.conf 或 /usr/share/nginx/html 内容# 退出后执行 nginx -s reload(但容器内无信号,建议重启容器或使用 docker exec 发送信号)dockerexecweb nginx-sreload示例 3:清理磁盘空间(安全操作)
# 先查看占用情况dockersystemdf# 删除所有停止的容器、未使用的网络、悬空镜像、构建缓存dockersystem prune# 若确定要释放更多,可加上 -a(删除所有未使用的镜像)dockersystem prune-a# 单独清理卷(注意:会删除未使用的卷,可能丢失数据)dockervolume prune示例 4:迁移 Docker 数据目录到新磁盘
假设新磁盘挂载在/mnt/docker:
systemctl stopdockermkdir-p/mnt/dockerrsync-avxP/var/lib/docker/ /mnt/docker/mv/var/lib/docker /var/lib/docker.bak# 备份旧目录(可选)ln-s/mnt/docker /var/lib/docker systemctl startdocker# 检查确认无误后,删除备份: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