首页 > 其他分享 >Docker 入门指南

Docker 入门指南

时间:2025-01-02 19:58:06浏览次数:3  
标签:指南 容器 入门 网络 Pod 镜像 Docker docker

简介

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 数据卷

数据卷是 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!

标签:指南,容器,入门,网络,Pod,镜像,Docker,docker
From: https://blog.csdn.net/Luckone999/article/details/144811375

相关文章

  • 单元化架构最佳实践指南!
    0前言单元化架构通过减少故障影响范围来增强系统的弹性。单元化架构是对于那些无法接受停机或可能对最终用户产生负面影响的系统的良好选择。单元化架构可能很复杂,有一些最佳实践可以遵循,以提高成功的机会。在推出单元化架构或将现有的云原生/微服务架构改造/转变为单元化架......
  • docker基本概念,docker镜像管理,docker命令
    docker基本概念镜像管理docker命令一.docker 1.基本概念 (1)docker:能够将程序和环境进行打包的工具 (2)容器:自带独立运行环境的特殊进程 (3)镜像:镜像可以被理解为一个模板,通过这个模板可以实例化出很多容器,包含容器所需的所有文件和配置信息. (4)仓库:用来存储......
  • JavaScript代码安全性提升:选择和使用JS混淆工具的指南
    https://toolin.cn/jsfuck https://maimai.cn/article/detail?fid=1827257627&efid=382Pa05uQ_i7jAl6rmq5tg 在Web开发中,JavaScript是一种常用的脚本语言,然而,由于其代码容易被他人轻易获取和修改,为了保护JavaScript代码的安全性和版权,我们需要使用JS混淆工具。本文将介绍什......
  • SM2 签名与验签前后端对接指南(基于 Hutool 和 sm-crypto)
    SM2签名与验签前后端对接指南本文档旨在指导如何使用Hutool(Java)和sm-crypto(TypeScript)库,实现基于SM2算法的签名与验签功能。确保前后端在签名与验证过程中,参数传递和密钥格式一致,避免因格式不匹配导致的验证失败。目录前提条件密钥格式说明私钥公钥后端实现(Java+......
  • 前端超大缓存IndexDB、入门及实际使用
    文章目录往期回顾项目实战初始化表获取列表新增表的数据项获取详情根据ID获取详情根据其他字段获取详情删除数据总结往期回顾在之前的文章中,我们介绍了IndexDBvsCookiesvsSession这几个的对比,但是没有做实际项目的演示,今天我们用实际项目来演示IndexDB的便捷......
  • 负载均衡指南:Nginx与HAProxy的配置与优化
    在现代网络应用中,负载均衡是确保高可用性和高性能的关键技术。通过将流量分配到多台服务器上,负载均衡器能够有效提升系统的处理能力,并防止单点故障。本文将详细介绍两种常见的负载均衡器——Nginx和HAProxy的配置与优化方法,并提供实际操作中的代码示例和技巧。一、Nginx负载均衡......
  • docker-compose安装nexus
    拉取镜像下载地址https://hub.docker.com/r/sonatype/nexus3dockerpullsonatype/nexus3创建持久化目录`mkdir/data/nexuschmod777/data/nexus`ymlversion:'3'services:nexus:restart:alwaysimage:192.168.1.223:10242/base/sonatype/nexus3:late......
  • Google Play 开发者账号申请指南
    先聊下出海应用为啥要上架GooglePlay?在海外,GooglePlay是绝大多数海外用户唯一信任和熟悉的应用分发平台,所以对于任何出海的应用来说,GooglePlay都是逃不过的大型流量池,也是出海需要迈出的第一步。退一步说,杠精想说我可以通过APK线下推广,不好意思,GooglePlay作为手机系统级......
  • Spring Boot 3 新特性 @RSocketExchange:轻松实现实时消息推送的全方位指南
    1.引言1.1SpringBoot3的背景及新特性概述SpringBoot作为Java开发中最流行的微服务框架之一,其每次大版本更新都带来了显著的技术改进和开发者体验优化。SpringBoot3引入了一系列新特性,特别是在性能优化、支持现代化协议以及对SpringFramework6的全面整合方......
  • Supabase 和 pgvector 的集成使用指南
    老铁们,今天咱们来聊聊使用Supabase和pgvector搭建自己的向量存储,这个技术点其实不难。Supabase是一个开放源码的Firebase替代品,构建在PostgreSQL之上。PostgreSQL,或称Postgres,是一个强调可扩展性和SQL合规的免费开源关系数据库管理系统(RDBMS)。在这个教程中,我......