简介
Docker 是一个开源的容器化平台,革命性地简化了应用程序的部署和管理。想象它就像是一个轻量级的"搬家专家",能将应用程序及其所有依赖打包到一个标准化的容器中,确保无论在哪里运行,都能保持一致的环境和性能。
Docker vs 虚拟机:
特性 | Docker | 虚拟机 |
---|---|---|
虚拟化方式 | 操作系统级别虚拟化(容器) | 硬件级别虚拟化(完整的操作系统) |
资源利用 | 更加高效,容器共享宿主机内核 | 资源开销大,每个虚拟机都需要完整的操作系统 |
启动时间 | 启动速度快(几秒钟) | 启动速度慢(可能需要几分钟) |
资源隔离 | 共享操作系统内核,隔离性较弱 | 完全隔离,虚拟机拥有独立的操作系统内核 |
性能 | 高性能,较少的资源浪费 | 较高的性能损失,由于虚拟化的开销 |
使用场景 | 适合微服务、CI/CD流水线、开发环境 | 适合多种操作系统运行、独立应用运行 |
安装
安装前提
- 操作系统:Windows、macOS 或 Linux
- 系统配置:推荐 64 位操作系统
- 硬件要求:至少 4GB 内存
安装步骤
- 访问官方网站 Docker官网
- 选择适合当期操作系统对应版本
- 下载并安装程序
- 验证安装:在终端/命令提示符中运行
docker --version
入门篇
镜像管理
Docker 镜像是容器的蓝图,包含应用的所有代码、库、依赖项、设置等。通过 Docker 镜像,我们可以在任何地方快速启动容器。
概念理解
镜像是容器的"模板",类似于软件安装包:
- 包含运行环境和应用代码
- 只读模板,可批量创建容器
- 可以层层构建和继承
- 可在DockerHub共享
关键特点
- 基础镜像(如Ubuntu)
- 应用镜像(如Nginx)
- 用于快速部署和复制环境
- 版本管理和追溯
- 轻量级、可快速下载和传输
基本镜像操作
命令 | 作用 | 示例 |
---|---|---|
docker images | 列出本地所有镜像 | - |
docker pull [镜像名] | 从仓库拉取镜像 | docker pull nginx |
docker push [镜像名] | 推送镜像到仓库 | docker push myuser/myimage |
docker rmi [镜像ID] | 删除本地镜像 | docker rmi abc123 |
docker build | 根据 Dockerfile 构建镜像 | docker build -t myapp . |
docker save | 导出镜像为 tar 文件 | docker save -o myimage.tar nginx |
docker load | 从 tar 文件加载镜像 | docker load -i myimage.tar |
创建并运行容器
docker run -d # 后台运行
--name nginx-container # 为容器指定一个名称
-p 80:80 # 端口映射:主机80映射到容器80
-e ENV_VAR=value # 设置环境变量
nginx # 指定运行的镜像名称(这里是 nginx,可以换成自己的镜像名)
容器管理
Docker 容器是运行中的实例,是在镜像的基础上启动的。容器提供了隔离的环境,包括独立的网络、文件系统和内存空间。
概念理解
容器是 Docker 的核心概念,可以类比为一个轻量级的"虚拟机":
- 打包应用及其所有依赖
- 提供独立运行环境
- 秒级启动和部署
- 资源占用极少
- 可随时创建、启动、停止、删除
容器特点
容器是一个独立的运行环境,具有:
- 独立网络空间
- 独立文件系统
- 独立内存资源
- 高度隔离,互不影响
- 轻量级、可移植
容器操作
命令 | 作用 | 说明 |
---|---|---|
docker ps | 查看运行中的容器 | 默认只显示活跃容器 |
docker ps -a | 查看所有容器 | 包括已停止的容器 |
docker stop [容器ID] | 停止容器 | 仅停止进程,不删除 |
docker rm [容器ID] | 删除已停止容器 | 不能删除运行中容器 |
docker rm -f [容器ID] | 强制删除容器 | 可删除运行中容器 |
docker start [容器ID] | 启动已停止容器 | - |
docker logs [容器ID] | 查看容器日志 | 调试常用 |
docker exec -it [容器ID] bash | 进入容器内部 | 交互式终端 |
进阶篇
Docker 数据卷
数据卷是 Docker 容器存储数据的重要机制,用于持久化和共享数据,解决容器数据存储的关键问题。
概念理解
数据卷是独立于容器的存储空间,具有以下特点:
- 可持久化存储容器数据
- 支持在多个容器间共享数据
- 独立于容器生命周期
- 数据可直接修改,无需通过容器
- 提高数据安全性和灵活性
数据卷特点
数据卷提供了比直接在容器中存储更加灵活的数据管理方式:
- 数据独立于容器
- 可以在多个容器间共享
- 支持多种存储类型(本地、网络存储)
- 方便数据备份和迁移
- 性能开销低
数据卷操作
命令 | 作用 | 说明 |
---|---|---|
docker volume create [卷名] | 创建数据卷 | 创建一个命名卷 |
docker volume ls | 列出所有数据卷 | 显示已创建的数据卷 |
docker volume inspect [卷名] | 查看数据卷详情 | 显示卷的具体信息 |
docker volume rm [卷名] | 删除数据卷 | 删除指定数据卷 |
docker run -v [卷名]:[容器路径] | 挂载数据卷 | 将数据卷挂载到容器 |
docker run -v [本地路径]:[容器路径] | 绑定挂载 | 将本地目录映射到容器 |
docker volume prune | 清理无用数据卷 | 删除未被容器使用的卷 |
数据卷使用示例
# 创建数据卷
docker volume create mydata
# 在 MySQL 容器中使用数据卷
docker run -d --name mysql-container \
-v mydata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=mypassword \
mysql:latest
# 本地目录挂载
docker run -v /host/path:/container/path nginx:latest
数据卷类型
-
匿名卷
- 系统自动生成名称
- 随容器自动创建和删除
-
命名卷
- 手动创建并命名
- 便于管理和复用
-
绑定挂载
- 将本地主机目录直接挂载到容器
- 开发和测试常用方式
最佳实践
- 使用命名卷管理持久化数据
- 避免在容器内直接存储重要数据
- 定期备份数据卷
- 合理规划存储空间
- 使用只读卷提高安全性
Docker 网络
Docker 网络是容器间通信和与外部网络交互的关键机制,提供了灵活的网络配置和隔离方案。
概念理解
Docker 网络是容器通信的基础设施,具有以下核心特点:
- 提供容器间网络隔离
- 支持多种网络模式
- 实现容器与宿主机的网络互通
- 简化复杂的网络配置
- 支持跨主机网络通信
网络类型
网络模式 | 特点 | 适用场景 |
---|---|---|
bridge | 默认网络模式 | 单机容器通信 |
host | 直接使用宿主机网络 | 性能敏感应用 |
none | 禁用网络 | 完全隔离场景 |
overlay | 多主机通信 | 分布式系统 |
macvlan | 直接连接物理网络 | 需要独立 MAC 地址 |
网络操作命令
命令 | 作用 | 说明 |
---|---|---|
docker network ls | 列出所有网络 | 查看当前网络配置 |
docker network create | 创建自定义网络 | 支持多种网络驱动 |
docker network inspect | 查看网络详细信息 | 获取网络配置 |
docker network rm | 删除自定义网络 | 清理不需要的网络 |
docker run --network | 指定容器网络 | 精确控制网络连接 |
默认网络 vs 自定义网络
特性 | 默认网络 (bridge) | 自定义网络 |
---|---|---|
通信方式 | 通过容器的 IP 地址通信,容器重启后 IP 可能变化 | 通过容器名直接通信,容器名解析稳定 |
网络隔离 | 所有容器共享同一网络,隔离性较差 | 支持精细化网络隔离,可以创建多个网络 |
配置灵活性 | 配置简单,无法进行高级定制 | 支持自定义子网、网关等高级配置 |
适用场景 | 简单的单机应用,适合基础的容器通信 | 需要高隔离、稳定通信或微服务架构的场景 |
默认网络 (bridge)
-
docker0虚拟网桥:
安装 Docker 时,Docker 会创建一个虚拟网桥(docker0
),并为其配置一个 IP 地址范围(例如:172.17.0.1/16
)。所有容器默认通过该虚拟网桥进行通信。 -
IP 地址分配:
每个容器启动时都会分配一个 IP 地址,但容器重启后 IP 地址可能会发生变化。例如,如果一个容器(如 MySQL)在系统重启后启动顺序不同,另一个容器可能会占用该 IP 地址,导致 MySQL 容器获得新的 IP。 -
容器间通信:
在默认的docker0
网络中,容器之间可以通过容器的 IP 地址进行通信,但不能通过容器名直接访问。容器间的通信依赖于 IP 地址,这可能在动态 IP 地址的情况下带来不便。
自定义网络
自定义网络提供了比默认网络更多的功能和灵活性,适用于需要更高控制和安全性的场景。
-
容器名解析:
自定义网络支持容器名解析,容器可以通过容器名进行直接通信。Docker 为加入自定义网络的容器提供 DNS 解析服务,使容器能够通过名称来互相识别和通信。 -
多网络支持:
一个容器可以加入多个网络,每个网络都会分配一个独立的 IP 地址。这使得容器能够跨多个网络环境进行通信。例如,容器可以同时连接到一个内部网络和一个外部网络。 -
更高的网络隔离:
自定义网络允许对网络的隔离性进行更精细的控制。在微服务架构或分布式系统中,可以将不同的服务部署到不同的网络中,增强安全性和管理灵活性。 -
配置灵活性:
自定义网络支持更多高级配置选项,如自定义子网、网关等,使得网络配置更加灵活,能够满足特定的网络需求。
网络使用示例
# 创建自定义网络
docker network create myapp-network
# 在自定义网络中运行容器
docker run -d --name web1 --network myapp-network nginx
docker run -d --name web2 --network myapp-network nginx
# 查看网络详情
docker network inspect myapp-network
网络高级配置
-
容器互联
- 同一网络内容器可直接通过容器名通信
- 自动DNS解析
- 网络隔离更安全
-
端口映射
- 将容器端口映射到宿主机
- 实现外部访问容器服务
docker run -p 80:80 nginx
-
网络别名
- 为容器配置额外的网络标识
- 增加网络灵活性
最佳实践
- 使用自定义网络代替默认网络
- 合理规划网络架构
- 最小化网络暴露
- 使用网络别名简化服务发现
- 控制端口映射范围
- 注意网络安全配置
常见网络问题排查
- 检查容器网络配置
- 验证端口映射
- 使用
docker network inspect
分析网络 - 检查防火墙设置
- 确认网络模式匹配
Docker 系统资源管理命令
docker system df
命令描述
docker system df
用于显示 Docker 系统资源使用情况,帮助用户了解磁盘空间占用情况。
命令语法
docker system df [OPTIONS]
常用选项
-v
或--verbose
:显示详细的空间使用信息
输出信息
命令通常会展示以下资源的磁盘空间使用情况:
- 镜像(Images)
- 容器(Containers)
- 数据卷(Volumes)
使用示例
# 查看 Docker 系统资源使用情况
docker system df
# 查看详细的空间使用信息
docker system df -v
典型输出
类型 | 总计 | 活跃 | 占用空间 | 可回收空间 |
---|---|---|---|---|
Images | 10 | 5 | 2.5GB | 1.2GB |
Containers | 15 | 8 | 500MB | 200MB |
Volumes | 7 | 5 | 2GB | 500MB |
应用场景
- 检查磁盘空间占用
- 识别可以清理的资源
- 进行系统资源管理
docker builder prune -f
命令描述
docker builder prune -f
用于清理构建过程中的缓存,帮助释放磁盘空间。
命令语法
docker builder prune [OPTIONS]
常用选项
-f
或--force
:强制删除,不进行确认--all
:删除所有未使用的构建缓存--filter
:根据特定条件过滤要删除的缓存
使用示例
# 强制删除未使用的构建缓存
docker builder prune -f
# 删除所有未使用的构建缓存
docker builder prune --all
# 删除特定时间之前的缓存
docker builder prune --filter "until=24h"
注意事项
- 删除缓存可以释放磁盘空间
- 下次构建镜像时可能会增加构建时间
- 谨慎使用
-f
选项,避免意外删除重要缓存
应用场景
- 清理磁盘空间
- 重置构建缓存
- 管理 Docker 构建环境
高级篇
Kubernetes(K8s)
Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它在容器化应用的生命周期管理中起着至关重要的作用,特别是当容器数量和复杂度增加时,K8s 提供了强大的工具和功能来保持应用的高可用性和可扩展性。
1. K8s 核心概念
Kubernetes 的基本结构包括几个重要的概念和组件,它们是实现容器编排和管理的基础。
- Pod: 最小的部署单位,一个 Pod 代表一组运行在同一主机上的容器。Pod 内的容器共享网络和存储资源。
- Node: K8s 集群中的每台物理或虚拟机都被称为 Node。节点上运行 Pod 和容器。
- Cluster: 由一组 Node 组成,K8s 控制平面(Control Plane)负责管理集群。
- Deployment: 控制 Pod 的创建和管理,用于声明应用程序的期望状态,并确保集群保持该状态。
- Service: 为 Pod 提供稳定的访问入口,支持负载均衡和发现服务。
- Namespace: 用于在同一个集群内将资源划分成不同的隔离区,可以通过命名空间组织和管理集群中的资源。
2. K8s 核心组件
Kubernetes 由控制平面和工作节点组成,其中包含多个组件来完成不同的功能。
- API Server: 提供 Kubernetes 集群的 REST API 接口,所有管理请求都通过它进行。
- Scheduler: 负责将 Pod 分配到合适的节点上执行,依据资源利用率和调度策略。
- Controller Manager: 管理集群中的控制器,如 Deployment Controller、ReplicaSet Controller、Job Controller 等。
- Kubelet: 每个节点上的代理,负责确保容器和 Pod 的正常运行。
- etcd: 一个分布式键值存储系统,保存 Kubernetes 集群的所有配置数据和状态。
- Cloud Controller Manager: 提供集群与云平台(如 AWS、GCP)的集成。
3. Kubernetes 操作
命令 | 作用 | 示例 |
---|---|---|
kubectl get pods | 列出所有 Pod | kubectl get pods |
kubectl describe pod [Pod名称] | 查看 Pod 详细信息 | kubectl describe pod myapp-pod |
kubectl apply -f [YAML文件] | 根据配置文件创建或更新资源 | kubectl apply -f deployment.yaml |
kubectl delete pod [Pod名称] | 删除指定 Pod | kubectl delete pod myapp-pod |
kubectl scale deployment [部署名称] --replicas=[副本数] | 扩展或缩减副本数 | kubectl scale deployment myapp --replicas=5 |
kubectl logs [Pod名称] | 查看 Pod 日志 | kubectl logs myapp-pod |
kubectl port-forward [Pod名称] [本地端口]:[Pod端口] | 端口转发 | kubectl port-forward myapp-pod 8080:80 |
4. 常见的 Kubernetes 资源
- Pod: 容器运行的基本单位。
- Deployment: 用于管理 Pod 的副本,确保指定数量的 Pod 副本始终运行。
- ReplicaSet: 确保一个特定数量的 Pod 副本在任何时候都在运行。
- Service: 提供负载均衡和服务发现。
- Ingress: 管理外部访问到集群内服务的规则,支持 HTTP 和 HTTPS 路由。
- ConfigMap: 存储非敏感的配置信息。
- Secret: 存储敏感数据,如密码、Token 等。
- StatefulSet: 用于管理有状态应用,保证 Pod 的顺序和持久化存储。
- Job: 用于批量任务的管理,执行一次性任务。
- CronJob: 定时任务,基于 Cron 表达式定时执行任务。
5. 实战案例
部署一个简单的 Nginx 应用
- 创建一个
nginx-deployment.yaml
配置文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
- 使用
kubectl
创建 Deployment:
kubectl apply -f nginx-deployment.yaml
- 创建一个 Service 以暴露 Nginx 服务:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
- 部署 Service:
kubectl apply -f nginx-service.yaml
- 查看服务:
kubectl get svc nginx-service
这样,你就可以通过负载均衡的方式访问多个 Nginx 实例。
6. 高级特性
- Horizontal Pod Autoscaling: 根据 CPU 使用率或其他指标自动调整 Pod 数量。
- Pod Disruption Budgets (PDB): 确保在进行滚动更新时,集群中始终有足够的 Pod 存活。
- Persistent Volumes (PV) 和 Persistent Volume Claims (PVC): 用于管理存储,确保数据在 Pod 重启或迁移时不丢失。
- Helm: 一个 Kubernetes 包管理工具,可以帮助你快速部署和管理复杂的应用。
- Operators: 自定义控制器,用于管理复杂的有状态应用,简化应用部署和操作。
最终篇
学习路径推荐
- 入门:掌握基本命令和概念
- 进阶:Docker Compose与网络、数据卷管理
- 高级:容器编排(Kubernetes)
- 实战:看十遍不如动手一遍
希望这份文档能帮助你更好地理解和使用 Docker!
标签:指南,容器,入门,网络,Pod,镜像,Docker,docker From: https://blog.csdn.net/Luckone999/article/details/144811375