Docker 常用操作
Docker 作为现代应用开发和部署的利器,已经成为开发者和运维人员的必备技能。无论你是刚刚接触 Docker 的新手,还是有一定经验的用户,掌握以下几个核心操作都能显著提升你的工作效率。本文将详细介绍 Docker 的常用操作,包括镜像管理、容器操作等实用技巧。
一、Docker 镜像管理
1. 拷贝 Docker 镜像
在实际工作中,我们经常需要在不同环境之间迁移 Docker 镜像。以下是几种常见的方法:
方法一:使用 docker save 和 docker load(推荐)
这是最常用的镜像迁移方法,适合离线环境或网络受限的场景。
bash
# 将镜像保存为tar文件
docker save -o myimage.tar nginx:latest
# 将tar文件拷贝到目标机器(可以使用scp、rsync等工具)
scp myimage.tar user@remote-server:/path/to/
# 在目标机器上加载镜像
docker load -i myimage.tar
# 验证镜像是否加载成功
docker images | grep nginx
方法二:使用 docker export 和 docker import
这种方法适用于容器运行时状态的迁移,但不推荐用于镜像分发(会丢失元数据)。
bash
# 导出容器为tar文件
docker export container_id > mycontainer.tar
# 导入为镜像
docker import mycontainer.tar my-custom-image:tag
方法三:使用 Docker Hub 等镜像仓库
对于可以访问公网的环境,使用镜像仓库是最方便的方式。
bash
# 1. 登录 Docker Hub
docker login
# 2. 给镜像打标签(格式:username/repository:tag)
docker tag nginx:latest yourusername/nginx-custom:1.0
# 3. 推送到远程仓库
docker push yourusername/nginx-custom:1.0
# 4. 在目标机器上拉取镜像
docker pull yourusername/nginx-custom:1.0
方法四:使用 docker commit(从容器创建镜像)
bash
# 基于运行的容器创建新镜像
docker commit [容器ID] [新镜像名]:[标签]
# 示例:将运行的nginx容器保存为镜像
docker commit abc123 my-nginx:v1.0
# 验证新镜像
docker images my-nginx
2. 删除 Docker 镜像
随着使用时间的增长,系统中会积累很多不再需要的镜像,及时清理可以节省磁盘空间。
基本删除操作
bash
# 删除单个镜像(通过镜像ID)
docker rmi image_id
# 删除单个镜像(通过镜像名:标签)
docker rmi nginx:latest
# 强制删除(即使有容器正在使用)
docker rmi -f image_id
批量删除操作
bash
# 删除所有未被使用的镜像(悬空镜像)
docker image prune
# 强制删除所有未被使用的镜像(不提示确认)
docker image prune -f
# 删除所有未被容器使用的镜像(包括有标签但未被使用的)
docker image prune -a
# 按条件删除镜像
docker images | grep "none" | awk '{print $3}' | xargs docker rmi
# 删除指定仓库的所有镜像
docker images | grep "my-repo" | awk '{print $1":"$2}' | xargs docker rmi
删除所有镜像(谨慎使用!)
bash
# 删除所有镜像(包括正在被容器使用的)
docker rmi -f $(docker images -q)
# 或者分步进行
docker stop $(docker ps -aq) # 停止所有容器
docker rm $(docker ps -aq) # 删除所有容器
docker rmi $(docker images -q) # 删除所有镜像
二、Docker 容器操作
3. 查看运行的 Docker 容器
了解如何查看和管理正在运行的容器是 Docker 日常操作的基础。
查看容器状态
bash
# 查看正在运行的容器
docker ps
# 查看所有容器(包括已停止的)
docker ps -a
# 查看最近创建的容器
docker ps -l
# 查看最后n个创建的容器
docker ps -n 3
# 仅显示容器ID
docker ps -q
# 显示完整信息(包括命令、端口映射等)
docker ps --no-trunc
# 格式化输出(自定义显示列)
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"
查看容器详细信息
bash
# 查看容器的详细信息(JSON格式)
docker inspect container_id
# 查看特定信息(如IP地址)
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id
# 查看容器端口映射
docker port container_id
# 查看容器日志
docker logs container_id
# 实时查看容器日志(类似tail -f)
docker logs -f container_id
# 查看容器资源使用情况
docker stats container_id
# 查看所有容器的资源使用情况
docker stats --all
实用组合命令
bash
# 显示所有容器的简洁信息
docker ps -a --format "table {{.ID}}\t{{.Image}}\t{{.Names}}\t{{.Status}}"
# 显示所有容器及其IP地址
docker ps -q | xargs docker inspect --format='{{.Id}} - {{.Name}} - {{.NetworkSettings.IPAddress}}'
# 清理所有已停止的容器
docker container prune
4. 进入 Docker 容器
进入容器内部进行操作是调试和排查问题的常用手段。
方法一:使用 docker exec(推荐)
docker exec 可以在运行的容器中执行命令,是最常用的进入容器的方式。
bash
# 在容器中执行单条命令
docker exec container_id ls -la /app
# 进入容器的交互式bash终端
docker exec -it container_id /bin/bash
# 进入容器的sh终端(如果bash不存在)
docker exec -it container_id /bin/sh
# 以特定用户身份进入容器
docker exec -it -u root container_id /bin/bash
# 指定工作目录
docker exec -it -w /app container_id /bin/bash
# 设置环境变量
docker exec -it -e MY_VAR=value container_id /bin/bash
方法二:使用 docker attach
docker attach 可以连接到正在运行的容器的标准输入/输出,但不推荐用于日常操作。
bash
# 连接到容器的标准输入/输出
docker attach container_id
# 退出attach模式(注意:直接退出可能会停止容器)
# 使用快捷键:Ctrl+P, Ctrl+Q 可以退出而不停止容器
重要区别:
docker exec:创建新的进程进入容器,退出时不会影响原有进程docker attach:连接到现有进程,退出时可能会停止容器
方法三:使用 docker run 直接进入
在创建容器时就进入交互模式:
bash
# 创建并立即进入容器
docker run -it --name mycontainer ubuntu:latest /bin/bash
# 创建后台容器,然后进入
docker run -d --name mycontainer ubuntu:latest tail -f /dev/null
docker exec -it mycontainer /bin/bash
实用技巧和注意事项
bash
# 1. 如果容器中没有bash/sh,可以安装
docker exec container_id apt-get update && apt-get install -y bash
# 2. 临时文件操作
# 从宿主机拷贝文件到容器
docker cp local_file.txt container_id:/path/in/container/
# 从容器拷贝文件到宿主机
docker cp container_id:/path/in/container/file.txt ./local_copy.txt
# 3. 查看容器中的进程
docker top container_id
# 4. 在容器和宿主机之间同步时间
docker exec container_id date
docker exec container_id ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 5. 调试容器网络
docker exec container_id ping google.com
docker exec container_id curl http://localhost:80
容器内常用操作示例
bash
# 进入MySQL容器
docker exec -it mysql_container mysql -u root -p
# 进入Redis容器
docker exec -it redis_container redis-cli
# 进入Nginx容器查看配置文件
docker exec -it nginx_container cat /etc/nginx/nginx.conf
# 在容器中安装工具(用于调试)
docker exec container_id apt-get update
docker exec container_id apt-get install -y curl net-tools vim
# 查看容器环境变量
docker exec container_id env
三、Docker 日常维护小贴士
磁盘空间管理
bash
# 查看Docker磁盘使用情况
docker system df
# 详细查看各组件磁盘使用
docker system df -v
# 清理所有无用数据
docker system prune -a
# 清理指定时间前的数据
docker image prune --filter "until=24h"
容器生命周期管理
bash
# 启动/停止/重启容器
docker start container_id
docker stop container_id
docker restart container_id
# 暂停/恢复容器
docker pause container_id
docker unpause container_id
# 重命名容器
docker rename old_name new_name
# 更新容器配置(需要重新创建)
docker update --memory=512m container_id
网络管理
bash
# 查看网络列表
docker network ls
# 查看网络详情
docker network inspect network_name
# 连接/断开容器网络
docker network connect network_name container_id
docker network disconnect network_name container_id
实用命令速查表
| 操作 | 命令 | 说明 |
|---|---|---|
| 镜像拷贝 | docker save -o image.tar image:tag |
保存镜像为文件 |
docker load -i image.tar |
从文件加载镜像 | |
| 镜像删除 | docker rmi image_id |
删除指定镜像 |
docker image prune |
清理悬空镜像 | |
| 查看容器 | docker ps |
查看运行中的容器 |
docker ps -a |
查看所有容器 | |
| 进入容器 | docker exec -it container_id /bin/bash |
进入容器终端 |
docker attach container_id |
连接到容器进程 | |
| 容器操作 | docker start/stop/restart |
启停容器 |
docker logs container_id |
查看容器日志 | |
| 系统维护 | docker system df |
查看磁盘使用 |
docker system prune |
清理无用数据 |
最佳实践建议
-
命名规范
- 使用有意义的镜像标签(如
app:v1.2.3) - 为容器指定名称(
--name参数) - 使用标签(label)组织镜像和容器
- 使用有意义的镜像标签(如
-
数据持久化
- 重要数据使用volume或bind mount
- 避免在容器内存储重要数据
-
资源限制
- 为容器设置内存和CPU限制
- 监控容器资源使用情况
-
安全性
- 使用非root用户运行容器
- 定期更新基础镜像
- 扫描镜像中的安全漏洞
总结
掌握这些 Docker 常用操作后,你将能够更加自如地管理容器化应用。记住,实践是最好的学习方式------多动手操作,遇到问题查阅官方文档,你会很快成为 Docker 使用高手。Docker 的世界还有很多高级功能等待探索,但这些基础操作已经能够覆盖 80% 的日常使用场景。
小提示: 使用命令别名可以大幅提高效率,例如在 ~/.bashrc 中添加:
bash
alias dps='docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}"'
alias dimg='docker images'
alias dlog='docker logs -f'