作者: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命令。
题目:
- 从 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
镜像:
bash
docker search mysql
- 解析:
docker search
是用于在Docker Hub上查找镜像的命令。
- 拉取
mysql:8.0
镜像:
bash
docker pull mysql:8.0
- 解析:
docker pull
用于下载镜像,<image_name>:<tag>
格式指定了镜像名和版本标签。
- 查看本地镜像:
bash
docker images
- 解析:
docker images
或docker image ls
用于列出本地已下载的镜像。
- 运行 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密码的环境变量。
- 列出运行中的容器:
bash
docker ps
- 解析:
docker ps
是docker container ls
的简写,默认只显示正在运行的容器。
- 列出所有容器:
bash
docker ps -a
- 解析:
-a
或--all
参数会显示所有容器,包括那些已经停止运行的。
- 查看实时日志:
bash
docker logs -f my-mysql-db
- 解析:
docker logs
用于查看容器日志。-f
或--follow
参数会持续输出新产生的日志,实现实时跟踪。
- 进入容器的 shell:
bash
docker exec -it my-mysql-db /bin/bash
- 解析:
docker exec
用于在运行中的容器内执行命令。-it
组合参数提供了交互式终端,/bin/bash
是要在容器内启动的命令。
- 复制文件到容器:
bash
docker cp backup.sql my-mysql-db:/tmp/
- 解析:
docker cp
用于在主机和容器之间复制文件。格式为docker cp <host_source_path> <container>:<container_dest_path>
。
- 停止容器:
bash
docker stop my-mysql-db
- 解析:
docker stop
用于向容器发送停止信号,使其优雅地关闭。
- 删除容器:
bash
docker rm my-mysql-db
- 解析:
docker rm
用于删除一个或多个已停止的容器。如果容器正在运行,需要先stop
或使用-f
强制删除。
- 删除镜像:
bash
docker rmi mysql:8.0
- 解析:
docker rmi
或docker image rm
用于删除本地镜像。如果有任何容器(即使是已停止的)是基于该镜像创建的,必须先删除这些容器,才能成功删除镜像。