Docker入门教程:核心概念(镜像/容器/数据卷)与常用命令实战

Docker入门教程:核心概念(镜像/容器/数据卷)与常用命令实战

你是否曾遇到过这样的困境:“这个程序在我电脑上明明运行得好好的,怎么到服务器上就不行了?” 或者在配置开发环境时,被复杂的依赖关系和版本冲突搞得焦头烂额?Docker 的出现,正是为了解决这些痛点。

Docker 是一个开源的应用容器引擎,它允许开发者将应用及其所有依赖(库、运行时、系统工具、代码)打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

这篇入门教程旨在帮助初学者理解 Docker 的三个核心概念——镜像 (Image)容器 (Container)数据卷 (Volume),并通过实际操作掌握最常用的 Docker 命令,让你快速上手这个强大的工具。

Docker 的主要优势

  • 环境一致性: 从开发、测试到生产环境,保证应用运行环境的高度一致。
  • 快速部署与扩展: 秒级启动容器,轻松实现应用的快速部署、扩容和缩容。
  • 资源隔离: 容器间相互隔离,应用运行更安全、更稳定。
  • 高效利用资源: 相比传统虚拟机,容器更加轻量级,对系统资源消耗更少。
  • 应用可移植性: “一次构建,随处运行”。

先决条件

  1. 一台 Linux 服务器或本地机器: 可以是物理机、虚拟机,或在 Windows/macOS 上安装了 Docker Desktop。
  2. Docker 已安装:
    • 请参考 Docker 官方文档进行安装:https://docs.docker.com/engine/install/
    • 在 Ubuntu 上通常可以通过 sudo apt update && sudo apt install docker.io -y 安装。
    • 在 CentOS 上通常需要配置 Docker 仓库后 sudo yum install docker-ce docker-ce-cli containerd.io -y
    • 安装后启动 Docker 服务: sudo systemctl start docker 并设置开机自启: sudo systemctl enable docker

3.(可选但推荐) 将用户添加到 docker 组: 为了避免每次执行 docker 命令都需要加 sudo,可以将当前用户添加到 docker 用户组:

Bash

sudo usermod -aG docker $USER

执行后需要退出当前 SSH 会话并重新登录才能生效。

  1. 基础命令行知识: 熟悉 Linux 基本命令。

Docker 核心概念解析

1. Docker Image (镜像)

  • 是什么? 镜像是 Docker 容器运行的基础。你可以把它想象成一个只读的模板、一个轻量级的虚拟机快照,或者一个类的定义。它包含了运行应用程序所需的所有内容:代码、运行时环境(如 Python、Node.js)、库、环境变量和配置文件。
  • 特点: 镜像是分层的(Layered),每一层都是一组文件系统的更改。这种分层结构使得镜像构建、传输和存储更加高效。镜像是只读的。
  • 来源:
    • Docker Hub: 官方的公共镜像仓库 (https://hub.docker.com/),包含大量官方和社区提供的镜像。
    • 私有仓库: 企业或个人可以搭建自己的私有镜像仓库。
    • 本地构建: 通过 Dockerfile 文件定义镜像的构建步骤,然后使用 docker build 命令在本地创建。

2. Docker Container (容器)

  • 是什么? 如果说镜像是模板或类,那么容器就是该模板的一个运行实例,或者说是由类创建的对象。它是基于镜像启动的、一个可运行的、隔离的进程环境。
  • 特点:
    • 隔离性: 每个容器拥有自己独立的文件系统、网络空间和进程空间,与宿主机以及其他容器隔离。
    • 轻量级: 容器共享宿主机的操作系统内核,启动速度快,资源占用少。
    • 可运行: 容器是一个动态的实例,可以在其中执行命令、运行服务。
    • 短暂性 (Ephemeral): 默认情况下,当容器被删除时,其内部产生的所有数据都会丢失。要持久化数据,需要使用数据卷。

3. Docker Volume (数据卷)

  • 为什么需要? 正如上面提到的,容器默认是短暂的。如果你的应用需要持久化存储数据(如数据库文件、用户上传内容、日志),就需要用到数据卷。
  • 是什么? 数据卷是 Docker 管理的、用于持久化容器数据的机制。它可以绕过容器的文件系统,将数据直接存储在宿主机上(具体位置由 Docker 管理),并且其生命周期独立于容器。
  • 优势:
    • 数据持久化: 即使容器被删除,数据卷中的数据依然存在。
    • 数据共享: 可以在多个容器之间共享数据卷。
    • 解耦: 将数据与容器的生命周期解耦。
    • 性能: 对于大量 I/O 操作,数据卷通常比在容器的可写层读写性能更好。
  • 与 Bind Mount 的区别: Bind Mount 是直接将宿主机上的一个目录或文件挂载到容器中,路径由用户指定。Volume 则由 Docker 管理,更推荐用于持久化应用数据。

Docker 常用命令实战

现在,让我们通过实际操作来掌握常用的 Docker 命令。

(一) 镜像相关命令 (Images)

1.搜索镜像 (docker search)

Bash

docker search nginx # 在 Docker Hub 搜索与 "nginx" 相关的镜像

2.拉取镜像 (docker pull) 从 Docker Hub 下载镜像到本地。:tag 是可选的,不指定则默认为 latest

Bash

docker pull ubuntu:22.04 # 拉取 Ubuntu 22.04 镜像 docker pull nginx:stable-alpine # 拉取 Nginx 稳定版的 Alpine 轻量级镜像 docker pull redis # 拉取 Redis 最新版 (latest)

3.列出本地镜像 (docker imagesdocker image ls)

Bash

docker images # 输出类似: # REPOSITORY TAG IMAGE ID CREATED SIZE # nginx stable-alpine xxxxxxxxxxxx x days ago xxMB # redis latest xxxxxxxxxxxx x weeks ago xxxMB # ubuntu 22.04 xxxxxxxxxxxx x months ago xxMB

4.删除本地镜像 (docker rmidocker image rm)

Bash

docker rmi redis # 删除 redis:latest 镜像 (如果没被容器使用) docker rmi ubuntu:22.04 # 通过名称和标签删除 docker rmi xxxxxxxxxxxx # 通过 IMAGE ID 删除 docker rmi -f xxxxxxxxxxxx # 强制删除 (即使有基于它的容器,慎用!)

Okay, let’s create the article based on the title: “Docker入门教程:核心概念(镜像/容器/数据卷)与常用命令实战”.


文章发布时间: 2025年4月21日

你是否曾遇到过这样的困境:“这个程序在我电脑上明明运行得好好的,怎么到服务器上就不行了?” 或者在配置开发环境时,被复杂的依赖关系和版本冲突搞得焦头烂额?Docker 的出现,正是为了解决这些痛点。

Docker 是一个开源的应用容器引擎,它允许开发者将应用及其所有依赖(库、运行时、系统工具、代码)打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

这篇入门教程旨在帮助初学者理解 Docker 的三个核心概念——镜像 (Image)容器 (Container)数据卷 (Volume),并通过实际操作掌握最常用的 Docker 命令,让你快速上手这个强大的工具。

Docker 的主要优势

  • 环境一致性: 从开发、测试到生产环境,保证应用运行环境的高度一致。
  • 快速部署与扩展: 秒级启动容器,轻松实现应用的快速部署、扩容和缩容。
  • 资源隔离: 容器间相互隔离,应用运行更安全、更稳定。
  • 高效利用资源: 相比传统虚拟机,容器更加轻量级,对系统资源消耗更少。
  • 应用可移植性: “一次构建,随处运行”。

先决条件

  1. 一台 Linux 服务器或本地机器: 可以是物理机、虚拟机,或在 Windows/macOS 上安装了 Docker Desktop。
  2. Docker 已安装:
    • 请参考 Docker 官方文档进行安装:https://docs.docker.com/engine/install/
    • 在 Ubuntu 上通常可以通过 sudo apt update && sudo apt install docker.io -y 安装。
    • 在 CentOS 上通常需要配置 Docker 仓库后 sudo yum install docker-ce docker-ce-cli containerd.io -y
    • 安装后启动 Docker 服务: sudo systemctl start docker 并设置开机自启: sudo systemctl enable docker
  3. (可选但推荐) 将用户添加到 docker 组: 为了避免每次执行 docker 命令都需要加 sudo,可以将当前用户添加到 docker 用户组: Bashsudo usermod -aG docker $USER 执行后需要退出当前 SSH 会话并重新登录才能生效。
  4. 基础命令行知识: 熟悉 Linux 基本命令。

Docker 核心概念解析

1. Docker Image (镜像)

  • 是什么? 镜像是 Docker 容器运行的基础。你可以把它想象成一个只读的模板、一个轻量级的虚拟机快照,或者一个类的定义。它包含了运行应用程序所需的所有内容:代码、运行时环境(如 Python、Node.js)、库、环境变量和配置文件。
  • 特点: 镜像是分层的(Layered),每一层都是一组文件系统的更改。这种分层结构使得镜像构建、传输和存储更加高效。镜像是只读的。
  • 来源:
    • Docker Hub: 官方的公共镜像仓库 (https://hub.docker.com/),包含大量官方和社区提供的镜像。
    • 私有仓库: 企业或个人可以搭建自己的私有镜像仓库。
    • 本地构建: 通过 Dockerfile 文件定义镜像的构建步骤,然后使用 docker build 命令在本地创建。

2. Docker Container (容器)

  • 是什么? 如果说镜像是模板或类,那么容器就是该模板的一个运行实例,或者说是由类创建的对象。它是基于镜像启动的、一个可运行的、隔离的进程环境。
  • 特点:
    • 隔离性: 每个容器拥有自己独立的文件系统、网络空间和进程空间,与宿主机以及其他容器隔离。
    • 轻量级: 容器共享宿主机的操作系统内核,启动速度快,资源占用少。
    • 可运行: 容器是一个动态的实例,可以在其中执行命令、运行服务。
    • 短暂性 (Ephemeral): 默认情况下,当容器被删除时,其内部产生的所有数据都会丢失。要持久化数据,需要使用数据卷。

3. Docker Volume (数据卷)

  • 为什么需要? 正如上面提到的,容器默认是短暂的。如果你的应用需要持久化存储数据(如数据库文件、用户上传内容、日志),就需要用到数据卷。
  • 是什么? 数据卷是 Docker 管理的、用于持久化容器数据的机制。它可以绕过容器的文件系统,将数据直接存储在宿主机上(具体位置由 Docker 管理),并且其生命周期独立于容器。
  • 优势:
    • 数据持久化: 即使容器被删除,数据卷中的数据依然存在。
    • 数据共享: 可以在多个容器之间共享数据卷。
    • 解耦: 将数据与容器的生命周期解耦。
    • 性能: 对于大量 I/O 操作,数据卷通常比在容器的可写层读写性能更好。
  • 与 Bind Mount 的区别: Bind Mount 是直接将宿主机上的一个目录或文件挂载到容器中,路径由用户指定。Volume 则由 Docker 管理,更推荐用于持久化应用数据。

Docker 常用命令实战

现在,让我们通过实际操作来掌握常用的 Docker 命令。

(一) 镜像相关命令 (Images)

  1. 搜索镜像 (docker search) Bashdocker search nginx # 在 Docker Hub 搜索与 "nginx" 相关的镜像
  2. 拉取镜像 (docker pull) 从 Docker Hub 下载镜像到本地。:tag 是可选的,不指定则默认为 latest。 Bashdocker pull ubuntu:22.04 # 拉取 Ubuntu 22.04 镜像 docker pull nginx:stable-alpine # 拉取 Nginx 稳定版的 Alpine 轻量级镜像 docker pull redis # 拉取 Redis 最新版 (latest)
  3. 列出本地镜像 (docker imagesdocker image ls) Bashdocker images # 输出类似: # REPOSITORY TAG IMAGE ID CREATED SIZE # nginx stable-alpine xxxxxxxxxxxx x days ago xxMB # redis latest xxxxxxxxxxxx x weeks ago xxxMB # ubuntu 22.04 xxxxxxxxxxxx x months ago xxMB
  4. 删除本地镜像 (docker rmidocker image rm) Bashdocker rmi redis # 删除 redis:latest 镜像 (如果没被容器使用) docker rmi ubuntu:22.04 # 通过名称和标签删除 docker rmi xxxxxxxxxxxx # 通过 IMAGE ID 删除 docker rmi -f xxxxxxxxxxxx # 强制删除 (即使有基于它的容器,慎用!)

(二) 容器相关命令 (Containers)

  1. 运行容器 (docker run) 这是最核心的命令,用于基于镜像创建并启动一个新容器。

运行一个简单命令后退出:

Bash

docker run ubuntu:22.04 echo "Hello from Ubuntu container!"

交互式运行 (进入容器内部):-i (interactive) 保持标准输入打开, -t (tty) 分配一个伪终端。

Bash

docker run -it ubuntu:22.04 /bin/bash
# 运行后会进入容器的 shell 环境,看起来像一个新的 Linux 系统
# root@xxxxxxxxxxxx:/# ls
# root@xxxxxxxxxxxx:/# exit  <-- 输入 exit 退出容器,容器会停止

后台运行 (Detached Mode):-d 让容器在后台运行。通常用于运行服务。 端口映射:-p host_port:container_port 将宿主机的端口映射到容器的端口。 命名容器:--name container_name 为容器指定一个易于记忆的名称。

Bash

# 后台运行一个 Nginx 容器,将宿主机的 8080 端口映射到容器的 80 端口,并命名为 my-webserver
docker run -d -p 8080:80 --name my-webserver nginx:stable-alpine

现在可以通过访问 http://你的服务器IP:8080 来看到 Nginx 的欢迎页面。

2.查看正在运行的容器 (docker ps)

Bash

docker ps
# 输出类似:
# CONTAINER ID   IMAGE                  COMMAND                  CREATED         STATUS         PORTS                  NAMES
# xxxxxxxxxxxx   nginx:stable-alpine   "/docker-entrypoint.…"   x seconds ago   Up x 

3.查看所有容器 (包括已停止的) (docker ps -a)

Bash

docker ps -a

4.停止容器 (docker stop)

Bash

docker stop my-webserver # 通过名称停止 docker stop xxxxxxxxxxxx # 通过 CONTAINER ID 停止

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

Bash

docker start my-webserver
6.重启容器 (docker restart)

Bash

docker restart my-webserver

7.删除容器 (docker rm) 容器必须先停止才能删除。

Bash

docker rm my-webserver # 删除名为 my-webserver 的已停止容器 docker rm xxxxxxxxxxxx # 通过 ID 删除已停止容器 docker rm -f my-webserver # 强制删除一个正在运行的容器 (慎用!)

8.查看容器日志 (docker logs) 对于后台运行的容器非常有用。

Bash

docker logs my-webserver
docker logs -f my-webserver # 持续跟踪日志输出 (类似 tail -f)

9.在运行的容器内执行命令 (docker exec) 用于进入正在运行的容器进行调试或执行特定任务,而无需停止它。 Bash

# 在名为 my-webserver 的容器内启动一个交互式的 bash shell

docker exec -it my-webserver /bin/sh # Alpine 镜像通常用 sh 而不是 bash

# root@xxxxxxxxxxxx:/# ls /usr/share/nginx/html/

# root@xxxxxxxxxxxx:/# exit

(三) 数据卷相关命令 (Volumes)

  1. 创建数据卷 (docker volume create)

Bash

docker volume create my-data-volume

2.列出数据卷 (docker volume ls)

Bash

docker volume ls
# DRIVER VOLUME NAME
# local my-data-volume
3.查看数据卷详细信息 (docker volume inspect) 可以看到数据卷在宿主机上的实际挂载点 (Mountpoint)。

Bash

docker volume inspect my-data-volume

4.删除数据卷 (docker volume rm) 数据卷没有被任何容器使用时才能删除。

Bash

docker volume rm my-data-volume

5.运行容器时挂载数据卷 使用 -v volume_name:container_path 选项。

示例: 运行一个容器,将 my-data-volume 挂载到容器内的 /app/data 目录。

Bash

# 第一次运行,创建文件
docker run -it --name data-test-app -v my-data-volume:/app/data ubuntu:22.04 /bin/bash
# 在容器内执行:
# root@xxxxxxxxxxxx:/# echo "Persistent data" > /app/data/myfile.txt
# root@xxxxxxxxxxxx:/# cat /app/data/myfile.txt
# root@xxxxxxxxxxxx:/# exit

# 删除这个容器
docker rm data-test-app

# 重新运行一个新容器,挂载同一个数据卷
docker run -it --name data-test-app-2 -v my-data-volume:/app/data ubuntu:22.04 /bin/bash
# 在新容器内执行:
# root@xxxxxxxxxxxx:/# cat /app/data/myfile.txt
# 输出: Persistent data  <-- 数据仍然存在!
# root@xxxxxxxxxxxx:/# exit

清理 Docker 资源

Docker 使用时间长了会积累很多停止的容器、无用的镜像和数据卷,占用磁盘空间。

  • 删除所有已停止的容器:

Bash

docker container prune -f
# 或者 docker rm $(docker ps -aq)

删除悬空镜像 (Dangling Images – 没有标签且没被使用的镜像):

Bash

docker image prune -f

删除所有未被使用的镜像 (包括悬空和有标签的):

Bash

docker image prune -a -f

删除所有未使用的数据卷:

Bash

docker volume prune -f

清理所有未使用的 Docker 资源 (容器、网络、镜像、构建缓存):

Bash

docker system prune -f
# 如果也要清理数据卷,加上 --volumes 参数 (请谨慎操作!)
docker system prune -a --volumes -f

恭喜你!通过本教程,你已经了解了 Docker 的核心概念——镜像、容器和数据卷,并亲手实践了管理它们的最常用命令。Docker 的强大之处在于它能够极大地简化应用的开发、测试和部署流程,实现环境的高度一致性和可移植性。

这仅仅是 Docker 世界的开始。接下来,你可以继续探索:

  • Dockerfile: 学习如何编写 Dockerfile 来构建自定义镜像。
  • Docker Compose: 使用 YAML 文件定义和管理多个容器的应用。
  • Docker Networking: 了解容器间的网络通信。
  • Docker Swarm / Kubernetes: 学习容器编排,管理大规模容器集群。

希望这篇入门教程能为你打开 Docker 的大门!

知识库软件分享

宝塔面板(BT Panel)最新版安装教程与常见问题解决方法 (2025)

2025-4-21 12:30:29

知识库

网站访问慢?10个提升Web服务器响应速度的进阶优化技巧

2025-4-21 16:32:59

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧