提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
[1. 三大核心组件(基础核心)](#1. 三大核心组件(基础核心))
[2. 核心流转关系](#2. 核心流转关系)
[3. 底层支撑组件](#3. 底层支撑组件)
[四、Docker 与传统虚拟化的核心差异](#四、Docker 与传统虚拟化的核心差异)
[六、Docker 安装与配置](#六、Docker 安装与配置)
[Dockerfile 示例](#Dockerfile 示例)
[七、Docker 容器操作](#七、Docker 容器操作)
[八、Docker 网络管理](#八、Docker 网络管理)
[Docker 网络基础](#Docker 网络基础)
[Docker 的网络模式](#Docker 的网络模式)
[Macvlan 模式](#Macvlan 模式)
[自定义 Bridge 网络](#自定义 Bridge 网络)
[跨主机通信(Overlay 网络)](#跨主机通信(Overlay 网络))
前言
Docker 是一种轻量级的容器化技术,通过封装应用及其依赖环境,实现快速部署、跨平台运行和资源隔离。它基于 Linux 内核的容器特性(如 cgroups 和 namespaces),提供一致性的开发、测试和生产环境,显著提升软件交付效率。
一、Docker
Docker 作为开源的容器化平台,核心目标是解决"环境一致性"与"高效部署"问题,通过将应用及其依赖打包为标准化容器,实现"一次构建,处处运行"的价值。其本质是操作系统级虚拟化(进程级隔离),区别于传统硬件虚拟化,具有轻量、高效、可移植的核心特性,已成为 DevOps 流程与云原生架构的基础工具。
二、Docker核心定位与价值
Docker 的核心价值在于"解耦"与"标准化",具体可拆解为三点:
-
环境一致性:将应用依赖(代码、运行时、库、配置)打包为容器,彻底解决"开发环境能跑、测试/生产环境报错"的经典问题,实现全流程环境统一;
-
高效资源利用:容器共享宿主机内核,无需像虚拟机那样分配独立内核与硬件资源,启动速度达秒级,资源占用为 MB 级,单台物理机可运行成百上千个容器,资源利用率远高于传统虚拟化;
-
敏捷部署与扩展:支持自动化构建、分发与启动,配合编排工具可实现秒级扩容/缩容,完美适配 DevOps 自动化流程与微服务架构的部署需求。
三、核心组件与流转关系
Docker 核心由"三大核心组件"和"底层支撑组件"构成,各组件协同实现容器的构建、运行、分发全流程:
1. 三大核心组件(基础核心)
-
镜像(Image):只读的静态模板,包含运行应用的所有依赖,采用"分层存储"机制(多层只读文件系统),支持层复用以减少磁盘占用。镜像不可修改,仅能作为创建容器的"模板",可通过 Dockerfile 构建或从仓库拉取;
-
容器(Container):镜像的运行实例,本质是被隔离的进程。容器在镜像只读层之上叠加一层"可写层",所有修改仅作用于可写层(删除容器后可写层消失,数据卷可解决数据持久化问题),支持启动、停止、重启、删除等生命周期管理;
-
仓库(Repository):镜像的存储与分发平台,类似"软件应用商店",分为公共仓库(如 Docker Hub,提供海量官方/第三方镜像)和私有仓库(如 Harbor,适用于企业内部镜像管理)。镜像通过"标签(tag)"区分版本,实现精准拉取与推送。
2. 核心流转关系
镜像 → 容器:通过 docker run 命令基于镜像创建并启动容器; 仓库 → 本地镜像:通过docker pull 从仓库拉取镜像到本地; 容器 → 镜像:通过 docker commit 将修改后的容器提交为新镜像(适用于临时定制,正式场景推荐 Dockerfile); 本地镜像 → 仓库:通过 docker push 将本地构建的镜像推送到仓库供复用。
3. 底层支撑组件
-
客户端-服务端(C/S)架构:用户通过 Docker 客户端(CLI/图形界面)发送指令,Docker 守护进程(dockerd,运行在宿主机后台)接收并执行实际操作(如管理镜像、容器),守护进程与仓库通过 HTTP/HTTPS 交互实现镜像拉取/推送;
-
数据卷(Volume):独立于容器生命周期的持久化存储组件,用于保存容器数据(避免容器删除后数据丢失),支持宿主机与容器、容器间的数据共享,由 Docker 统一管理宿主机存储路径;
-
网络(Network):提供容器间、容器与宿主机/外网的通信能力,核心模式包括桥接模式(默认,容器互通且可访问外网)、宿主模式(直接使用宿主机网络,无端口映射开销)、容器模式(多容器共享网络命名空间)等;
-
Dockerfile :定义镜像构建步骤的文本文件,通过
FROM(指定基础镜像)、RUN(执行命令)、COPY(复制文件)等标准化指令,实现镜像的可复现构建(替代手动定制镜像,适合团队协作); -
Docker Compose :多容器编排工具,通过
docker-compose.yml配置文件定义多个关联服务(如 Web 服务 + 数据库 + 缓存),一键实现多容器的启动、停止、协同管理,简化多服务依赖的部署流程。
四、Docker 与传统虚拟化的核心差异
Docker 属于操作系统级虚拟化,与传统硬件虚拟化(如 VMware、Xen)的核心差异在于"隔离粒度"与"资源开销",具体对比如下:
| 对比维度 | Docker 容器 | 传统虚拟机(VM) |
|---|---|---|
| 内核 | 共享宿主机内核 | 每个 VM 拥有独立内核 |
| 启动速度 | 秒级 | 分钟级 |
| 资源占用 | 低(MB 级),按需分配 | 高(GB 级),预分配固定资源 |
| 隔离级别 | 进程级隔离(隔离应用进程) | 硬件级隔离(隔离完整操作系统) |
| 移植性 | 强(基于镜像标准化,跨平台兼容) | 弱(依赖特定 Hypervisor 虚拟化技术) |
五、典型应用场景
-
开发环境标准化:团队统一使用 Docker 容器作为开发环境,避免因本地环境差异导致的开发问题;
-
持续集成/持续部署(CI/CD):在 CI/CD 流程中,通过 Docker 构建镜像、运行测试、部署容器,实现自动化流水线;
-
微服务部署:将微服务架构中的每个服务打包为独立容器,通过编排工具(如 Docker Compose、K8s)实现服务的协同运行、扩容与运维;
-
多环境快速部署:同一镜像可在开发、测试、生产等不同环境中无缝运行,减少环境适配成本;
-
资源密集型场景:如大数据处理、测试环境集群,通过容器的轻量特性提高资源利用率,降低硬件成本。
六、Docker****安装与配置
Linux系统
使用包管理器安装 Docker Engine:
bash
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
启动 Docker 服务:
bash
sudo systemctl start docker
-
Windows/macOS
下载 Docker Desktop(官网链接)并安装。
基本命令
-
拉取镜像:
bashdocker pull ubuntu:latest -
运行容器:
bashdocker run -it ubuntu /bin/bash -
列出运行中的容器:
bashdocker ps -
停止容器:
bashdocker stop <container_id>Dockerfile 示例
创建自定义镜像的配置文件:
dockerfileFROM ubuntu:latest RUN apt-get update && apt-get install -y python3 COPY app.py /app/ WORKDIR /app CMD ["python3", "app.py"]构建镜像:
bashdocker build -t my-python-app .数据卷与网络
-
挂载数据卷:
bashdocker run -v /host/path:/container/path ubuntu -
创建网络:
bashdocker network create my-network常用工具
-
Docker Compose :用于定义和运行多容器应用。
yamlversion: '3' services: web: image: nginx ports: - "80:80" -
启动服务:
bashdocker-compose up
七、Docker****容器操作
启动容器
使用 docker run 命令启动一个新容器。通过 -d 参数可让容器在后台运行,-p 指定端口映射,--name 为容器命名。
bash
docker run -d -p 8080:80 --name my_container nginx
查看运行中的容器
docker ps 显示当前运行的容器列表,添加 -a 参数可查看所有容器(包括已停止的)。
bash
docker ps -a
停止容器
使用 docker stop 命令停止指定容器,需提供容器ID或名称。
bash
docker stop my_container
启动已停止的容器
通过 docker start 重新启动已停止的容器,不会创建新实例。
bash
docker start my_container
进入容器交互模式
docker exec -it 进入正在运行的容器内部,常用于调试或执行命令。
bash
docker exec -it my_container /bin/bash
删除容器
docker rm 删除已停止的容器,添加 -f 参数可强制删除运行中的容器。
bash
docker rm my_container
查看容器日志
docker logs 查看容器的输出日志,-f 参数可实时跟踪日志更新。
bash
docker logs -f my_container
复制文件到容器
docker cp 在宿主机和容器之间复制文件。
bash
docker cp local_file.txt my_container:/path/in/container
提交容器为镜像
通过 docker commit 将容器当前状态保存为新的镜像。
bash
docker commit my_container new_image_name
监控容器资源
docker stats 实时显示容器的CPU、内存等资源使用情况。
bash
docker stats my_container
八、Docker****网络管理
Docker 网络基础
Docker 提供多种网络模式,默认支持以下核心类型:
- Bridge:默认模式,容器通过虚拟网桥与主机通信。
- Host:容器直接使用主机网络栈,无隔离。
- None:禁用所有网络,适用于离线场景。
- Overlay:用于跨主机的容器通信(如 Swarm 集群)。
- Macvlan:为容器分配 MAC 地址,使其像物理设备接入网络。
Docker****的网络模式
桥接模式(Bridge)
桥接模式是 Docker 的默认网络模式。在此模式下,Docker 会创建一个虚拟网桥(通常是 docker0),容器通过该网桥与主机及其他容器通信。每个容器会被分配一个独立的 IP 地址。
- 适用于单主机环境下的多容器通信。
- 容器可以通过主机端口映射(
-p参数)暴露服务到外部网络。
主机模式(Host)
在主机模式下,容器直接使用主机的网络命名空间,共享主机的 IP 和端口。容器的网络性能与主机几乎一致,但隔离性较差。
- 适用于对网络性能要求较高的场景。
- 容器无需端口映射即可直接使用主机的网络接口。
无网络模式(None)
无网络模式下,容器不配置任何网络接口,完全隔离网络。通常用于安全性要求极高的场景或仅需本地进程通信的容器。
- 适用于不需要网络通信的容器。
- 容器内部仅能通过本地进程间通信(IPC)或共享文件系统交互。
容器模式(Container)
容器模式允许一个容器共享另一个容器的网络命名空间。两个容器使用相同的网络配置,包括 IP 地址和端口。
- 适用于需要紧密协作的容器组。
- 常用于 Sidecar 模式或日志收集等场景。
覆盖网络模式(Overlay)
覆盖网络模式用于跨主机的容器通信,常见于 Docker Swarm 或 Kubernetes 集群。通过虚拟网络层实现多主机间的容器互联。
- 适用于分布式系统或多主机环境。
- 支持服务发现和负载均衡。
Macvlan 模式
Macvlan 模式允许容器直接绑定到物理网络接口,每个容器拥有独立的 MAC 地址,表现得像物理设备一样。
- 适用于需要直接接入物理网络的场景。
- 常用于网络设备模拟或高性能网络需求。
如何选择网络模式
- 单主机通信:桥接模式或主机模式。
- 高性能需求:主机模式或 Macvlan 模式。
- 完全隔离:无网络模式。
- 跨主机通信:覆盖网络模式。
- 共享网络:容器模式。
示例命令
创建桥接网络:
bash
docker network create my_bridge
docker run --network=my_bridge -d nginx
使用主机模式:
bash
docker run --network=host -d nginx
使用覆盖网络(Swarm 环境):
bash
docker network create --driver=overlay my_overlay
docker service create --network=my_overlay nginx
通过理解这些网络模式的特点和适用场景,可以更灵活地配置 Docker 容器的网络环境。
查看和管理网络
列出所有网络:
bash
docker network ls
查看特定网络详情(如 bridge):
bash
docker network inspect bridge
删除未使用的网络:
bash
docker network prune
自定义 Bridge 网络
创建自定义桥接网络(优于默认 bridge):
bash
docker network create --driver bridge my_bridge
运行容器并指定网络:
bash
docker run -d --name web --network my_bridge nginx
将已有容器连接到网络:
bash
docker network connect my_bridge existing_container
容器间通信
同一网络下的容器可通过容器名直接通信:
bash
docker run -d --name app --network my_bridge my_app_image
app 可直接通过 web 主机名访问 nginx 容器。
端口映射与暴露
将容器端口映射到主机(如将 80 映射到主机 8080):
bash
docker run -d -p 8080:80 --name web nginx
仅暴露端口(不映射到主机,供其他容器访问):
dockerfile
EXPOSE 80
跨主机通信(Overlay 网络)
初始化 Swarm 集群:
bash
docker swarm init
创建 Overlay 网络:
bash
docker network create -d overlay my_overlay
在集群中运行服务:
bash
docker service create --network my_overlay --name service1 nginx
网络隔离与安全
限制容器访问外部网络:
bash
docker run -d --network none --name isolated_container busybox
配置防火墙规则(如仅允许特定 IP 访问容器):
bash
iptables -A DOCKER -s 192.168.1.100 -j ACCEPT
常见问题排查
检查容器 IP 地址:
bash
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
测试容器间连通性:
bash
docker exec -it container_name ping target_container
查看 Docker 日志:
bash
journalctl -u docker.service
通过以上方法,可灵活管理 Docker 网络以满足不同场景需求。
总结
Docker 以"容器化"为核心,通过镜像、容器、仓库三大组件实现了应用的标准化打包与分发,凭借轻量、高效、可移植的优势,解决了传统部署中的环境不一致、资源利用率低、部署繁琐等痛点。其客户端-服务端架构与底层支撑组件(数据卷、网络、Dockerfile 等)共同构成了完整的容器化解决方案,广泛应用于开发、测试、生产全流程,是现代软件研发与运维的必备工具。掌握 Docker 的核心组件与使用流程,是迈向 DevOps 与云原生架构的关键一步。