当前位置: 首页 > news >正文

【Docker】P1 Docker 基础入门指南

目录

  • 前言
  • 为什么我们需要容器?一个部署方式的进化史
    • 1. 传统部署时代:混乱的“群租房”
    • 2. 虚拟化时代:昂贵的“独栋别墅”
    • 3. 容器化时代:轻便的“集装箱公寓”
  • Docker 的核心生态:Image, Container 和 Registry
    • 镜像 (Image)
    • 容器 (Container)
    • 生态系统
  • Docker 的基本工作流:构建、分享与运行
    • 场景一:运行一个已有的应用(如 Nginx)
    • 场景二:构建并分享你自己的应用
    • 小结
  • 动手安装 Docker
    • 方案一:在云服务器上安装
      • 卸载残留的旧版本(可选)
      • 安装前置工具 & 设置国内镜像源
      • 安装 Docker 引擎
      • 启动 Docker 并设置开机自启
      • 验证安装
      • (可选) 配置 Docker 镜像加速器
    • 方案二:安装 Docker Desktop (Windows/macOS)
  • 总结与展望

在这里插入图片描述

前言

你是否曾经遇到过这样的困境:“这个应用在我电脑上明明跑得好好的,怎么一部署到服务器就出错了?” 或者,你是否在服务器上部署多个应用时,担心它们之间会因为环境依赖冲突而“打架”?

如果答案是肯定的,那么 Docker 就是你正在寻找的“银弹”。本文将带你从零开始,彻底搞清楚 Docker 是什么、为什么需要它,以及如何动手安装并运行你的第一个 Docker 应用。


为什么我们需要容器?一个部署方式的进化史

要理解 Docker,我们首先要理解“容器”(Container)这个概念。这要从应用部署方式的“进化”说起。

1. 传统部署时代:混乱的“群租房”

最早,我们直接将各种应用(如 Web 服务、数据库、消息队列)全部部署在同一台物理操作系统上。

  • 问题: 这种方式毫无隔离性可言。就像一个“群租房”,所有租客(应用)共享所有资源(系统库、CPU、内存)。如果一个应用发生内存泄漏,就可能导致整个操作系统崩溃,所有应用全部“陪葬”。应用之间的依赖冲突(比如应用 A 需要 Python 2,应用 B 需要 Python 3)也极难解决。

2. 虚拟化时代:昂贵的“独栋别墅”

为了解决隔离问题,前辈们引入了虚拟化技术(VM)。我们在操作系统之上,通过 Hypervisor(如 VMware, VirtualBox)运行多个“虚拟机”(VM)。每个应用部署在各自独立的虚拟机里。

  • 优点: 实现了完美的隔离。一台虚拟机崩了,不会影响到其他虚拟机或宿主系统。
  • 问题: 资源开销巨大。每个虚拟机都包含一个完整的操作系统(如 CentOS, Ubuntu),非常“笨重”。启动一个虚拟机往往需要几分钟,并且它会占用大量的磁盘空间和内存。这就像为了隔离,给每个租客都盖了一栋“独栋别墅”,虽然安全了,但成本太高,资源利用率极低。

3. 容器化时代:轻便的“集装箱公寓”

有没有一种既能实现隔离,又轻量、高效的方案呢?有,这就是容器化部署

我们不再安装笨重的虚拟机,而是在操作系统上安装一个“容器运行时环境”(如 Docker)。每个应用被打包在自己的“容器”内运行。

  • 核心优势: 容器内的应用拥有自己所需的最基本环境(库、依赖),但它们共享宿主机的操作系统内核
  • 类比: 容器就像一个个标准化的“集装箱”。你的应用(货物)被封装在集装箱里,这个集装箱可以在任何支持容器标准的码头(操作系统)上被快速吊起和运行。容器与容器之间(集装箱与集装箱之间)是互相隔离的,但它们又共享了轮船(宿主机内核)的动力。

容器的标签:

  • 轻量 & 快速: 没有完整的操作系统,启动速度是秒级。
  • 隔离: 应用之间互不干扰。
  • 跨平台: “一次构建,随处运行”(Build once, run anywhere)。
  • 高密度部署: 可以在一台机器上运行远超虚拟机数量的容器。

正因为这些优点,容器化技术已成为当今应用部署的事实标准,而 Docker 则是实现容器化技术的最流行的工具。


Docker 的核心生态:Image, Container 和 Registry

理解了“为什么”需要容器,我们来看看 Docker 是如何实现这一切的。Docker 有两个最核心的概念:镜像 (Image)容器 (Container)

镜像 (Image)

镜像,就如同一个只读的“软件包”或“模板”。 它打包了应用运行所需的一切:代码、运行时库、环境变量、配置文件… 你可以把它想象成一个操作系统的“ghost”镜像,但它更轻量,只包含了必要的东西。

容器 (Container)

容器,则是这个“软件包”启动后运行的一个个“应用实例”。

关键区别: 镜像是静态的、只读的。容器是动态的、可运行的。一个镜像文件可以启动非常多(成百上千)的容器,其相互隔离,每一个容器都代表运行中的一个应用。

生态系统

为了管理镜像和容器,Docker 还有一套完整的生态系统:

在这里插入图片描述

  • Docker 主机 (Host) 与后台进程 (Daemon): 安装了 Docker 环境的机器就称为 Docker 主机。Docker 安装后,会有一个后台进程 Docker Daemon (守护进程) 持续运行。它是 Docker 的“大脑”和“管家”,负责处理所有关于构建、运行和管理容器的实际工作。
  • Docker 客户端 (Client): 这就是我们用来和 Docker Daemon“对话”的工具,最常见的就是 docker 命令行程序 (docker-cli)。当我们输入命令时,Client 实际上是向 Daemon 发送指令。
  • 镜像仓库 (Registry): 这是一个集中存储和分发镜像的“应用市场”。最著名的就是官方的 Docker Hub。你可以从这里下载(pull)别人做好的镜像,也可以把你自己做好的镜像推送(push)上去分享给他人。

Docker 的基本工作流:构建、分享与运行

现在,我们把所有概念串联起来,看看 Docker 的典型工作流。

场景一:运行一个已有的应用(如 Nginx)

  1. 拉取镜像 (Pull): 你想运行一个 Nginx 网页服务器。你不需要自己从头配置,因为 Docker Hub 上已经有了官方的 Nginx 镜像。 你在 Docker 客户端 (docker cli) 中输入命令:docker pull nginx
  2. 指令传递: Docker 客户端将这个命令发送给 Docker 主机上的 Docker Daemon
  3. 下载镜像: Daemon 发现本地没有这个镜像,于是连接到 Docker Registry (默认是 Docker Hub),去下载 (拉取) Nginx 镜像到本地主机。
  4. 运行容器 (Run): 镜像下载完成后,你输入第二个命令:docker run nginx
  5. 启动应用: Daemon 接收到命令,找到本地的 nginx 镜像,然后基于这个镜像启动一个容器。这个容器就是一个正在运行的、被隔离的 Nginx 服务。

提示: docker run 命令非常智能。如果你在本地没有镜像时直接执行 docker run nginxDocker Daemon 会自动先去执行 pull 操作,下载镜像,然后再启动容器。

场景二:构建并分享你自己的应用

  1. 构建镜像 (Build): 你用 Java/Python/Go 写好了一个应用。你想把它打包成 Docker 镜像。你需要编写一个 Dockerfile(一个描述如何构建镜像的“菜谱”),然后执行:docker build .
  2. 制作镜像: Docker Daemon 接收到命令,按照 Dockerfile 里的步骤(如安装依赖、复制 代码、设置启动命令)开始制作你自己的软件镜像。
  3. 分享镜像 (Push): 镜像做好后,你可以使用 docker push your-repo/your-app 命令,将这个镜像推送到 Docker Registry (如 Docker Hub 或公司私有仓库),方便其他人或服务器下载使用。

小结

  • 想要构建自己的软件包,主要需要掌握 docker build 命令。
  • 想要分享应用,需要学会 docker push(推送)和 docker pull(拉取)。
  • 想要运行应用,则需要 docker run

动手安装 Docker

理论说完了,我们来动手安装。根据你的实际环境,大体上有两个方案:

  • 方案一(推荐): 在云服务器的 Linux 操作系统上安装。这是最接近生产环境的方式。
  • 方案二(方便): 在本地电脑(Windows / macOS)上安装。

方案一:在云服务器上安装

如果你选择了方案一,可以从腾讯云、阿里云等注册一台小主机,并使用 SSH 工具(如 WindTerm, Xshell, or built-in terminal)登录主机,应用命令下载安装 Docker。

以下步骤以 CentOS 操作系统为例(其他系统请参照官网文档):

卸载残留的旧版本(可选)

如果你的系统里有旧版 Docker,先清理干净:

sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine

安装前置工具 & 设置国内镜像源

安装 yum-utils,并将 Docker 的下载源迁移到国内(这里使用阿里云),提升下载速度:

sudo yum install -y yum-utils
sudo yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装 Docker 引擎

执行安装命令:

sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  • docker-ce Docker 引擎 (Community Edition)
  • docker-ce-cli Docker 引擎命令行程序 (Client)
  • containerd.io 容器运行时核心
  • docker-buildx-plugin 用于构建 Docker 镜像的插件
  • docker-compose-plugin 用于编排多个容器的插件

启动 Docker 并设置开机自启

安装完成后,启动 Docker 服务:

sudo systemctl start docker

设置开机自动启动:

sudo systemctl enable docker

验证安装

执行 docker run hello-world。如果 Docker 安装正确,它会自动拉取 hello-world 镜像并运行,你将看到 “Hello from Docker!” 的欢迎信息。

$ sudo docker run hello-worldHello from Docker!
This message shows that your installation appears to be working correctly.
...

(可选) 配置 Docker 镜像加速器

为了加快 docker pull 拉取镜像的速度,建议配置国内的镜像加速器。编辑 (或创建) /etc/docker/daemon.json 文件:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://<your-mirror-id>.mirror.aliyuncs.com"]
}
EOF

修改后,重启 Docker 服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

方案二:安装 Docker Desktop (Windows/macOS)

如果读者使用 Windows 10/11 (需开启 WSL2) 或 macOS,可以到 Docker 官网上下载并安装 Docker Desktop。这是一个图形化的桌面应用,它在后台为你管理好了 Docker 引擎。

  • 注意: 访问 Docker 官网可能需要科学上网。

总结与展望

恭喜你!读到这里,你已经了解了容器的“前世今生”,掌握了 Docker 的核心概念(镜像 Image容器 Container仓库 Registry),并成功安装了 Docker 环境。

这只是你 Docker 之旅的开始。接下来,我们将依次学习 Docker 命令、存储、网络、compose 以及 dockerfile。


2025.10.30 G38 回北京途中

http://www.dtcms.com/a/548545.html

相关文章:

  • 【OD刷题笔记】- API集群负载统计
  • 韩城市网站建设wordpress 手工网站
  • Java—常见API(String、ArrayList)
  • 【STM32项目开源】STM32单片机医疗点滴控制系统
  • 游戏类网站备案需要前置审批吗怎么制作图片表格
  • AWS EC2 服务器弹性伸缩:基于 CPU 使用率创建伸缩组,实现资源动态调整
  • srt服务器,推拉流
  • Rust API 设计中的零成本抽象原则:从原理到实践的平衡艺术
  • Work-Stealing 调度算法:Rust 异步运行时的核心引擎
  • 服务器恶意进程排查:从 top 命令定位到病毒文件删除的实战步骤
  • 【案例实战】初探鸿蒙开放能力:从好奇到实战的技术发现之旅
  • 服务器启动的时候就一个对外的端口,如何同时连接多个客户端?
  • LVS负载均衡集群理论详解
  • 三维重建【0-E】3D Gaussian Splatting:相机标定原理与步骤
  • Flutter---ListTile列表项组件
  • Spring Boot入门篇:快速搭建你的第一个Spring Boot应用
  • 《算法通关指南数据结构和算法篇(1)--- 顺序表相关算法题》
  • ReentrantLock 加锁与解锁流程详解(源码分析,小白易懂)
  • 鸿蒙Flutter三方库适配指南:06.插件适配原理
  • Linux 防火墙实战:用 firewalld 配置 External/Internal 区域,实现 NAT 内网共享上网
  • Java 学习29:方法
  • Kafka 全方位详细介绍:从架构原理到实践优化
  • Obsidian 入门教程(二)
  • [测试工具] 如何把离线的项目加入成为git项目的新分支
  • 让数据导入导出更智能:通用框架+验证+翻译的一站式解决方案
  • 今天我们学习Linux架构keepalived实现LVS代理双击热备
  • [Linux]内核队列实现详解
  • 【Spring Cloud】Spring Cloud Config
  • MySQL | 数据查询DQL语言:分组统计
  • 阿里云灵码IDE技术测评:从v0.1.0到v0.1.5的进化之路