三、Docker常用命令

作者:IvanCodes

日期:2025年7月9日

专栏:Docker教程

Docker 通过镜像 (Image) 和容器 (Container) 两个核心概念,极大地简化了应用的构建、分发和运行。掌握相关的命令行工具是高效使用 Docker 的关键。

思维导图



一、Docker 镜像 (Image) 常用命令

镜像是一个只读的模板,包含了运行应用程序所需的文件系统、库、依赖和代码。容器是镜像的一个可运行实例。

1. 搜索镜像 (search)

从 Docker Hub (默认的公共镜像仓库) 搜索可用的镜像。

bash 复制代码
docker search <image_name>

代码案例: 搜索所有与 nginx 相关的镜像。

bash 复制代码
docker search nginx

2. 拉取镜像 (pull)

从仓库下载一个镜像到本地。

bash 复制代码
docker pull <image_name>[:tag]
  • [:tag]: 可选。指定镜像的版本标签。如果不指定,默认拉取 latest 标签。

代码案例:

bash 复制代码
# 拉取最新版本的 Ubuntu 镜像
docker pull ubuntu

# 拉取指定版本的 Redis 镜像
docker pull redis:6.2

3. 查看本地镜像 (images / image ls)

列出本地已存在的所有镜像。

bash 复制代码
docker images
# 或者
docker image ls

代码案例:

4. 删除本地镜像 (rmi / image rm)

删除一个或多个本地镜像。

bash 复制代码
docker rmi <image_name>[:tag] | <image_id>
  • 如果有正在运行的容器是基于该镜像创建的,需要先停止并删除这些容器才能成功删除镜像。
  • -f--force: 强制删除镜像 (即使有容器在使用它,但不推荐)。

代码案例:

bash 复制代码
# 通过名称和标签删除
docker rmi redis:6.2

# 通过镜像ID删除 (假设ID是 edbdd97bf78b)
docker rmi edbdd97bf78b

# 删除多个镜像
docker rmi ubuntu:latest redis:latest



5. 查看镜像详细信息 (inspect)

以 JSON 格式返回镜像的详细元数据。

bash 复制代码
docker inspect <image_name>[:tag] | <image_id>

代码案例:

bash 复制代码
docker inspect ubuntu:latest


6. 查看镜像历史 (history)

显示镜像的构建历史,即组成该镜像的每一层 (layer)。

bash 复制代码
docker history <image_name>[:tag] | <image_id>

代码案例:

bash 复制代码
docker history nginx:latest

7. 保存镜像为 tar 文件 (save)

将一个或多个本地镜像打包成一个 .tar 归档文件,方便离线传输。

bash 复制代码
docker save -o <output_filename.tar> <image_name>[:tag]

代码案例:

bash 复制代码
docker save -o my_nginx_image.tar nginx:latest

8. 从 tar 文件加载镜像 (load)

从一个 .tar 归档文件加载镜像到本地。

bash 复制代码
docker load -i <input_filename.tar>

代码案例:

bash 复制代码
docker load -i my_nginx_image.tar

9. 为镜像打标签 (tag)

为已存在的镜像创建一个新的标签 (相当于一个别名)。这在推送到不同仓库或重命名时非常有用。

bash 复制代码
docker tag <source_image>[:tag] <target_image>[:tag]

代码案例:

bash 复制代码
# 将本地的 nginx:latest 标记为 myrepo/mynginx:1.0
docker tag nginx:latest myrepo/mynginx:1.0
# 删除这个打了标签的镜像
[root@ivan01 ~]# docker rmi myrepo/mynginx:1.0
Untagged: myrepo/mynginx:1.0

二、Docker 容器 (Container) 常用命令

容器是镜像的可运行实例。你可以创建、启动、停止、移动和删除容器。

1. 创建并运行容器 (run)

这是一个非常强大的复合命令,如果本地没有指定镜像,它会先自动 pull,然后基于该镜像创建一个新容器并启动它。

bash 复制代码
docker run [OPTIONS] <image_name>[:tag] [COMMAND] [ARG...]
  • -d--detach: 后台运行容器 (守护式容器)。
  • -i--interactive: 交互式操作 (保持 STDIN 打开)。
  • -t--tty: 分配一个伪终端。通常 -it 一起使用。
  • --name <container_name>: 为容器指定一个名称。
  • -p <host_port>:<container_port>: 端口映射,将主机的端口映射到容器的端口。
  • -v <host_path>:<container_path>: 挂载数据卷,将主机的目录挂载到容器的目录。
  • --rm: 容器退出时自动删除。
  • -e <KEY=VALUE>: 设置环境变量。

代码案例:

bash 复制代码
# 以后台模式运行一个Nginx容器,并将主机的8080端口映射到容器的80端口
docker run -d -p 8080:80 --name my-web-server nginx:latest

# 交互式地进入一个Ubuntu容器的bash shell
docker run -it --rm ubuntu:latest /bin/bash


2. 查看正在运行的容器 (ps / container ls)

列出当前正在运行的容器。

bash 复制代码
docker ps
# 或者
docker container ls
  • -a--all: 列出所有容器 (包括已停止的)。

代码案例:

bash 复制代码
# 查看所有容器
docker ps -a

3. 停止容器 (stop)

优雅地停止一个或多个正在运行的容器。

bash 复制代码
docker stop <container_name | container_id>

代码案例:

bash 复制代码
docker stop my-web-server

4. 启动已停止的容器 (start)

启动一个已存在但已停止的容器。

bash 复制代码
docker start <container_name | container_id>

代码案例:

bash 复制代码
docker start my-web-server

5. 重启容器 (restart)

bash 复制代码
docker restart <container_name | container_id>

代码案例:

bash 复制代码
docker restart my-web-server

6. 进入正在运行的容器 (exec / attach)

  • exec: 在正在运行的容器中执行一个新命令 (最常用)。
  • attach: 直接连接到容器的主进程 (PID 1) 的输入/输出流。

exec 语法 (推荐):

bash 复制代码
docker exec [OPTIONS] <container_name | container_id> <COMMAND>

代码案例 (进入容器的shell):

bash 复制代码
docker exec -it my-web-server /bin/bash

7. 删除容器 (rm / container rm)

删除一个或多个已停止的容器。

bash 复制代码
docker rm <container_name | container_id>
  • -f--force: 强制删除一个正在运行的容器。

代码案例:

bash 复制代码
# 首先停止容器
docker stop my-web-server
# 然后删除
docker rm my-web-server

8. 查看容器日志 (logs)

获取容器的标准输出和标准错误日志。

bash 复制代码
docker logs [OPTIONS] <container_name | container_id>
  • -f--follow: 实时跟踪日志输出。
  • --tail <number>: 只显示最后N行日志。

代码案例:

bash 复制代码
# 实时查看my-web-server的日志
docker logs -f my-web-server

9. 查看容器详细信息 (inspect)

以 JSON 格式返回容器的详细配置和状态信息。

bash 复制代码
docker inspect <container_name | container_id>

代码案例:

bash 复制代码
docker inspect my-web-server

10. 从容器复制文件到主机 (cp)

bash 复制代码
docker cp <container_name | container_id>:<container_path> <host_path>

代码案例:

bash 复制代码
# 将容器my-web-server中的/etc/nginx/nginx.conf文件复制到主机的当前目录
docker cp my-web-server:/etc/nginx/nginx.conf .

11. 从主机复制文件到容器 (cp)

bash 复制代码
docker cp <host_path> <container_name | container_id>:<container_path>

代码案例:

bash 复制代码
# 将主机的index.html文件复制到容器my-web-server的/usr/share/nginx/html/目录下
docker cp index.html my-web-server:/usr/share/nginx/html/

总结:

  • 镜像 (Image) : search, pull, images, rmi, inspect, save, load, tag
  • 容器 (Container) : run, ps, stop, start, restart, exec, rm, logs, inspect, cp

Docker 命令行练习题 (共12道)

请为以下每个任务编写相应的Docker命令。

题目:

  1. 从 Docker Hub 搜索与 mysql 相关的官方镜像 (通常 STARS 数最高且 OFFICIAL[OK])。
  2. 拉取 mysql 镜像的 8.0 版本。
  3. 查看你本地现在拥有的所有镜像。
  4. 以后台模式运行一个 MySQL 8.0 容器,为其命名为 my-mysql-db,并设置MySQL的root用户密码为 MySecretPwd123 (提示:通过环境变量 MYSQL_ROOT_PASSWORD 设置)。
  5. 列出所有正在运行的容器。
  6. 列出所有容器,包括已经停止的。
  7. 查看 my-mysql-db 容器的实时日志。
  8. 进入正在运行的 my-mysql-db 容器,并启动一个 bash shell。
  9. 将你本地的一个名为 backup.sql 的SQL文件复制到 my-mysql-db 容器的 /tmp/ 目录下。
  10. 停止名为 my-mysql-db 的容器。
  11. 删除已停止的 my-mysql-db 容器。
  12. 删除你本地的 mysql:8.0 镜像。

答案与解析:

  1. 搜索 mysql 镜像:
bash 复制代码
docker search mysql
  • 解析: docker search 是用于在Docker Hub上查找镜像的命令。
  1. 拉取 mysql:8.0 镜像:
bash 复制代码
docker pull mysql:8.0
  • 解析: docker pull 用于下载镜像,<image_name>:<tag> 格式指定了镜像名和版本标签。
  1. 查看本地镜像:
bash 复制代码
docker images
  • 解析: docker imagesdocker image ls 用于列出本地已下载的镜像。
  1. 运行 MySQL 容器:
bash 复制代码
docker run -d --name my-mysql-db -e MYSQL_ROOT_PASSWORD=MySecretPwd123 mysql:8.0
  • 解析: -d 使容器在后台运行。--name 为容器指定一个易于记忆的名称。-e 用于设置容器内的环境变量,MYSQL_ROOT_PASSWORD 是MySQL镜像官方文档中指定的用于设置root密码的环境变量。
  1. 列出运行中的容器:
bash 复制代码
docker ps
  • 解析: docker psdocker container ls 的简写,默认只显示正在运行的容器。
  1. 列出所有容器:
bash 复制代码
docker ps -a
  • 解析: -a--all 参数会显示所有容器,包括那些已经停止运行的。
  1. 查看实时日志:
bash 复制代码
docker logs -f my-mysql-db
  • 解析: docker logs 用于查看容器日志。-f--follow 参数会持续输出新产生的日志,实现实时跟踪。
  1. 进入容器的 shell:
bash 复制代码
docker exec -it my-mysql-db /bin/bash
  • 解析: docker exec 用于在运行中的容器内执行命令。-it 组合参数提供了交互式终端,/bin/bash 是要在容器内启动的命令。
  1. 复制文件到容器:
bash 复制代码
docker cp backup.sql my-mysql-db:/tmp/
  • 解析: docker cp 用于在主机和容器之间复制文件。格式为 docker cp <host_source_path> <container>:<container_dest_path>
  1. 停止容器:
bash 复制代码
docker stop my-mysql-db
  • 解析: docker stop 用于向容器发送停止信号,使其优雅地关闭。
  1. 删除容器:
bash 复制代码
docker rm my-mysql-db
  • 解析: docker rm 用于删除一个或多个已停止的容器。如果容器正在运行,需要先 stop 或使用 -f 强制删除。
  1. 删除镜像:
bash 复制代码
docker rmi mysql:8.0
  • 解析: docker rmidocker image rm 用于删除本地镜像。如果有任何容器(即使是已停止的)是基于该镜像创建的,必须先删除这些容器,才能成功删除镜像。
相关推荐
功德+n3 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
小敬爱吃饭4 小时前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘
木子欢儿4 小时前
Docker Hub 镜像发布指南
java·spring cloud·docker·容器·eureka
coppher5 小时前
Ubuntu 22.04 amd64 离线安装 Docker 完整教程
linux·docker
虚伪的空想家7 小时前
k8s集群configmap和secrets备份脚本
linux·容器·kubernetes
SXJR7 小时前
k8s中的Pod
云原生·容器·kubernetes
文静小土豆7 小时前
K8s 滚动更新在 Java 应用中的实践与优化
java·容器·kubernetes
w6100104667 小时前
CKA-2026-Ingress
云原生·容器·kubernetes·cka
bloglin999998 小时前
docker logs 如何一直监听日志输出
运维·docker·容器
说实话起个名字真难啊9 小时前
Docker 入门之网络基础
网络·docker·php