Docker 入门指南

beizou 发布于 2024-12-09 631 次阅读


AI 摘要

在数字时代,自动化技术正悄然改变我们的生活和工作方式。本文将探讨自动化如何通过提高效率和减少人为错误,塑造未来的职业格局。你是否想知道,自动化是否会取代现实中的工作,还是会创造出新的机遇?让我们一起揭开这个引人入胜的话题,探索数字化转型下的职场新生态,为未来的职业生涯做好准备。

简介

Docker 是一个开源的容器化平台,革命性地简化了应用程序的部署和管理。想象它就像是一个轻量级的"搬家专家",能将应用程序及其所有依赖打包到一个标准化的容器中,确保无论在哪里运行,都能保持一致的环境和性能。

Docker vs 虚拟机:

特性Docker虚拟机
虚拟化方式操作系统级别虚拟化(容器)硬件级别虚拟化(完整的操作系统)
资源利用更加高效,容器共享宿主机内核资源开销大,每个虚拟机都需要完整的操作系统
启动时间启动速度快(几秒钟)启动速度慢(可能需要几分钟)
资源隔离共享操作系统内核,隔离性较弱完全隔离,虚拟机拥有独立的操作系统内核
性能高性能,较少的资源浪费较高的性能损失,由于虚拟化的开销
使用场景适合微服务、CI/CD流水线、开发环境适合多种操作系统运行、独立应用运行

安装

安装前提

  • 操作系统:Windows、macOS 或 Linux
  • 系统配置:推荐 64 位操作系统
  • 硬件要求:至少 4GB 内存

安装步骤

  1. 访问官方网站 Docker官网
  2. 选择适合当期操作系统对应版本
  3. 下载并安装程序
  4. 验证安装:在终端/命令提示符中运行 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 commit [容器ID] [镜像名称]提交容器为镜像将容器的当前状态保存为新镜像
docker tag [镜像ID] [新镜像名称:标签]给镜像打标签为镜像添加标签,便于标识和管理

进阶篇

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

数据卷类型

  1. 匿名卷
    • 系统自动生成名称
    • 随容器自动创建和删除
  2. 命名卷
    • 手动创建并命名
    • 便于管理和复用
  3. 绑定挂载
    • 将本地主机目录直接挂载到容器
    • 开发和测试常用方式

最佳实践

  • 使用命名卷管理持久化数据
  • 避免在容器内直接存储重要数据
  • 定期备份数据卷
  • 合理规划存储空间
  • 使用只读卷提高安全性

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)

  1. docker0虚拟网桥:
    安装 Docker 时,Docker 会创建一个虚拟网桥(docker0),并为其配置一个 IP 地址范围(例如:172.17.0.1/16)。所有容器默认通过该虚拟网桥进行通信。

  2. IP 地址分配:
    每个容器启动时都会分配一个 IP 地址,但容器重启后 IP 地址可能会发生变化。例如,如果一个容器(如 MySQL)在系统重启后启动顺序不同,另一个容器可能会占用该 IP 地址,导致 MySQL 容器获得新的 IP。

  3. 容器间通信:
    在默认的 docker0 网络中,容器之间可以通过容器的 IP 地址进行通信,但不能通过容器名直接访问。容器间的通信依赖于 IP 地址,这可能在动态 IP 地址的情况下带来不便。

自定义网络

自定义网络提供了比默认网络更多的功能和灵活性,适用于需要更高控制和安全性的场景。

  1. 容器名解析:
    自定义网络支持容器名解析,容器可以通过容器名进行直接通信。Docker 为加入自定义网络的容器提供 DNS 解析服务,使容器能够通过名称来互相识别和通信。

  2. 多网络支持:
    一个容器可以加入多个网络,每个网络都会分配一个独立的 IP 地址。这使得容器能够跨多个网络环境进行通信。例如,容器可以同时连接到一个内部网络和一个外部网络。

  3. 更高的网络隔离:
    自定义网络允许对网络的隔离性进行更精细的控制。在微服务架构或分布式系统中,可以将不同的服务部署到不同的网络中,增强安全性和管理灵活性。

  4. 配置灵活性:
    自定义网络支持更多高级配置选项,如自定义子网、网关等,使得网络配置更加灵活,能够满足特定的网络需求。

网络使用示例

# 创建自定义网络
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

网络高级配置

  1. 容器互联

    • 同一网络内容器可直接通过容器名通信
    • 自动DNS解析
    • 网络隔离更安全
  2. 端口映射
    • 将容器端口映射到宿主机
    • 实现外部访问容器服务
    docker run -p 80:80 nginx
    
  3. 网络别名
    • 为容器配置额外的网络标识
    • 增加网络灵活性

最佳实践

  • 使用自定义网络代替默认网络
  • 合理规划网络架构
  • 最小化网络暴露
  • 使用网络别名简化服务发现
  • 控制端口映射范围
  • 注意网络安全配置

常见网络问题排查

  • 检查容器网络配置
  • 验证端口映射
  • 使用 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

典型输出

类型总计活跃占用空间可回收空间
Images1052.5GB1.2GB
Containers158500MB200MB
Volumes752GB500MB

应用场景

  • 检查磁盘空间占用
  • 识别可以清理的资源
  • 进行系统资源管理

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列出所有 Podkubectl 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名称]删除指定 Podkubectl 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 应用

  1. 创建一个 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
  1. 使用 kubectl 创建 Deployment:
kubectl apply -f nginx-deployment.yaml
  1. 创建一个 Service 以暴露 Nginx 服务:
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  type: LoadBalancer
  1. 部署 Service:
kubectl apply -f nginx-service.yaml
  1. 查看服务:
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!🐳