
你是否曾遇到过这样的困境:“这个程序在我电脑上明明运行得好好的,怎么到服务器上就不行了?” 或者在配置开发环境时,被复杂的依赖关系和版本冲突搞得焦头烂额?Docker 的出现,正是为了解决这些痛点。
Docker 是一个开源的应用容器引擎,它允许开发者将应用及其所有依赖(库、运行时、系统工具、代码)打包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
这篇入门教程旨在帮助初学者理解 Docker 的三个核心概念——镜像 (Image)、容器 (Container) 和 数据卷 (Volume),并通过实际操作掌握最常用的 Docker 命令,让你快速上手这个强大的工具。
Docker 的主要优势
- 环境一致性: 从开发、测试到生产环境,保证应用运行环境的高度一致。
- 快速部署与扩展: 秒级启动容器,轻松实现应用的快速部署、扩容和缩容。
- 资源隔离: 容器间相互隔离,应用运行更安全、更稳定。
- 高效利用资源: 相比传统虚拟机,容器更加轻量级,对系统资源消耗更少。
- 应用可移植性: “一次构建,随处运行”。
先决条件
- 一台 Linux 服务器或本地机器: 可以是物理机、虚拟机,或在 Windows/macOS 上安装了 Docker Desktop。
- 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 会话并重新登录才能生效。
- 基础命令行知识: 熟悉 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 images
或 docker 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 rmi
或 docker 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 的主要优势
- 环境一致性: 从开发、测试到生产环境,保证应用运行环境的高度一致。
- 快速部署与扩展: 秒级启动容器,轻松实现应用的快速部署、扩容和缩容。
- 资源隔离: 容器间相互隔离,应用运行更安全、更稳定。
- 高效利用资源: 相比传统虚拟机,容器更加轻量级,对系统资源消耗更少。
- 应用可移植性: “一次构建,随处运行”。
先决条件
- 一台 Linux 服务器或本地机器: 可以是物理机、虚拟机,或在 Windows/macOS 上安装了 Docker Desktop。
- 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
。
- (可选但推荐) 将用户添加到
docker
组: 为了避免每次执行docker
命令都需要加sudo
,可以将当前用户添加到docker
用户组: Bashsudo usermod -aG docker $USER
执行后需要退出当前 SSH 会话并重新登录才能生效。 - 基础命令行知识: 熟悉 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)
- 搜索镜像 (
docker search
) Bashdocker search nginx # 在 Docker Hub 搜索与 "nginx" 相关的镜像
- 拉取镜像 (
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)
- 列出本地镜像 (
docker images
或docker 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
- 删除本地镜像 (
docker rmi
或docker image rm
) Bashdocker rmi redis # 删除 redis:latest 镜像 (如果没被容器使用) docker rmi ubuntu:22.04 # 通过名称和标签删除 docker rmi xxxxxxxxxxxx # 通过 IMAGE ID 删除 docker rmi -f xxxxxxxxxxxx # 强制删除 (即使有基于它的容器,慎用!)
(二) 容器相关命令 (Containers)
- 运行容器 (
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)
- 创建数据卷 (
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 的大门!