三、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 用于删除本地镜像。如果有任何容器(即使是已停止的)是基于该镜像创建的,必须先删除这些容器,才能成功删除镜像。
相关推荐
慕木兮人可4 小时前
Docker部署MySQL镜像
spring boot·后端·mysql·docker·ecs服务器
armcsdn8 小时前
基于Docker Compose部署Traccar容器与主机MySQL的完整指南
mysql·docker·容器
凌晨两点的菜鸡9 小时前
前端部署-docker
前端·docker
LuckyLay9 小时前
使用 Docker 搭建 Go Web 应用开发环境——AI教你学Docker
前端·docker·golang
杨浦老苏10 小时前
IntelliSSH:AI驱动的远程服务器管理软件
人工智能·docker·ai·ssh·群晖
铅笔侠_小龙虾10 小时前
Docker 实战 -- Mysql
mysql·docker·容器
海星船长丶12 小时前
基于docker进行渗透测试环境的快速搭建(在ubantu中docker设置代理)
运维·docker·容器
bjzhang7518 小时前
docker部署tomcat网站服务器
服务器·docker·tomcat
IT成长日记18 小时前
【Docker基础】Docker网络模式:Host模式深度解析
网络·docker·容器·host·网络模式