适用对象:Docker 初学者及运维人员undefined目标:通过清晰分类、详实示例,覆盖日常操作、排错、资源扩容及容器内数据操作(含
exec进入数据库并导入文件)。

命令 | 说明 |
|---|---|
| 查看 Docker 客户端与服务端版本信息 |
| 查看系统级信息(镜像数、容器数、存储驱动、根目录等) |
| 查看任意子命令的帮助文档 |
示例:
docker version
docker info
docker run --helpdocker images # 默认显示所有顶层镜像
docker images -a # 显示所有层(含中间层)
docker images -q # 只显示镜像 ID
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}" # 自定义输出格式docker search nginx # 搜索 nginx
docker search mysql --filter=STARS=3000 # 仅显示 stars ≥ 3000 的镜像docker pull nginx:latest # 拉取最新版
docker pull mysql:5.7 # 拉取指定 tagdocker rmi <image_id> # 删除指定镜像(需无容器使用)
docker rmi -f <image_id> # 强制删除
docker rmi -f $(docker images -aq) # 删除所有镜像(危险操作)基本语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]常用选项:
选项 | 作用 |
|---|---|
| 指定容器名称 |
| 后台运行(detach) |
| 交互式(如进入 bash) |
| 端口映射 |
| 挂载数据卷(持久化) |
| 自动重启策略 |
| 赋予特权(用于 systemd 等) |
| 设置容器主机名 |
| 限制 CPU / 内存(见扩容部分) |
示例:
# 创建并运行一个交互式 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.7docker ps # 仅显示运行中的容器
docker ps -a # 显示所有容器(含已停止)
docker ps -n 5 # 显示最近创建的 5 个容器
docker ps -q # 只显示容器 IDdocker start <container_id/name>
docker stop <container_id/name>
docker restart <container_id/name>
docker kill <container_id/name> # 强制停止(SIGKILL)docker rm <container_id> # 删除已停止的容器
docker rm -f <container_id> # 强制删除运行中的容器
docker rm -f $(docker ps -aq) # 删除所有容器(危险)
docker ps -a -q | xargs docker rm # 同上docker exec(推荐,新开进程)docker exec -it <container> <command>-it 交互式终端/bin/bash、sh、/bin/sh示例:
# 进入容器 bash
docker exec -it mycentos /bin/bash
# 直接在容器内执行命令(不进入)
docker exec -it mycentos ls -l /home
# 进入 MySQL 容器并执行 mysql 客户端
docker exec -it mysql57 mysql -uroot -pdocker attach(连接到主进程)docker attach <container>会连接到容器的主进程(如 nginx 的 PID 1),通常不用来执行管理操作。
宿主机 → 容器:
docker cp /host/file.txt <container>:/container/path/容器 → 宿主机:
docker cp <container>:/container/file.txt /host/path/示例:
# 将本地 dump.sql 拷贝到 MySQL 容器内
docker cp ./dump.sql mysql57:/tmp/
# 然后在容器内执行导入
docker exec -it mysql57 mysql -uroot -p123456 -e "source /tmp/dump.sql"实战技巧:也可以直接用重定向导入,无需拷贝文件undefined
docker exec -i mysql57 mysql -uroot -p123456 < ./dump.sqlundefined(-i保持 stdin 打开,<重定向本地文件)
docker logs <container> # 输出全部日志
docker logs -f <container> # 跟踪实时日志(类似 tail -f)
docker logs --tail 100 -f <container> # 仅显示最后 100 行并跟踪
docker logs -t <container> # 显示时间戳docker top <container>docker inspect <container> # 返回 JSON 格式,包含网络、挂载、配置等
docker inspect --format='{{.NetworkSettings.IPAddress}}' <container> # 仅获取 IPdocker stats # 显示所有运行中容器的 CPU、内存、网络等
docker stats <container> # 仅查看指定容器docker volume create myvolumedocker volume lsdocker run 时)# 使用已创建的卷
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 alpinedocker volume rm <volume_name>
docker volume prune # 删除所有未使用的卷docker system df # 查看镜像、容器、卷、构建缓存的空间占用
docker system df -v # 显示详细信息(逐项列出)docker system prune # 删除停止的容器、未被使用的网络、悬空镜像、构建缓存
docker system prune -a # 更彻底,删除所有未被使用的镜像
docker image prune # 清理悬空镜像
docker container prune # 清理停止的容器
docker volume prune # 清理未使用的卷
docker builder prune # 清理构建缓存创建时指定:
docker run -d --name app --cpus="2.0" -m="1g" nginx--cpus:允许使用的 CPU 核数(可小数)-m 或 --memory:最大内存--memory-swap:swap 限制(默认与内存相同)运行中动态调整(需要 Docker 19.03+):
docker update --cpus="1.5" -m="512m" <container>注意:内存限制只能在容器启动时设置,
update可以调整,但有些参数需重启生效。
Docker 默认存储在 /var/lib/docker。当磁盘不足时,可采取以下方案:
systemctl 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"。
lvextend -L +100G /dev/mapper/docker-dockerxfs_growfs 或 resize2fs 扩展文件系统此操作较高级,需保证 Docker 服务停止。
commit)docker commit -m "added custom config" -a "author" <container> <new_image:tag>export)docker export <container> > container.tarimport)docker import container.tar mynewimage:latestsave)与加载(load)docker save -o myimage.tar nginx:latest
docker load -i myimage.tar# 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.sqldocker exec -it web /bin/bash
# 修改 /etc/nginx/nginx.conf 或 /usr/share/nginx/html 内容
# 退出后执行 nginx -s reload(但容器内无信号,建议重启容器或使用 docker exec 发送信号)
docker exec web nginx -s reload# 先查看占用情况
docker system df
# 删除所有停止的容器、未使用的网络、悬空镜像、构建缓存
docker system prune
# 若确定要释放更多,可加上 -a(删除所有未使用的镜像)
docker system prune -a
# 单独清理卷(注意:会删除未使用的卷,可能丢失数据)
docker volume prune假设新磁盘挂载在 /mnt/docker:
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问题 | 排查与解决 |
|---|---|
容器启动后立即退出 | 查看日志 |
端口被占用 | 修改映射端口,或 |
磁盘空间不足 |
|
无法进入容器(无 bash) | 尝试 |
容器内时间错误 | 挂载 |
容器网络不通 | 检查端口映射,或使用 |
功能 | 命令 |
|---|---|
查看镜像 |
|
搜索镜像 |
|
拉取镜像 |
|
删除镜像 |
|
运行容器 |
|
列出容器(运行中) |
|
列出所有容器 |
|
停止容器 |
|
启动容器 |
|
重启容器 |
|
强制停止 |
|
删除容器 |
|
进入容器(新进程) |
|
查看日志 |
|
拷贝文件 |
|
查看资源使用 |
|
查看磁盘占用 |
|
清理无用资源 |
|
更新资源限制 |
|
查看元数据 |
|
提交容器为镜像 |
|
最后叮嘱:所有删除操作(
rm、rmi、prune)请谨慎执行,尤其是带-f或-a参数时,务必确认数据已备份或不需要保留。undefined生产环境中,建议对重要数据使用-v持久化卷,并定期备份卷内容。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。