深入浅出Docker

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Docker是一种基于容器技术的开源平台,用于自动化应用的部署、扩展和管理。其核心组件包括镜像(Image)、容器(Container)和仓库(Registry)。镜像是静态只读模板,采用分层存储结构;容器是镜像的运行实例,通过Linux Namespace和Cgroups实现隔离与资源限制;仓库用于集中存储和分发镜像。Docker支持数据持久化(Volumes)、多种网络配置(如Bridge、Host、Overlay等)以及高效的操作命令,帮助企业实现快速开发、测试和部署流程。

容器与Docker简介

镜像(Image)

  • 定义静态的只读模板,包含运行应用所需的所有依赖(代码、环境、库、配置)。
  • 本质:分层存储结构(UnionFS),每一层是文件系统的增量修改。
  • 核心操作:docker pull(拉取)、docker build(构建)、docker push(推送)。
  • 生命周期:持久化存储,可重复使用。删除需显式执行 docker rmi

容器(Container)

  • 定义镜像的运行实例,本质是隔离的进程(通过 Linux Namespace 和 Cgroups 实现)。
  • 本质:镜像层(只读) + 容器层(读写),运行时添加数据。
  • 核心操作:docker run(创建并启动)、docker start/stop(启停)、docker exec(进入)。
  • 生命周期:临时性存在,停止后容器层数据默认丢失(需挂载卷持久化)。

仓库(Registry)

  • 定义集中存储和分发镜像的平台,类似代码仓库(GitHub)。
  • 核心操作:docker push(上传镜像)、docker pull(下载镜像)。
graph LR
    A[仓库 Registry] -- 上传/下载 --> B[镜像 Image]
    B -- 实例化 --> C[容器 Container]
    C -- 停止/销毁 --> B

Docker底层技术

  • Namespace(命名空间)隔离:为进程提供独立的系统视图(PID、网络、文件系统等)。
  • Cgroups(控制组)资源限制:限制进程使用的CPU、内存、磁盘I/O资源。
  • UnionFS(联合文件系统)镜像分层:镜像由多层只读文件叠加而成,提升存储效率。

镜像管理

镜像的本质:分层存储(UnionFS)

  • 只读层(RO Layers):每层都是文件系统的增量修改(如安装软件、添加文件)。
  • 容器层(RW Layer):容器启动时在镜像层之上添加可写层(所有修改在此层发生)。
  • 关键特性
    • 写时复制(Copy-on-Write):修改文件时,从下层复制到容器层再修改(原始镜像不变)。
    • 内容寻址存储:每层通过 SHA256哈希 唯一标识。
    • 共享基础层:多个镜像可共享相同基础层(如 Ubuntu 层),节省磁盘空间。

镜像管理核心操作

flowchart LR
    A[构建 Build] -->|docker build| B[本地镜像]
    B -->|docker push| C[仓库 Registry]
    C -->|docker pull| D[其他主机]
    D -->|docker run| E[运行容器]
  • docker pull [镜像名]:[标签]:从仓库拉取镜像。
  • docker images:列出本地镜像。
  • docker rmi [镜像ID]:删除本地镜像。
  • docker build -t [镜像名] [路径]:构建镜像(需 Dockerfile)。
  • docker tag [旧名] [新名]:重命名镜像。
  • docker save -o [文件] [镜像名]:导出镜像为 tar 文件。
  • docker load -i [文件]:导入 tar 文件为镜像。

Dockerfile构建流程解析

# 基础层 (可被其他镜像共享)
FROM python:3.9-slim AS builder
# 中间层 (安装依赖)
RUN pip install --no-cache-dir flask gunicorn
# 应用层 (添加代码)
COPY app.py /app/
WORKDIR /app
# 启动命令 (容器启动时执行)
CMD ["gunicorn", "-b 0.0.0.0:8000", "app:app"]

镜像优化策略

  • 多阶段构建:丢弃构建依赖,仅保留运行时文件。
  • 合并RUN命令:减少层数,清理缓存。
  • 镜像仓库管理
graph LR
    A[本地镜像] -->|docker login| B[Docker Hub]
    A -->|docker push| C[私有仓库]
    C -->|docker pull| D[生产服务器]

容器操作

容器生命周期

stateDiagram-v2
    [*] --> Created: docker create
    Created --> Running: docker start
    Running --> Paused: docker pause
    Paused --> Running: docker unpause
    Running --> Stopped: docker stop
    Stopped --> Running: docker start
    Running --> Killed: docker kill
    Stopped --> [*]: docker rm
    Killed --> [*]: docker rm
  • Created:容器已创建但未启动(docker create)。
  • Running:运行中(docker start/run)。
  • Paused:进程暂停(冻结状态,保留内存)。
  • Stopped:进程终止(发送 SIGTERM 信号)。
  • Killed:强制终止(发送 SIGKILL 信号)。
  • Removed:容器被删除。

核心命令操作

  • 容器创建与启动

    • docker run:创建并启动容器。

    • docker create:仅创建不启动。

    • docker start:启动已停止容器。

  • 容器交互与管理

    • docker exec:在运行中容器执行命令。

    • docker attach:附加到运行中容器。

    • docker logs:查看容器日志。
    • docker stats:实时监控资源。
    graph LR
        A[终端] -->|发送信号| B[Docker守护进程]
        B -->|转发信号| C[容器主进程]
        C -->|输出流| B
        B -->|显示输出| A
    
  • 容器停止与删除

    • docker stop:正常停止。
    • docker kill:强制停止。
    • docker rm:删除容器。
    graph LR
        A[docker stop] --> B[发送SIGTERM]
        B --> C{10秒内退出?}
        C -->|是| D[正常退出]
        C -->|否| E[发送SIGKILL]
    
        F[docker kill] --> G[直接发送SIGKILL]
    

数据持久化与卷(Volumes)

Docker数据持久化

  • 卷(Volumes):Docker 管理的存储区域,独立于容器生命周期;支持加密、权限控制;高性能(本地/云存储驱动)。

  • 绑定挂载(Bind Mounts):直接映射主机任意目录,容器可修改主机文件系统,适合开发环境代码同步。

  • 临时文件系统(tmpfs):数据仅存储在内存中,容器停止即消失,适合敏感临时数据。

卷(Volumes)

graph LR
    A[容器] --> B[(命名卷)]
    B --> C[/var/lib/docker/volumes/]
  • docker volume create :创建命名卷。
  • docker volume ls:列出所有卷。
  • docker volume inspect :查看卷详细信息。
  • docker run -v ::挂载卷到容器。

持久化核心要点

flowchart LR
   创建卷 --> 挂载到容器 --> 数据操作 --> 备份 --> 迁移/恢复

网络配置

Docker 网络架构

graph LR
    Host[主机物理网络] --> NS1[容器1网络命名空间]
    Host --> NS2[容器2网络命名空间]
    Host --> NS3[容器3网络命名空间]

    NS1 --> veth1[虚拟网卡veth0]
    NS2 --> veth2[虚拟网卡veth0]
    NS3 --> veth3[虚拟网卡veth0]

    veth1 --> BR[docker0网桥]
    veth2 --> BR
    veth3 --> BR

    BR --> eth0[主机物理网卡]
  • 网络命名空间(Network Namespace):每个容器独立的网络栈。
  • 虚拟网卡对(veth pair):连接容器和网桥。
  • 网桥(Bridge):软件交换机(默认docker0)。
  • IPtables/NAT:实现端口映射和防火墙。

Docker 网络驱动类型

模式 命令参数 特点 适用场景
Bridge --network=bridge 默认模式,NAT隔离 单主机容器通信
Host --network=host 共享主机网络栈 高性能需求
Overlay --network=overlay 多主机容器网络 Swarm/K8s集群
Macvlan --network=macvlan 直接分配MAC地址 传统网络集成
None --network=none 无网络 安全敏感场景
相关文章
|
21天前
|
关系型数据库 MySQL 数据库
【赵渝强老师】数据库不适合Docker容器化部署的原因
本文介绍了在Docker中部署MySQL数据库并实现数据持久化的方法,同时分析了数据库不适合容器化的原因。通过具体步骤演示如何拉取镜像、创建持久化目录及启动容器,确保数据安全存储。然而,由于数据安全性、硬件资源争用、网络带宽限制及额外隔离层等问题,数据库服务并不完全适合Docker容器化部署。文中还提到数据库一旦部署通常无需频繁升级,与Docker易于重构和重新部署的特点不符。
148 18
【赵渝强老师】数据库不适合Docker容器化部署的原因
|
15天前
|
存储 数据可视化 数据安全/隐私保护
【赵渝强老师】Docker的图形化管理工具
本文介绍了三种主流的Docker图形化管理工具:Docker UI、Portainer和Shipyard。Docker UI(现名UI for Docker)适合初学者,支持容器管理并可显示容器关系图;Portainer轻量级且功能全面,支持单机与集群管理;Shipyard专注于多主机集群管理,提供镜像、容器及节点管理功能,并包含engine和rethinkdb两个核心组件。文中还通过图文结合的方式展示了各工具的安装与使用方法。
【赵渝强老师】Docker的图形化管理工具
|
20天前
|
人工智能 程序员 PHP
Cursor AI来袭!编程从此不再繁琐,一键生成代码,效率提升千倍
AI攻破最后防线!连架构设计都能自动生成,中级程序员集体破防
192 10
Cursor AI来袭!编程从此不再繁琐,一键生成代码,效率提升千倍
|
1月前
|
存储 Kubernetes Serverless
容器技术 20 年:颠覆、重构与重塑软件世界的力量
从 20 世纪硬件虚拟化的笨重,到操作系统虚拟化的轻量探索,容器技术历经蜕变。2013 年 Docker 横空出世,以 “一次构建,到处运行” 的创举打破环境壁垒,开启容器黄金时代。随后,Docker Compose、Kubernetes、Istio 等技术相继涌现,从多容器管理到集群编排,再到微服务治理,不断突破应用部署与运维的边界。如今,容器与 DevOps 深度融合,Serverless 架构异军突起,共同重塑软件开发生态。本文将带你穿越容器技术发展的关键节点,揭秘其如何以颠覆性力量推动云计算与数字化。
238 62
|
22天前
|
弹性计算 Kubernetes API
Kubernetes 驱动的 IaC,Crossplane 快速入门
Crossplane 是一个开源的 Kubernetes 扩展工具,允许用户通过声明式配置直接在 Kubernetes 中管理云资源。对于阿里云开发者,借助 Crossplane 和官方提供的 provider-upjet-alibabacloud,可以像管理 Pod 一样轻松操作 ECS 实例、VPC 和 OSS Bucket 等资源。本文介绍了 Crossplane 的核心概念,并通过快速入门指南演示了如何安装 Crossplane、配置阿里云认证并创建第一个 VPC 资源。
110 37
|
7天前
|
移动开发 PHP 数据库
东郊到家网页版h5源码,可打包APP安卓ios,上门按摩源码免费下载php【仅供学习】
这是一套基于JS+H5开发的完整框架源码,支持对接微信或支付宝,内置数据库及PHP代码说明。功能包括快速加载、下单、地址管理、登录注册等,适合学习参考。示例包含用户表创建、验证码发送与验证、登录逻辑等核心功能,并提供测试数据初始化。附带界面截图展示订单状态与用户中心布局,便于快速上手开发类似应用系统。【仅供学习使用】
东郊到家网页版h5源码,可打包APP安卓ios,上门按摩源码免费下载php【仅供学习】
|
1月前
|
缓存 Shell 网络安全
将应用程序打包成Docker镜像时可能遇到哪些问题?
将应用程序打包成Docker镜像时可能遇到哪些问题?
201 77
|
1月前
|
关系型数据库 MySQL 数据库
Docker 安装常用软件相关命令
本文介绍了在CentOS 7.9系统上安装Docker的详细步骤,包括添加阿里云镜像源、安装Docker及相关组件、启动服务以及配置镜像加速。同时,还展示了如何通过Docker安装MySQL 5.7版本数据库,涵盖拉取镜像、创建数据目录、运行容器及配置挂载点等操作,并提供验证安装成功的命令和截图。适合需要部署Docker与MySQL环境的用户参考。
142 4
|
22天前
|
关系型数据库 MySQL Linux
实现MySQL数据库的定时自动备份脚本。
拿走,不谢,这个脚本配方(指引)保证你的数据库数据像蛋糕店一样地天天更新,还能确保老旧的蛋糕(数据)不会堆积满仓库。这下可好,数据安全有保障,数据库管理员也能轻松一点,偶尔闲下来的时候,煮杯咖啡,看个剧岂不美哉?别忘了偶尔检查一下你的自动备份是否正常工作,以防万一蛋糕机器出了点小差错。
68 20