1. docker build – 从 file 到 image

docker build -t my-ubuntu:enhanced -f Dockerfile.ubuntu-enhanced .

说明:这是 Docker 中用于构建镜像的核心命令。

  • docker build:触发镜像构建流程。
  • -t my-ubuntu:enhanced-t 标志用于指定构建成功后新镜像的名称和标签,格式为 <镜像名>:<标签>。这里的 my-ubuntu 是镜像名称,enhanced 是标签。
  • -f Dockerfile.ubuntu-enhanced-f 标志指定用于构建的 Dockerfile 文件路径。如果不使用此选项,默认使用当前目录下名为 Dockerfile 的文件。
  • .:这个点代表构建上下文的路径,即 Dockerfile 中指令(如 COPY)的相对根目录。通常设置为 Dockerfile 所在的当前目录。

2. docker images – 罗列所有镜像

docker images | grep my-ubuntu:enhanced

说明:用于列出并筛选本地 Docker 镜像

  • docker images:列出所有已下载到本地的 Docker 镜像,包括镜像名、标签、镜像 ID、创建时间和大小。
  • | grep my-ubuntu:enhanced| 是管道符,将前一个命令的输出作为后一个命令的输入。grep 命令用于筛选文本行,这里会显示所有包含“my-ubuntu:enhanced”字符串的镜像信息行,用于快速确认镜像是否构建成功。

3. docker run – 从 image 到 container

docker run -it --name ros_installer my-ubuntu:enhanced /bin/bash

说明:用于创建并启动一个新的容器

  • docker run:创建并运行一个新容器。
  • -it:这是两个标志的组合。
    • -i--interactive):保持标准输入(STDIN)打开,允许你与容器交互。
    • -t--tty):分配一个伪终端(pseudo-TTY),让你获得一个类似终端的命令行界面。通常 -it 一起使用以实现交互式会话。
  • --name ros_installer:为即将启动的容器指定一个名称 ros_installer,方便后续通过名称引用该容器(如停止、查看日志)。
  • my-ubuntu:enhanced:指定用于创建容器的镜像。这里使用之前构建的 my-ubuntu:enhanced 镜像。
  • /bin/bash:容器启动后要执行的命令。这里是指定容器内的 Bash shell 作为交互式程序。

4. docker commit – 从 comtainer 到 image

docker commit ros_installer my-ubuntu:trans

说明:用于将容器的当前状态保存为一个新的镜像

  • docker commit:提交容器的更改,创建一个新的镜像层。
  • ros_installer:指定要被保存状态的源容器的名称(也可以是容器 ID)。这个容器必须是已创建(运行中或已停止均可)的。
  • my-ubuntu:trans:为新创建的镜像指定名称和标签,格式为 <镜像名>:<标签>。这里镜像名为 my-ubuntu,标签为 trans。这个新镜像会包含源容器 ros_installer 文件系统的所有更改,但不会包含其挂载的数据卷。

5. docker stop – 停止 container

docker stop ros_installer

说明:用于停止一个正在运行的容器

  • docker stop:发送 SIGTERM 信号给容器内的主进程,要求其优雅停止。如果在超时时间(默认10秒)后仍未停止,则发送 SIGKILL 信号强制终止。
  • ros_installer:指定要停止的容器的名称(也可以是容器 ID)。

6. docker rm – 删除 container

docker rm ros_installer

说明:用于删除一个已停止的容器

  • docker rm:移除一个或多个已停止的容器。
  • ros_installer:指定要删除的容器的名称(也可以是容器 ID)。
  • 注意:只能删除已停止(Exited 状态)的容器。如果要删除正在运行的容器,需要先执行 docker stop 停止它,或者使用 docker rm -f 强制删除。

7. docker save – 从 image 到 tar

docker save -o ready_to_trans.tar my-ubuntu:trans

说明:用于将一个或多个镜像打包导出为 tar 归档文件

  • docker save:将指定镜像及其所有层、元数据保存到一个 tar 文件中。
  • -o ready_to_trans.tar-o 标志指定输出文件的路径和名称。这里将打包文件保存为当前目录下的 ready_to_trans.tar
  • my-ubuntu:trans:指定要导出的镜像的名称和标签(也可以是镜像 ID)。此命令导出的是整个 my-ubuntu:trans 镜像。

8. docker load – 从 tar 到 image

docker load -i /path/to/usb/ready_to_trans.tar

说明:用于从 tar 归档文件加载镜像到本地 Docker 环境

  • docker load:从一个 tar 文件或标准输入(STDIN)中加载镜像。
  • -i /path/to/usb/ready_to_trans.tar-i 标志指定输入文件的路径。这里是从 U 盘路径 /path/to/usb/ready_to_trans.tar 读取 tar 文件并加载其中的镜像。
  • 注意:此命令与 docker import 不同,load 是恢复由 docker save 导出的完整镜像(包含所有历史和层),而 import 是从一个容器文件系统快照创建一个新镜像。

9. docker run – 进入到容器终端

docker run -it --rm my-ubuntu:trans /bin/bash

说明:创建并启动一个新容器,并在退出后自动删除它。

  • docker run -it:如前所述,创建并交互式运行容器。
  • --rm:一个重要的标志,表示容器在停止(退出)后会自动被删除。这适用于运行一次性任务或测试,避免留下大量停止状态的容器占用磁盘空间。
  • my-ubuntu:trans:指定用于创建容器的镜像。
  • /bin/bash:容器启动后执行的命令。

10. docker pull – 从仓库拉取镜像

docker pull hello-world

说明:用于从镜像仓库下载(拉取)一个镜像到本地

  • docker pull:从默认的 Docker 镜像仓库(通常是 Docker Hub)拉取指定的镜像。
  • hello-world:指定要拉取的镜像的名称。这是一个特殊的、极小的测试镜像,常用于验证 Docker 是否正确安装和运行。当只提供镜像名时,默认会拉取标签为 latest 的版本。

11. docker search – 模糊搜索镜像

docker search ubuntu --filter "is-official=true"

说明:用于在 Docker Hub 等镜像仓库中搜索镜像

  • docker search:在连接的镜像仓库(默认为 Docker Hub)中搜索与给定关键词匹配的公共镜像。
  • ubuntu:搜索的关键词。Docker 会返回所有名称或描述中包含 “ubuntu” 的镜像列表。
  • --filter “is-official=true”--filter 标志用于对搜索结果进行筛选。is-official=true 是一个过滤器,它限制返回的结果只显示官方(Official)镜像。官方镜像由 Docker 官方或上游软件供应商维护,通常更可靠。

12. docker ps -a – 查看 container

说明:用于列出所有容器,包括正在运行的和已停止的。

  • docker ps:Docker 中用于列出容器的基础命令。不加任何参数时,默认只显示当前正在运行(Up 状态)的容器。
  • -a-a--all 的简写,这是该命令最常用的标志之一。加上此标志后,docker ps 会列出所有状态的容器,包括:
    • 正在运行的容器(Up
    • 已退出的容器(Exited
    • 已创建但未启动的容器(Created

13. docker start – 启动已停止的容器

docker start abc123:用来重新启动已停止(Exited)的容器,使其从停止状态恢复到运行状态。

说明:用于启动一个或多个已停止的容器

  • docker start:Docker 中用于启动容器的基础命令。该命令会重新启动指定的容器,使其从停止状态(ExitedCreated 等)转换为运行状态(Up)。
  • abc123:目标容器的标识符,可以是:
    • 容器ID:容器的完整哈希值(如 a1b2c3d4e5f6)或前几位足以唯一识别的字符(如 abc123
    • 容器名称:容器创建时指定的名称或自动生成的名称

常用选项

  • -a--attach:附加到容器的标准输出、标准错误
  • -i--interactive:附加到容器的标准输入

示例

# 启动一个已停止的容器
docker start abc123

# 启动并附加到容器的输出
docker start -a my_container

# 启动多个容器
docker start container1 container2 container3

# 启动所有已停止的容器
docker start $(docker ps -aq -f status=exited)

14. docker exec – 在运行中的容器内执行命令

docker exec -it abc123 /bin/bash:用来在正在运行的容器内部启动一个新的交互式终端会话

说明:用于在运行中的容器内部执行命令

  • docker exec:Docker 中用于在容器内执行命令的基础命令。与 docker run(创建新容器)不同,exec 是在已存在的运行中容器内部执行额外命令。
  • -it:这是两个常用选项的组合:
    • -i--interactive:保持标准输入(STDIN)打开,允许与命令交互
    • -t--tty:分配一个伪终端(pseudo-TTY),提供类似本地终端的体验
  • abc123:目标运行中容器的标识符(容器ID或容器名称)
  • /bin/bash:要在容器内部执行的命令。这里是启动 Bash shell。也可以是其他命令如 /bin/shpythonls 等。

常用选项

  • -d--detach:在后台运行命令
  • -u--user:以指定用户身份执行命令(如 rootwww-data
  • -w--workdir:设置命令的工作目录
  • -e--env:设置环境变量

示例

# 进入运行中容器的交互式 Bash 终端
docker exec -it my_container /bin/bash

# 在容器内执行单次命令(不进入交互模式)
docker exec my_container ls -la /var/log

# 以特定用户身份执行命令
docker exec -u nginx nginx_container nginx -t

# 在指定工作目录执行命令
docker exec -w /app app_container npm install

# 在后台执行命令
docker exec -d my_container some_background_task

典型工作流程

# 1. 查看所有容器(包括已停止的)
docker ps -a

# 2. 如果容器已停止,先启动它
docker start abc123

# 3. 然后进入容器的终端
docker exec -it abc123 /bin/bash

# 或者一步完成(如果容器已运行):
docker exec -it my_container /bin/bash

如果需要打开一个容器的多个终端:
在不同的终端中多次运行 docker exec -it my_container /bin/bash 即可
如果只运行一个容器中的终端,则下面两种做法是等效的:

docker start -a my_container

docker start my_container
docker exec -it my_container /bin/bash

15. docker rmi 镜像名:标签

docker rmi my-ubuntu:trans

说明:用于删除一个或多个本地镜像

  • docker rmi:这是 remove image 的缩写,用于删除本地存储的 Docker 镜像。
  • my-ubuntu:trans:指定要删除的镜像的名称和标签(也可以是镜像 ID)。如果同一个镜像有多个标签,rmi 只会删除指定的标签,只有当最后一个标签被删除时,镜像本身才会被移除。
  • 注意:只能删除未被任何容器使用的镜像。如果有容器(无论是否在运行)依赖于该镜像,Docker 会阻止删除并提示错误。

常用选项

  • -f--force:强制删除镜像,即使有容器正在使用它
  • --no-prune:不删除未打标签的父镜像

示例

# 删除单个镜像
docker rmi my-ubuntu:trans

# 用镜像 ID 删除(只用前几位)
docker rmi a1b2c3d4

# 删除多个镜像
docker rmi nginx:latest ubuntu:22.04 python:3.9

# 强制删除(有容器依赖时)
docker rmi -f my-ubuntu:trans

# 删除所有悬虚镜像(dangling images,即 <none>:<none>)
docker rmi $(docker images -f "dangling=true" -q)

# 删除所有镜像(慎用!)
docker rmi $(docker images -q)

常见错误处理

# 错误:镜像被容器使用
Error response from daemon: conflict: unable to delete a1b2c3d4 (must be forced) - image is being used by running container abc123

# 解决方法:先删除或停止依赖的容器
docker rm abc123          # 如果容器已停止
# 或
docker stop abc123 && docker rm abc123  # 如果容器在运行
# 然后再删除镜像
docker rmi a1b2c3d4

16. docker rm 容器名

docker rm ros_installer

说明:用于删除一个或多个已停止的容器

  • docker rm:这是 remove container 的缩写,用于删除本地 Docker 容器。
  • ros_installer:指定要删除的容器的名称(也可以是容器 ID)。
  • 注意:默认只能删除已停止(Exited 状态)的容器。如果要删除正在运行的容器,必须先停止它,或使用 -f 选项强制删除。

常用选项

  • -f--force:强制删除运行中的容器(通过 SIGKILL 信号)
  • -v--volumes:同时删除与容器关联的匿名数据卷
  • -l--link:删除指定的容器间网络链接

示例

# 删除单个已停止的容器
docker rm ros_installer

# 用容器 ID 删除
docker rm a1b2c3d4

# 强制删除运行中的容器
docker rm -f running_container

# 删除多个容器
docker rm container1 container2 container3

# 删除所有已停止的容器
docker rm $(docker ps -aq -f status=exited)

# 删除所有容器(包括运行中的,慎用!)
docker rm -f $(docker ps -aq)

# 删除容器同时删除其关联的数据卷
docker rm -v my_container

实际工作流程

# 1. 查看所有容器(包括已停止的)
docker ps -a

# 2. 先停止运行中的容器(如果要删除)
docker stop container_name

# 3. 然后删除容器
docker rm container_name

# 4. 快速清理:删除所有已停止的容器
docker container prune
# 或
docker rm $(docker ps -aq -f status=exited)

docker rm vs docker rmi 对比

命令操作对象作用常用选项注意事项
docker rm容器删除容器-f 强制删除只能删除已停止的(除非用 -f
docker rmi镜像删除镜像-f 强制删除不能被容器依赖(除非用 -f

一句话记忆

  • docker rm 删容器(remove container)
  • docker rmi 删镜像(remove image)

17. 给已经存在的容器中增加文件

# 1. 先启动容器(让它保持在后台运行)
docker run -d --name my-container your-image-name sleep infinity

# 2. 复制文件进去
docker cp /宿主机/文件.txt my-container:/容器/路径/文件.txt

# 3. 然后可以 exec 进去使用
docker exec -it my-container bash

特别需要注意的是这里的:-d sleep infinity

更多推荐