一、先用版本和信息命令认识当前环境

在执行任何镜像或容器操作之前,先确认 Docker 当前环境是否正常是个非常好的习惯。

1.1 查看 Docker 版本

docker version

这个命令通常会显示:

  • Client 和 Server 版本
  • API 版本
  • Git Commit
  • containerd 版本
  • runc 版本

它适合用来快速确认当前机器上的 Docker 版本栈。

1.2 查看 Docker 详细信息

docker info

这个命令更适合排障和环境审计,重点可以看:

  • Storage Driver
  • Logging Driver
  • Cgroup Driver
  • Runtimes
  • Docker Root Dir
  • Registry Mirrors

二、镜像管理是 Docker 操作的起点

镜像是容器运行的模板,因此镜像管理通常是第一批必须掌握的命令。

2.1 搜索镜像

docker search nginx

2.2 拉取镜像

docker pull registry.cn-beijing.aliyuncs.com/dotbalo/counter:v1
docker pull nginx
docker pull nginx:1.15
docker pull --platform=linux/arm64 centos:7

这几条命令分别展示了:

  • 从指定仓库拉取镜像
  • 使用默认仓库拉取镜像
  • 拉取指定版本
  • 拉取指定系统架构镜像

2.3 上传镜像

docker push registry.cn-beijing.aliyuncs.com/dotbalo/counter:v1

2.4 查看本地镜像

docker images | grep nginx

2.5 修改镜像标签

docker tag nginx-v2 dotbalo/nginx-v2:test
docker tag nginx-v2 镜像仓库地址/nginx-v2:test

2.6 删除镜像

docker rmi 镜像ID

常见场景是清理无用镜像或清理 none 标签镜像。

2.7 导出与导入镜像

docker save -o counter-v2.tar registry.cn-beijing.aliyuncs.com/dotbalo/counter:v2
docker load -i counter-v2.tar

这组命令很适合离线环境传输镜像。

三、容器管理是日常使用最频繁的部分

3.1 启动容器

前台交互式启动:

docker run -ti nginx bash
docker run -ti --rm nginx bash

后台启动:

docker run -tid nginx bash

其中:

  • -ti 适合交互调试
  • --rm 适合临时容器,用完即删
  • -d 适合后台常驻服务

3.2 查看容器

docker ps
docker ps -a
docker ps -q
docker ps -aq

这几条命令分别用于:

  • 查看运行中的容器
  • 查看所有容器
  • 只看运行中容器 ID
  • 只看全部容器 ID

3.3 查看容器详细信息

docker inspect 1de2ef08945f | grep Port

3.4 查看日志

docker logs -f 容器ID或容器名称 --tail 1

3.5 进入容器

docker exec -ti 86b1c069024b bash

3.6 端口映射

docker run -ti -p 1111:80 nginx bash

3.7 停止容器

docker stop 600e5da5c196
docker stop web01

3.8 删除已退出容器

docker rm $(docker ps -a -q -f "status=exited")
docker ps -a | grep Exited | awk '{print $1}' | xargs docker rm

四、Docker 数据管理为什么特别重要

很多新手第一次接触容器时,最容易忽视的是数据问题。容器本身适合承载应用进程,但数据如果处理不好,就会在重建、迁移和更新时带来很多麻烦。

4.1 挂载文件和目录

挂载文件:

docker run -tid -p 1111:80 -v /etc/hosts:/etc/hosts registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.21.6 bash

挂载目录:

docker run -tid -p 1111:80 -v /mnt:/mnt registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.21.6 bash

4.2 不挂载时,数据会不会丢

原始笔记给了一个很有代表性的例子:在不挂载的情况下,把内容写进容器,再停止并重新启动同一个容器,数据依然存在。

示例流程如下:

docker run -tid --name test1 registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.21.6
docker exec -it 2b92c6f159ff bash
echo "123" > /usr/share/nginx/html/index.html

docker stop 2b92c6f159ff
docker start 2b92c6f159ff
docker exec 2b92c6f159ff cat /usr/share/nginx/html/index.html

这说明同一个容器重新启动后,原来写入容器可写层的数据还在。

4.3 为什么通常更推荐挂载目录

原始笔记里有一个很实用的结论:挂载目录通常优于直接挂载单文件。

原因在于:

  • 挂载文件时,宿主机文件 inode 变化可能导致同步行为不理想
  • 挂载目录时,宿主机文件变化更容易实时反映到容器内

因此在生产环境里,配置目录、静态资源目录和持久化数据目录的挂载通常更稳妥。

4.4 宿主机与容器之间拷贝文件

宿主机拷贝到容器:

docker cp README.md 92aceec0dcdd327a709bf0ec83:/tmp

容器拷贝到宿主机:

docker cp 92aceec0dcdd327a709bf0ec83:/tmp/README.md /tmp

五、Docker 部署服务时可以按什么顺序做

原始笔记最后给出了一套非常适合入门者记忆的通用部署步骤:

  • 确认需要部署的服务
  • 了解服务运行所需基础配置
  • 找到基础镜像
  • 下载镜像
  • 完成配置并启动服务
  • 做最终验证

这套方法看似简单,但其实非常实用。因为很多容器化部署失败,并不是命令不会,而是前置调研没做好,比如:

  • 不清楚服务依赖哪些环境变量
  • 不知道哪些目录必须挂载
  • 不知道端口如何映射
  • 不知道初始账号、密码或初始化方式

六、把这篇命令实践真正用起来

如果你是刚开始学 Docker,建议不要一口气背所有命令,而是优先把下面几组最常用操作反复练熟:

  • pullimagestagrmi
  • runpsexeclogsstoprm
  • -p-vcp
  • saveload

当这些命令足够熟练后,再去学 Docker Compose、镜像构建、私有仓库、CI/CD 和 Kubernetes 工作负载,整个知识体系会顺很多。