《Docker 入门与进阶:架构剖析、隔离原理及安装实操》

发布于:2025-05-14 ⋅ 阅读:(12) ⋅ 点赞:(0)

1 docker 简介

1.1 Docker 的优点

Docker 是一款开放平台,用于应用程序的开发、交付与运行,能将应用和基础架构分离,实现软件快速交付 ,还能以统一方式管理应用和基础架构,缩短代码从编写到上线的时间。其核心优势如下:

  • 加速应用交付流程:开发人员可在本地容器的标准化环境编写代码,轻松与同事共享成果。应用能快速推送至测试环境完成自动或手动测试,发现问题后可及时修复、重新部署。测试通过后,更新的镜像可便捷推送至生产环境,适配持续集成和持续交付流程。
  • 灵活部署与高效扩展:基于容器的 Docker,工作负载具备高移植性,能在本地、数据中心、云服务等多环境运行。凭借可移植、轻量特性,可按需实时扩展或缩减应用、服务规模。
  • 提升硬件资源利用率:Docker 轻巧快速,相比传统虚拟机,是更经济高效的选择,能让硬件发挥更大效能,尤其适用于高密度及中小型部署场景。

Docker和虚拟机(VM)虽然都用于实现资源隔离和应用程序的独立运行,但它们在技术架构、性能特征和适用场景上存在显著差异。以下是两者的核心区别:

总结对比表

特性 Docker(容器) 虚拟机(VM)
隔离级别 进程级(共享内核) 硬件级(独立内核)
启动时间 秒级 分钟级
资源占用 低(仅需必要依赖) 高(完整操作系统)
性能 接近原生 有Hypervisor开销
可移植性 高(镜像标准化) 中(依赖Hypervisor)
管理复杂度 低(容器编排工具) 高(多OS维护)
安全性 中等(需配置安全策略) 高(完全隔离)
适用场景 微服务、CI/CD、轻量级应用 传统应用、多租户、关键系统

选择建议

  • 优先使用Docker:若追求快速部署、资源效率和微服务架构。
  • 优先使用VM:若需要强隔离性、异构环境支持或传统应用迁移。

1.2 docker架构

Docker 架构是基于客户端-服务器模式的,其中包括多个关键组件,确保容器化应用的高效构建、管理和运行。

Docker 的架构设计使得开发者能够轻松地将应用程序与其所有依赖封装在一个可移植的容器中,并在不同的环境中一致地运行。

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

类与镜像:在面向对象编程里,类是一种抽象的模板,定义了对象所具有的属性和方法。例如,定义一个 “汽车” 类,包含品牌、型号、速度等属性以及启动、加速、刹车等方法。类似地,Docker 镜像也是一种模板,它包含了运行应用程序所需的所有文件、依赖项、配置等,是一个静态的实体。比如一个 Python 应用的镜像,会包含 Python 解释器、应用代码以及相关的库等。
对象与容器:对象是类的实例,基于类创建出来,具有具体的属性值和行为。比如根据 “汽车” 类创建出一辆具体的汽车对象,有特定的品牌、型号等属性和实际的操作行为。Docker 容器则是镜像的运行实例,基于镜像创建。容器具有动态的特性,在运行时可以对其进行启动、停止、扩展等操作,就像一个正在行驶的汽车对象,而镜像只是一个制造汽车的蓝图。
在这里插入图片描述

Docker 架构的工作流程
构建镜像:使用 Dockerfile 创建镜像。
推送镜像到注册表:将镜像上传到 Docker Hub 或私有注册表中。
拉取镜像:通过 docker pull 从注册表中拉取镜像。
运行容器:使用镜像创建并启动容器。
管理容器:使用 Docker 客户端命令管理正在运行的容器(例如查看日志、停止容器、查看资源使用情况等)。
网络与存储:容器之间通过 Docker 网络连接,数据通过 Docker 卷或绑定挂载进行持久化。

1. Docker 客户端(Docker Client)
Docker 客户端就像是用户与 Docker 系统沟通的“遥控器”,它以命令行的形式存在,让用户能轻松操控 Docker 各项功能。当你在命令行输入指令,比如创建容器、构建镜像,这些指令就会通过客户端发送给 Docker 守护进程,由守护进程去执行具体操作。

核心功能:通过简单的命令就能实现与 Docker 守护进程的交互,完成容器创建、镜像构建、查看容器状态等任务 。

常用指令及作用

  • docker run:基于镜像快速启动一个容器;
  • docker ps:查看当前正在运行的容器列表;
  • docker build:根据 Dockerfile 中的配置,生成定制化的 Docker 镜像;
  • docker exec:进入正在运行的容器内部,执行特定命令。
  1. Docker 守护进程(Docker Daemon)
    Docker 守护进程(进程名通常为 dockerd)是 Docker 系统的“幕后管家”,负责处理 Docker 最核心的工作,像管理容器从创建到销毁的整个生命周期、构建镜像、分发镜像等。它在后台默默运行,持续监听 Docker 客户端发送过来的指令请求,一旦收到指令,就立即开始执行相关操作。

启动与自启动设置:在大多数情况下,安装 Docker 后,守护进程会自动启动。若需手动设置开机自启动(适用于使用 service 初始化系统的场景),可以执行以下命令:

sudo update-rc.d docker defaults

这样每次系统启动时,Docker 守护进程也会自动运行,无需手动开启。

3. Docker 引擎 API(Docker Engine API)
Docker 引擎 API 是 Docker 对外开放的“接口大门”,采用 RESTful 架构设计,外部客户端能通过它与 Docker 守护进程进行通信。借助这个 API,开发者可以使用 HTTP 请求的方式,实现对 Docker 的各种操作,包括启动容器、构建镜像、查看容器状态等。它打破了不同平台之间的限制,无论你使用哪种编程语言,只要能发送 HTTP 请求,就能实现与 Docker 的交互。

4. Docker 容器(Docker Containers)
Docker 容器是 Docker 最核心的“产品”,它是一个轻量级、可独立运行的“软件盒子”,里面封装了运行应用程序所需要的所有内容,从底层的操作系统库到应用程序代码,一应俱全。容器运行时会共享宿主机的操作系统内核,但彼此之间的文件系统和进程都是相互隔离的,就像一个个独立的小房间,互不干扰。

核心优势

  • 环境一致性:无论在开发、测试还是生产环境,只要运行同一个容器,应用程序的运行效果都是一样的;
  • 临时性与灵活性:容器生命周期短暂,任务完成后可以随时销毁,也能快速重新创建;
  • 跨平台性:不依赖底层操作系统配置,只要有 Docker 环境,就能运行。
    以下是面向初学者优化后的 Docker 核心概念解释,采用简洁易懂的语言和示例:

5. Docker 镜像(Docker Images)
Docker 镜像就像是一个“软件安装包”,它是容器的只读模板,包含了应用程序运行所需的一切:从操作系统、运行时环境、依赖库,到应用代码和配置文件。镜像就像一个“蓝图”,可以被多次复制并运行,形成多个相互隔离的容器。

核心特点

  • 只读与共享:镜像本身是只读的,多个容器可以共享同一个镜像,减少资源占用。
  • 分层结构:镜像由多个“层”(Layer)组成,每层代表一次文件系统的修改,这种设计让镜像的构建和传输更高效。
  • 可复用与可定制:可以基于官方镜像进行二次开发,也可以将自己的镜像分享到仓库。

镜像 vs 容器

  • 镜像:静态的“模板”,类似程序的安装包。
  • 容器:镜像的运行实例,类似运行中的程序进程。

镜像的设计让应用部署变得简单:只需拉取镜像,即可在任何支持 Docker 的环境中运行相同的应用,实现“一次构建,到处运行”。

6. Docker 仓库(Docker Registries)
类比
Docker 仓库就像一个“应用商店”,只不过存储的不是手机应用,而是 Docker 镜像。你可以从这里下载别人做好的镜像,也可以上传自己的镜像分享给他人。

功能

  • 存储镜像:类似于 GitHub 存储代码,Docker 仓库存储镜像文件。
  • 上传/下载:支持用户上传自定义镜像或下载公共镜像。
  • 官方与社区资源:Docker Hub(默认公共仓库)提供大量官方镜像(如 Ubuntu、MySQL)和社区贡献的镜像。

7. Docker Compose
类比
如果你需要同时运行多个容器(比如一个网站和数据库),Docker Compose 就像一个“批量启动器”,用一个配置文件就能一键启动所有服务。

功能

  • 多容器管理:通过一个 docker-compose.yml 文件定义多个容器及其关系。
  • 简化部署:只需一条命令即可启动/停止整个应用。

8. Docker Swarm
类比
如果你有多台服务器(主机),Docker Swarm 就像一个“指挥官”,能把它们组建成一个“集群”,统一管理和分配任务。

功能

  • 集群管理:将多台 Docker 主机组成一个逻辑集群。
  • 自动扩展:根据负载自动增加或减少容器数量。
  • 高可用性:当某个容器故障时,自动重新部署。

9. Docker 网络(Docker Networks)
类比
Docker 网络就像给容器搭建的“虚拟局域网”,让容器之间可以互相通信,也能与外部网络连接。

功能

  • 容器通信:不同容器可通过网络互相访问。
  • 隔离与安全:通过自定义网络隔离不同应用。

常见网络模式

  • bridge(默认):容器通过宿主机的虚拟网桥通信。
  • host:容器直接使用宿主机网络(无隔离)。
  • overlay:跨主机集群网络(用于 Swarm)。

10. Docker 卷(Docker Volumes)
类比
容器的文件系统就像“临时存储”,容器删除后数据会丢失。而 Docker 卷就像一个“外挂硬盘”,数据独立于容器,不会丢失。

功能

  • 数据持久化:容器删除后,卷中的数据依然保留。
  • 数据共享:多个容器可挂载同一个卷共享数据。

总结对比表

概念 作用 适合场景
镜像 作为容器的只读模板,封装应用程序及其依赖环境(如操作系统、运行时、库和代码等),是容器创建的基础;通过分层存储实现复用与高效传输 开发阶段构建应用运行环境;打包应用交付测试与生产环境;作为公共基础镜像供团队使用
容器 镜像的运行实例,提供轻量级、隔离的运行环境,包含可读写层,实现应用的快速部署与运行;支持动态启停、扩展和迁移 微服务架构中独立部署服务;CI/CD流水线快速交付应用;隔离不同版本或功能的应用
仓库 存储和分享镜像,分为公共仓库(如Docker Hub)和私有仓库;支持镜像的上传、下载与版本管理 团队协作共享自定义镜像;获取公共开源镜像加速开发;企业内部安全存储敏感镜像
Compose 通过YAML文件定义多容器应用的配置(服务、网络、卷等),实现一键编排和管理多个关联容器 本地开发同时启动前后端服务与数据库;搭建复杂测试环境;快速部署小型多服务应用
Swarm 将多台Docker主机组成集群,实现容器的集群化管理,支持负载均衡、高可用和自动扩展 大型生产环境的分布式部署;应对高并发流量的弹性伸缩;跨主机资源调度
网络 管理容器间的通信与隔离,提供多种网络模式(如bridge、host、overlay),支持容器服务发现与访问 多容器服务间数据交互;隔离不同安全级别的应用;跨主机集群内容器通信
实现数据持久化,独立于容器生命周期,支持容器间数据共享;避免容器删除导致数据丢失 数据库存储数据;应用日志持久化;共享配置文件或上传文件
客户端 作为用户与Docker交互的命令行接口(CLI),发送指令(如创建容器、构建镜像)到守护进程 日常开发运维操作;自动化脚本执行Docker命令;与守护进程交互管理容器
守护进程 作为Docker架构核心,负责处理客户端请求,管理容器生命周期、镜像构建与分发等后台任务 持续监控与维护Docker环境;执行容器创建、启动、停止等操作;管理资源分配
引擎 提供RESTful API接口,允许外部客户端(如编程语言、工具)通过HTTP请求与守护进程通信 开发自定义管理工具;集成Docker功能到自动化平台;通过编程方式控制容器

1.3 docker的隔离机制

Docker 的隔离机制是其核心优势之一,主要基于 Linux 内核的 NamespacesCgroups 技术实现,同时结合文件系统和网络隔离,确保容器间相互独立且资源可控。

1. Namespaces(命名空间)
Namespaces 是 Linux 内核提供的一种隔离机制,Docker 通过它将容器的不同资源(如进程、网络、文件系统等)隔离到独立的命名空间中,使容器内的进程看起来像是在独立的环境中运行。

主要 Namespaces 类型

  • PID Namespace:隔离进程 ID,每个容器有独立的进程树(容器内的 PID 1 与宿主机无关)。
  • NET Namespace:隔离网络栈,每个容器有独立的网络接口、IP 地址和端口空间。
  • MNT Namespace:隔离文件系统挂载点,容器有独立的根文件系统。
  • UTS Namespace:隔离主机名和域名,容器可自定义主机名。
  • IPC Namespace:隔离进程间通信(如消息队列、共享内存)。
  • USER Namespace:隔离用户和用户组,容器内的用户可映射到宿主机的不同 UID。

作用

  • 容器内的进程无法看到或影响其他容器的进程。
  • 容器可使用相同的端口(如 80),但在不同的网络命名空间中互不冲突。

一个容器包含多个进程

2. Cgroups(控制组)
Cgroups(Control Groups)是 Linux 内核的另一项技术,用于限制和监控容器的资源使用(如 CPU、内存、磁盘 I/O、网络带宽等),防止单个容器耗尽系统资源。

主要功能

  • 资源限制:设置容器的 CPU 使用率上限、内存配额等。
  • 优先级控制:调整容器的资源使用优先级。
  • 资源统计:监控容器的资源使用情况(如 CPU、内存用量)。
  • 进程终止:当容器超出资源限制时,可自动终止进程

3. 联合文件系统(UnionFS)
Docker 使用联合文件系统(如 Overlay2、AUFS 等)实现镜像的分层存储和容器的可写层。每个容器在只读的镜像层之上添加一个可写层,修改只发生在容器的可写层,不会影响底层镜像。

特性

  • 写时复制(Copy-on-Write):只有当容器修改文件时,才会从镜像层复制文件到可写层。
  • 高效复用:多个容器可共享同一个镜像层,节省存储空间。

4. 网络隔离
Docker 提供多种网络模式(如 bridgehostoverlay 等),默认使用 bridge 模式创建虚拟网络,实现容器间的隔离与通信。

常见网络模式

  • bridge:容器通过虚拟网桥(docker0)连接到宿主机网络,容器间通过 IP 或容器名通信。
  • host:容器直接使用宿主机的网络栈,无网络隔离(性能高,但端口冲突风险)。
  • overlay:跨主机集群网络,用于 Swarm 或 Kubernetes 环境。
  • none:禁用网络,容器无法联网。

5. 安全增强
Docker 还通过以下技术进一步强化隔离:

  • Seccomp(Secure Computing Mode):限制容器内进程的系统调用权限。
  • AppArmor/SELinux:为容器应用强制访问控制(MAC)策略。
  • Capabilities:细粒度控制容器的特权(如禁用不必要的系统权限)。

隔离机制 vs 虚拟机

特性 容器(Docker) 虚拟机(VM)
隔离级别 进程级(共享内核) 硬件级(独立内核)
启动速度 秒级 分钟级
资源占用 低(仅需必要依赖) 高(完整操作系统)
性能 接近原生 有 Hypervisor 开销
隔离安全性 中等(需配置安全策略) 高(完全隔离)

总结
Docker 的隔离机制通过 Namespaces 实现资源的逻辑隔离,Cgroups 控制资源使用,联合文件系统 管理存储,网络模式 隔离通信,最终达到轻量级、高性能的应用隔离效果。这种设计使得容器能在共享内核的前提下,安全、高效地运行多个独立应用,成为微服务和 DevOps 的理想选择。

2 安装docker

2.1 前期工作

# 更新 索引
sudo apt-get update
# 安装 依赖
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
 # 安装 添加 Docker 的官方 GPG 密钥
 sudo curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
# 使用以下指令设置稳定版仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

2.2 安装引擎

sudo apt-get update
# 安装最新版
sudo apt-get install docker-ce docker-ce-cli containerd.io

或者安装特定版本

#要安装特定版本的 Docker Engine-Community, 
apt-cache madison docker-ce

  docker-ce | 5:18.09.1~3-0~ubuntu-xenial | https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu  xenial/stable amd64 Packages
  docker-ce | 5:18.09.0~3-0~ubuntu-xenial | https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu  xenial/stable amd64 Packages
  docker-ce | 18.06.1~ce~3-0~ubuntu       | https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu  xenial/stable amd64 Packages
  docker-ce | 18.06.0~ce~3-0~ubuntu       | https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu  xenial/stable amd64 Packages
# 命令
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

安装成功

$ sudo docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

网站公告

今日签到

点亮在社区的每一天
去签到