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



一、Docker 镜像 (Image) 常用命令
镜像是一个只读的模板,包含了运行应用程序所需的文件系统、库、依赖和代码。容器是镜像的一个可运行实例。
1. 搜索镜像 (search)
从 Docker Hub (默认的公共镜像仓库) 搜索可用的镜像。
1
| docker search <image_name>
|
代码案例: 搜索所有与 nginx 相关的镜像。
2. 拉取镜像 (pull)
从仓库下载一个镜像到本地。
1
| docker pull <image_name>[:tag]
|
[:tag]: 可选。指定镜像的版本标签。如果不指定,默认拉取 latest 标签。
代码案例:
1 2 3 4 5
| docker pull ubuntu
docker pull redis:6.2
|

3. 查看本地镜像 (images / image ls)
列出本地已存在的所有镜像。
1 2 3
| docker images
docker image ls
|
代码案例:

4. 删除本地镜像 (rmi / image rm)
删除一个或多个本地镜像。
1
| docker rmi <image_name>[:tag] | <image_id>
|
- 如果有正在运行的容器是基于该镜像创建的,需要先停止并删除这些容器才能成功删除镜像。
-f 或 --force: 强制删除镜像 (即使有容器在使用它,但不推荐)。
代码案例:
1 2 3 4 5 6 7 8
| docker rmi redis:6.2
docker rmi edbdd97bf78b
docker rmi ubuntu:latest redis:latest
|



5. 查看镜像详细信息 (inspect)
以 JSON 格式返回镜像的详细元数据。
1
| docker inspect <image_name>[:tag] | <image_id>
|
代码案例:
1
| docker inspect ubuntu:latest
|


6. 查看镜像历史 (history)
显示镜像的构建历史,即组成该镜像的每一层 (layer)。
1
| docker history <image_name>[:tag] | <image_id>
|
代码案例:
1
| docker history nginx:latest
|

7. 保存镜像为 tar 文件 (save)
将一个或多个本地镜像打包成一个 .tar 归档文件,方便离线传输。
1
| docker save -o <output_filename.tar> <image_name>[:tag]
|
代码案例:
1
| docker save -o my_nginx_image.tar nginx:latest
|
8. 从 tar 文件加载镜像 (load)
从一个 .tar 归档文件加载镜像到本地。
1
| docker load -i <input_filename.tar>
|
代码案例:
1
| docker load -i my_nginx_image.tar
|
9. 为镜像打标签 (tag)
为已存在的镜像创建一个新的标签 (相当于一个别名)。这在推送到不同仓库或重命名时非常有用。
1
| docker tag <source_image>[:tag] <target_image>[:tag]
|
代码案例:
1 2 3 4 5
| docker tag nginx:latest myrepo/mynginx:1.0
[root@ivan01 ~] Untagged: myrepo/mynginx:1.0
|

二、Docker 容器 (Container) 常用命令
容器是镜像的可运行实例。你可以创建、启动、停止、移动和删除容器。
1. 创建并运行容器 (run)
这是一个非常强大的复合命令,如果本地没有指定镜像,它会先自动 pull,然后基于该镜像创建一个新容器并启动它。
1
| 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>: 设置环境变量。
代码案例:
1 2 3 4 5
| docker run -d -p 8080:80 --name my-web-server nginx:latest
docker run -it --rm ubuntu:latest /bin/bash
|


2. 查看正在运行的容器 (ps / container ls)
列出当前正在运行的容器。
1 2 3
| docker ps
docker container ls
|
-a 或 --all: 列出所有容器 (包括已停止的)。
代码案例:

3. 停止容器 (stop)
优雅地停止一个或多个正在运行的容器。
1
| docker stop <container_name | container_id>
|
代码案例:
1
| docker stop my-web-server
|

4. 启动已停止的容器 (start)
启动一个已存在但已停止的容器。
1
| docker start <container_name | container_id>
|
代码案例:
1
| docker start my-web-server
|
5. 重启容器 (restart)
1
| docker restart <container_name | container_id>
|
代码案例:
1
| docker restart my-web-server
|
6. 进入正在运行的容器 (exec / attach)
exec: 在正在运行的容器中执行一个新命令 (最常用)。attach: 直接连接到容器的主进程 (PID 1) 的输入/输出流。
exec 语法 (推荐):
1
| docker exec [OPTIONS] <container_name | container_id> <COMMAND>
|
代码案例 (进入容器的shell):
1
| docker exec -it my-web-server /bin/bash
|

7. 删除容器 (rm / container rm)
删除一个或多个已停止的容器。
1
| docker rm <container_name | container_id>
|
-f 或 --force: 强制删除一个正在运行的容器。
代码案例:
1 2 3 4
| docker stop my-web-server
docker rm my-web-server
|

8. 查看容器日志 (logs)
获取容器的标准输出和标准错误日志。
1
| docker logs [OPTIONS] <container_name | container_id>
|
-f 或 --follow: 实时跟踪日志输出。--tail <number>: 只显示最后N行日志。
代码案例:
1 2
| docker logs -f my-web-server
|
9. 查看容器详细信息 (inspect)
以 JSON 格式返回容器的详细配置和状态信息。
1
| docker inspect <container_name | container_id>
|
代码案例:
1
| docker inspect my-web-server
|

10. 从容器复制文件到主机 (cp)
1
| docker cp <container_name | container_id>:<container_path> <host_path>
|
代码案例:
1 2
| docker cp my-web-server:/etc/nginx/nginx.conf .
|

11. 从主机复制文件到容器 (cp)
1
| docker cp <host_path> <container_name | container_id>:<container_path>
|
代码案例:
1 2
| 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命令。
题目:
- 从 Docker Hub 搜索与
mysql 相关的官方镜像 (通常 STARS 数最高且 OFFICIAL 为 [OK])。 - 拉取
mysql 镜像的 8.0 版本。 - 查看你本地现在拥有的所有镜像。
- 以后台模式运行一个 MySQL 8.0 容器,为其命名为
my-mysql-db,并设置MySQL的root用户密码为 MySecretPwd123 (提示:通过环境变量 MYSQL_ROOT_PASSWORD 设置)。 - 列出所有正在运行的容器。
- 列出所有容器,包括已经停止的。
- 查看
my-mysql-db 容器的实时日志。 - 进入正在运行的
my-mysql-db 容器,并启动一个 bash shell。 - 将你本地的一个名为
backup.sql 的SQL文件复制到 my-mysql-db 容器的 /tmp/ 目录下。 - 停止名为
my-mysql-db 的容器。 - 删除已停止的
my-mysql-db 容器。 - 删除你本地的
mysql:8.0 镜像。
答案与解析:
- 搜索
mysql 镜像:
- 解析:
docker search 是用于在Docker Hub上查找镜像的命令。
- 拉取
mysql:8.0 镜像:
- 解析:
docker pull 用于下载镜像,<image_name>:<tag> 格式指定了镜像名和版本标签。
- 查看本地镜像:
- 解析:
docker images 或 docker image ls 用于列出本地已下载的镜像。
- 运行 MySQL 容器:
1
| docker run -d --name my-mysql-db -e MYSQL_ROOT_PASSWORD=MySecretPwd123 mysql:8.0
|
- 解析:
-d 使容器在后台运行。--name 为容器指定一个易于记忆的名称。-e 用于设置容器内的环境变量,MYSQL_ROOT_PASSWORD 是MySQL镜像官方文档中指定的用于设置root密码的环境变量。
- 列出运行中的容器:
- 解析:
docker ps 是 docker container ls 的简写,默认只显示正在运行的容器。
- 列出所有容器:
- 解析:
-a 或 --all 参数会显示所有容器,包括那些已经停止运行的。
- 查看实时日志:
1
| docker logs -f my-mysql-db
|
- 解析:
docker logs 用于查看容器日志。-f 或 --follow 参数会持续输出新产生的日志,实现实时跟踪。
- 进入容器的 shell:
1
| docker exec -it my-mysql-db /bin/bash
|
- 解析:
docker exec 用于在运行中的容器内执行命令。-it 组合参数提供了交互式终端,/bin/bash 是要在容器内启动的命令。
- 复制文件到容器:
1
| docker cp backup.sql my-mysql-db:/tmp/
|
- 解析:
docker cp 用于在主机和容器之间复制文件。格式为 docker cp <host_source_path> <container>:<container_dest_path>。
- 停止容器:
- 解析:
docker stop 用于向容器发送停止信号,使其优雅地关闭。
- 删除容器:
- 解析:
docker rm 用于删除一个或多个已停止的容器。如果容器正在运行,需要先 stop 或使用 -f 强制删除。
- 删除镜像:
- 解析:
docker rmi 或 docker image rm 用于删除本地镜像。如果有任何容器(即使是已停止的)是基于该镜像创建的,必须先删除这些容器,才能成功删除镜像。