三、Docker常用命令

简介: 把 Docker 玩转,就像一个建筑师,需要掌握两套核心工具:一套用来管理你的“图纸”(镜像),另一套用来管理你用图纸盖好的“房子”(容器)。

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

思维导图

image.png

image.png

image.png

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

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

1. 搜索镜像 (search)

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

docker search <image_name>

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

docker search nginx

2. 拉取镜像 (pull)

仓库下载一个镜像本地

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

代码案例:

# 拉取最新版本的 Ubuntu 镜像
docker pull ubuntu

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

image.png

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

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

docker images
# 或者
docker image ls

代码案例:

image.png

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

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

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

代码案例:

# 通过名称和标签删除
docker rmi redis:6.2

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

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

image.png

image.png

image.png

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

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

docker inspect <image_name>[:tag] | <image_id>

代码案例:

docker inspect ubuntu:latest

image.png
image.png

6. 查看镜像历史 (history)

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

docker history <image_name>[:tag] | <image_id>

代码案例:

docker history nginx:latest

image.png

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

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

docker save -o <output_filename.tar> <image_name>[:tag]

代码案例:

docker save -o my_nginx_image.tar nginx:latest

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

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

docker load -i <input_filename.tar>

代码案例:

docker load -i my_nginx_image.tar

9. 为镜像打标签 (tag)

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

docker tag <source_image>[:tag] <target_image>[:tag]

代码案例:

# 将本地的 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

image.png

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

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

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

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

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>: 设置环境变量

代码案例:

# 以后台模式运行一个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

image.png

image.png

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

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

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

代码案例:

# 查看所有容器
docker ps -a

image.png

3. 停止容器 (stop)

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


### 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
image.png


### 7. 删除容器 (rm / container rm)
删除一个或多个 已停止的容器。
bash docker rm <container_name | container_id>
-f--force: 强制删除一个正在运行的容器。

代码案例:
bash # 首先停止容器 docker stop my-web-server # 然后删除 docker rm my-web-server
image.png


### 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
image.png


### 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 .
image.png


### 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.png

image.png


总结:
镜像 (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 镜像:

    docker search mysql
    
    • 解析: docker search 是用于在Docker Hub上查找镜像的命令。
  2. 拉取 mysql:8.0 镜像:

    docker pull mysql:8.0
    
    • 解析: docker pull 用于下载镜像,<image_name>:<tag> 格式指定了镜像名和版本标签。
  3. 查看本地镜像:

    docker images
    
    • 解析: docker imagesdocker image ls 用于列出本地已下载的镜像。
  4. 运行 MySQL 容器:

    docker run -d --name my-mysql-db -e MYSQL_ROOT_PASSWORD=MySecretPwd123 mysql:8.0
    
    • 解析: -d 使容器在后台运行。--name 为容器指定一个易于记忆的名称。-e 用于设置容器内的环境变量,MYSQL_ROOT_PASSWORD 是MySQL镜像官方文档中指定的用于设置root密码的环境变量。
  5. 列出运行中的容器:

    docker ps
    
    • 解析: docker psdocker container ls 的简写,默认只显示正在运行的容器。
  6. 列出所有容器:

    docker ps -a
    
    • 解析: -a--all 参数会显示所有容器,包括那些已经停止运行的。
  7. 查看实时日志:

    docker logs -f my-mysql-db
    
    • 解析: docker logs 用于查看容器日志。-f--follow 参数会持续输出新产生的日志,实现实时跟踪。
  8. 进入容器的 shell:

    docker exec -it my-mysql-db /bin/bash
    
    • 解析: docker exec 用于在运行中的容器内执行命令。-it 组合参数提供了交互式终端,/bin/bash 是要在容器内启动的命令。
  9. 复制文件到容器:

    docker cp backup.sql my-mysql-db:/tmp/
    
    • 解析: docker cp 用于在主机和容器之间复制文件。格式为 docker cp <host_source_path> <container>:<container_dest_path>
  10. 停止容器:

    docker stop my-mysql-db
    
    • 解析: docker stop 用于向容器发送停止信号,使其优雅地关闭。
  11. 删除容器:

    docker rm my-mysql-db
    
    • 解析: docker rm 用于删除一个或多个已停止的容器。如果容器正在运行,需要先 stop 或使用 -f 强制删除。
  12. 删除镜像:

    docker rmi mysql:8.0
    
    • 解析: docker rmidocker image rm 用于删除本地镜像。如果有任何容器(即使是已停止的)是基于该镜像创建的,必须先删除这些容器,才能成功删除镜像。
相关文章
|
1月前
|
Ubuntu Shell Linux
二、Docker安装部署教程
当你敲下docker run时,背后发生了一系列神奇的操作:从检查本地镜像,到从仓库拉取,再到创建并启动容器。搞懂这个核心流程后,就可以动手在Linux上安装Docker了。关键一步是先添加官方的软件源,然后再安装。为了避免拉取镜像时龟速等待,最后一定要记得配置国内的镜像加速器,这能极大提升你的使用体验。
二、Docker安装部署教程
|
1月前
|
存储 关系型数据库 MySQL
五、Docker 核心技术:容器数据持久化之数据卷
别把重要数据直接放进Docker容器里,因为容器就像一辆“临租车”,车一还(容器被删除),落在里面的东西就全没了。正确的做法是使用数据卷 (Volume),它好比一个属于你自己的、可插拔的“移动硬盘”。你可以把这个“硬盘”(具名数据卷)挂载到任何一辆“临租车”(容器)上使用。这样一来,就算车换了,你的数据也安然无恙,完美解决了数据库等应用的数据持久化问题。
223 32
五、Docker 核心技术:容器数据持久化之数据卷
|
1月前
|
缓存 Java Maven
六、Docker 核心技术:Dockerfile 指令详解
想亲手给你的应用程序打造一个专属的“集装箱”吗?Dockerfile就是你的说明书!它其实就是一个简单的文本文件,你可以在里面像搭积木一样,用FROM、COPY、RUN这些指令,一步步告诉Docker如何打包你的应用。最后,通过多阶段构建的小技巧,还能给镜像“减肥”,让它变得轻巧又高效。快来学习用Dockerfile变身打包达人吧!
|
2月前
|
运维 开发者 Docker
一、Docker:一场颠覆应用部署与运维的容器革命
Docker的出现,就是为了解决“在我电脑上能跑”这个老大难问题。它像个魔法集装箱,把你的程序和它需要的所有东西(比如库、配置)都打包好,这样无论在哪运行,环境都一模一样。理解它很简单,就三个核心玩意儿:镜像是程序的“安装包”,容器是跑起来的程序,而仓库就是存放和分享这些“安装包”的地方。
|
1月前
|
存储 监控 Shell
四、Portainer图形化管理实战与Docker镜像原理
如果觉得命令行繁琐,可以试试Portainer这个图形化管理工具,让你在网页上点点鼠标就能轻松管理容器和镜像。安装它只需要一条docker run命令,非常方便。 同时,要理解Docker为何如此高效,关键在于它的镜像原理:镜像像洋-葱一样分层,启动容器时只在外面加一层可写的“外皮”。所有改动都发生在这层“外皮”上,这就是容器启动快、占用空间小的秘诀。
|
26天前
|
存储 Kubernetes 数据库
K3S ——轻量化K8S 入门指南
本文介绍轻量级Kubernetes发行版K3s,适用于边缘计算、IoT等场景。涵盖其架构、安装部署(单节点/高可用/离线)、核心组件、网络存储配置及生产建议,助力快速构建轻量化容器平台。
294 4
|
缓存 IDE 安全
基准测试神器JMH —— 详解36个官方例子
基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。而JMH是一个用来构建,运行,分析Java或其他运行在JVM之上的语言的 纳秒/微秒/毫秒/宏观 级别基准测试的工具。
2455 1
基准测试神器JMH —— 详解36个官方例子
|
1月前
|
应用服务中间件 Shell nginx
七、Docker核心技术:深入理解网络模式 (Bridge, Host, None, Container)
容器不仅仅是孤立的运行环境,它们需要相互通信,也需要与外部世界进行交互。理解 Docker 的不同网络模式,是构建和部署复杂多容器应用的关键。本节将深入探讨 Docker 原生提供的四种网络模式以及强烈推荐使用的自定义网络。要让它们通信,需要将其中一个容器也连接到另一个网络上。默认 bridge 网络不支持容器名DNS解析,只能通过IP地址通信。容器没有自己的独立IP地址,它共享宿主机的IP。网络模式启动一个容器后,如何查看该容器的IP地址?时,该容器默认会连接到哪个网络?模式运行,并且其内部的应用监听。
|
10天前
|
人工智能 BI 开发工具
适合个人开发者的5款开发工具,开发者必须知道
2025年,个人开发者迎来工具黄金时代。本文精选5款高效开发利器:GitHub Copilot(AI智能编程)、Trae(中文友好)、Cursor(项目级理解)、VS Code(开源全能)和Zoho Creator(低代码平台),覆盖从代码生成到应用搭建,助你提升效率,快速实现创意。
246 2
|
25天前
|
Kubernetes API 开发工具
深入浅出K8S技术原理,搞懂K8S?这一篇就够了!
本文以“K8S帝国”为喻,系统解析Kubernetes核心技术原理。从声明式API、架构设计到网络、存储、安全、运维生态,深入浅出揭示其自动化编排本质,展现K8S如何成为云时代分布式操作系统的基石。(239字)
565 4