news 2026/4/16 11:23:04

Docker 详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Docker 详解

一、Docker 概述

Docker是一个开源的应用容器引擎,基于Go语言开发,并遵循Apache2.0协议开源。Docker允许开发者将应用以及依赖包打包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux、Windows或Mac机器上,也可以实现虚拟化。容器完全使用沙箱机制,相互之间不会有任何接口,更重要的是容器性能开销极低。

二、Docker与虚拟机的区别

Docker与虚拟机是两种不同的虚拟化技术,它们在架构、性能、资源使用和隔离级别等方面有显著区别。

  1. 架构差异

    • 虚拟机(VM):
      • 硬件级虚拟化:每个虚拟机包括完整的操作系统、应用程序以及相关的库和依赖。
      • 隔离级别:每个虚拟机之间以及虚拟机与宿主机之间完全隔离,安全性高。
    • Docker(容器):
      • 操作系统级虚拟化:容器共享宿主机的操作系统内核,但每个容器运行在独立的用户空间中。容器包括应用程序及其依赖,但不需要完整的操作系统。Docker引擎运行在宿主机操作系统上,负责管理容器。
      • 隔离级别:容器之间通过命名空间(Namespace)和控制组(cgroups)进行隔离,但共享内核,因此隔离级别比虚拟机低。
  2. 性能比较

    • 虚拟机(VM):
      • 启动速度较慢(分钟级),因为需要启动整个操作系统。
      • 资源消耗较大,每个虚拟机都需要分配独立的资源(内存、CPU等),并且有额外的操作系统开销。
      • 性能有损失,因为应用程序运行在虚拟硬件上,需要通过Hypervisor层。
    • Docker(容器):
      • 启动速度极快(秒级甚至毫秒级),因为容器直接运行在宿主机内核上,无需启动操作系统。
      • 资源消耗小,多个容器共享宿主机内核,没有额外的操作系统开销。
      • 性能接近原生,因为容器直接运行在宿主机上,没有虚拟硬件层。
  3. 资源使用效率

    • 虚拟机(VM):
      • 每个虚拟机都需要完整的操作系统,因此占用磁盘空间大(通常几GB到几十GB)。
      • 内存占用也大,因为每个虚拟机都要运行操作系统进程。
    • Docker(容器):
      • 容器共享宿主机内核,只需要存储应用程序及其依赖,因此镜像体积小(通常几MB到几百MB)。
      • 内存占用少,因为多个容器可以共享宿主机的操作系统内核。
  4. 隔离性和安全性

    • 虚拟机(VM):
      • 完全隔离,每个虚拟机有独立的操作系统和内核,一个虚拟机的崩溃不会影响其他虚拟机或宿主机。
      • 安全性高,攻击者需要先突破虚拟机,然后再突破Hypervisor才能访问宿主机。
    • Docker(容器):
      • 隔离性相对较弱,虽然容器之间通过命名空间隔离,但共享内核,因此内核漏洞可能影响所有容器。
      • 安全性较低,如果容器内的应用程序获得宿主机内核的访问权限,可能会影响其他容器和宿主机。
  5. 可移植性

    • 虚拟机(VM):
      • 虚拟机镜像通常较大,迁移和分发不如容器方便。
      • 虚拟机可以在不同Hypervisor上运行,但可能需要调整配置。
    • Docker(容器):
      • 容器镜像轻量,易于分发和迁移,适合持续集成和持续部署(CI/CD)。
      • 容器可以在任何安装Docker引擎的宿主机上运行,保证了环境一致性。
  6. 使用场景

    • 虚拟机(VM):
      • 适合运行不同操作系统的应用程序(例如在Linux服务器上运行Windows应用)。
      • 需要完全隔离的环境,如多租户环境、安全要求高的场景。
      • 遗留系统迁移,或者需要模拟完整硬件环境的情况。
    • Docker(容器):
      • 微服务架构,每个服务运行在独立的容器中,便于扩展和管理。
      • DevOps实践,实现快速部署和弹性伸缩。
      • 云原生应用,容器可以轻松在云环境中部署和迁移。

三、Docker 的核心优势

  • 轻量级:共享主机内核,无需完整操作系统
  • 可移植性:一次构建,到处运行
  • 隔离性:进程、网络、文件系统隔离
  • 快速部署:秒级启动和停止
  • 版本控制:支持镜像版本管理
  • 生态丰富:Docker Hub 提供海量镜像

四、Docker核心概念

4.1 镜像(Image)

4.1.1 定义

Docker 镜像是只读的模板,包含了运行应用程序所需的一切:

  • 操作系统(精简版)
  • 运行时环境
  • 应用程序代码
  • 依赖库
  • 配置文件
  • 环境变量

4.1.2 镜像的核心特性

  1. 只读性

    # 镜像是不可变的docker pull ubuntu:20.04# 下载的镜像不能修改# 基于镜像创建容器时,会添加一个可写层+---------------------+|容器可写层|← 容器层(可修改) +---------------------+|镜像只读层|← 镜像层(不可变) +---------------------+
  2. 分层存储(Layer)

    # Dockerfile 示例FROM ubuntu:20.04# 第1层:基础镜像RUNapt-getupdate# 第2层:执行命令COPY app.py /app/# 第3层:添加文件RUN pipinstallflask# 第4层:安装依赖CMD["python","app.py"]# 第5层:启动命令

    分层优势:

    • 共享存储:多个镜像共享相同的基础层
    • 快速构建:只重新构建变化的层
    • 节省空间:相同层只存储一次
    镜像 myapp:v1 ├── Layer4: CMD["python","app.py"](2KB)├── Layer3: RUN pipinstallflask(15MB)├── Layer2: COPY app.py /app/(5KB)└── Layer1: FROM ubuntu:20.04(72MB)镜像 myapp:v2 ├── Layer5: COPY config.json /app/(3KB)← 新增 ├── Layer4: CMD["python","app.py"](2KB)← 共享 ├── Layer3: RUN pipinstallflask(15MB)← 共享 ├── Layer2: COPY app.py /app/(5KB)← 共享 └── Layer1: FROM ubuntu:20.04(72MB)← 共享

4.1.3 镜像的生命周期

# 1. 编写 Dockerfile# 2. 构建镜像docker build -t myapp:1.0.# 3. 查看本地镜像docker images# 4. 推送镜像到仓库docker push myregistry.com/myapp:1.0# 5. 拉取镜像docker pull myregistry.com/myapp:1.0# 6. 运行容器docker run myapp:1.0# 7. 删除镜像docker rmi myapp:1.0

4.1.4 镜像操作命令

  1. 基本操作

    # 查看本地镜像docker images docker imagels# 搜索镜像docker search nginx# 拉取镜像docker pull ubuntu:20.04 docker pull nginx:alpine# 删除镜像docker rmi ubuntu:20.04 docker imagermnginx:alpine# 删除所有未使用镜像docker image prune -a
  2. 镜像标签管理

    # 添加标签docker tag ubuntu:20.04 myregistry.com/ubuntu:latest docker tag myapp:1.0 myapp:production# 查看镜像历史dockerhistoryubuntu:20.04# 导出镜像docker save ubuntu:20.04>ubuntu.tar# 导入镜像docker load<ubuntu.tar# 导出容器为镜像dockerexportcontainer_id>container.tar
  3. 镜像构建与优化

    # 构建镜像docker build -t myapp:1.0.docker build -t myapp:1.0 -f Dockerfile.prod.# 查看构建过程docker build --progress=plain.# 多阶段构建docker build -t myapp:multi-stage.# 构建参数docker build --build-argVERSION=1.0.

4.2 容器(Container)

4.2.1 定义

Docker 容器是镜像的运行实例,是一个轻量级、可执行的软件包,包含:

  • 应用程序及其所有依赖项
  • 独立的文件系统
  • 网络配置
  • 进程空间
  • 资源限制

4.2.2 容器的核心特性

  1. 轻量级

    # 与传统虚拟机对比+-----------------------------+|虚拟机:重量级隔离||+-----------------------+|||Guest OS||||+-----------------+|||||App|||||+-----------------+|||+-----------------------+|+-----------------------------+ 启动时间:分钟级|内存:GB级 +-----------------------------+|Docker容器:轻量级隔离||+-----------------------+|||App|||+-----------------------+|+-----------------------------+ 启动时间:秒级|内存:MB级
  2. 隔离性

    # Linux 内核特性实现隔离1. Namespaces:进程、网络、挂载点隔离2. Cgroups:CPU、内存、磁盘I/O限制3. UnionFS:分层文件系统# 查看容器命名空间ls-la /proc/<container-pid>/ns/

4.2.3 容器的生命周期

  1. 生命周期状态

    创建(Created)→ 运行(Running)→ 暂停(Paused)↓ ↓ ↓ → 停止(Stopped)→ 删除(Deleted)
  2. 状态转换命令

    # 完整生命周期管理docker create --name mycont nginx:alpine# 创建docker start mycont# 启动docker pause mycont# 暂停docker unpause mycont# 恢复docker stop mycont# 停止(优雅停止)dockerkillmycont# 强制停止docker restart mycont# 重启dockerrmmycont# 删除

4.2.4 容器操作命令

  1. 基础操作

    # 运行容器docker run -d --name web nginx:alpine# 运行并进入交互模式docker run -it --name ubuntu ubuntu:20.04bash# 查看运行中的容器dockerps# 查看所有容器(包括停止的)dockerps-a# 查看容器详情docker inspect web# 查看容器日志docker logs web docker logs -f web# 实时查看docker logs --tail100web# 最后100行
  2. 容器控制

    # 进入运行中的容器dockerexec-it webbashdockerexec-it webshdockerexec-it web /bin/bash# 在容器内执行命令(不进入)dockerexecwebls-la /usr/share/nginx/html dockerexecwebpsaux# 复制文件dockercpindex.html web:/usr/share/nginx/html/ dockercpweb:/var/log/nginx/access.log ./nginx.log# 重命名容器dockerrenameweb nginx-server
  3. 资源监控

    # 查看容器资源使用docker stats docker stats --no-stream# 单次查看docker stats web# 指定容器# 查看容器进程dockertopweb# 查看容器端口映射docker port web# 查看容器元数据docker inspect web|grep-A10"NetworkSettings"

4.2.5 容器运行参数详解

  1. 基础运行选项

    # 完整的运行示例docker run -d\# 后台运行--name myapp\# 容器名称--hostname app-server\# 主机名--restart unless-stopped\# 重启策略-p8080:80\# 端口映射-p443:443\-v /data:/var/lib/app\# 数据卷挂载-eDATABASE_URL=postgres://...\# 环境变量--memory="512m"\# 内存限制--cpus="1.5"\# CPU限制--network my-network\# 网络myapp:latest# 镜像
  2. 端口映射

    # 基本端口映射docker run -p80:80 nginx# 绑定特定IPdocker run -p127.0.0.1:80:80 nginx# 随机端口docker run -p80nginx# 多端口映射docker run -p8080:80 -p8443:443 nginx# UDP端口docker run -p53:53/udp dns-server
  3. 环境变量

    # 单个环境变量docker run -eMY_VAR=value myapp# 多个环境变量docker run -eVAR1=value1 -eVAR2=value2 myapp# 从文件读取docker run --env-file .env myapp# 传递主机环境变量docker run -eHOMEmyapp
  4. 资源限制

    # CPU限制docker run --cpus=0.5myapp# 最多使用0.5个CPU核心docker run --cpuset-cpus="0,2"myapp# 绑定到特定CPU核心# 内存限制docker run --memory="512m"myapp# 内存限制512MBdocker run --memory-swap="1g"myapp# 交换分区限制docker run --memory-reservation="256m"myapp# 内存软限制# 磁盘I/O限制docker run --device-write-bps /dev/sda:10mb myapp
  5. 重启策略

    # 自动重启策略docker run --restart no# 不自动重启(默认)docker run --restart on-failure# 失败时重启docker run --restart on-failure:5# 最多重启5次docker run --restart always# 总是重启docker run --restart unless-stopped# 除非手动停止,否则重启

4.3 仓库(Repository)

4.3.1 定义

Docker 仓库是存储和分发 Docker 镜像的中心化服务,类似代码仓库(Git),但专门用于 Docker 镜像。

4.3.2 核心概念

镜像仓库生态系统: 仓库(Repository) → 注册中心(Registry) → 镜像标签(Tag) 仓库:存储特定镜像的所有版本(如 nginx, mysql) 注册中心:存放多个仓库的服务(如 Docker Hub) 标签:镜像的版本标识(如 :latest, :1.0, :alpine)

4.3.3 仓库类型

  1. 公共仓库
# Docker Hub(官方)https://hub.docker.com/# 第三方公共仓库- Google Container Registry(GCR)- Amazon ECR Public Gallery - Azure Container Registry - GitHub Container Registry(GHCR)- Quay.io
  1. 私有仓库
# 自建私有注册中心docker run -d -p5000:5000 --name registry registry:2# 云厂商托管- AWS ECR(Amazon Elastic Container Registry) - Google Cloud Container Registry - Azure Container Registry - 阿里云容器镜像服务 - 腾讯云容器镜像服务

4.3.4 仓库操作命令

  1. 基本操作

    # 搜索镜像docker search nginx docker search --filter=stars=1000nginx docker search --filter=is-official=true nginx# 拉取镜像docker pull nginx:alpine docker pull registry.example.com/myapp:latest# 推送镜像docker tag myapp:latest registry.example.com/myapp:latest docker push registry.example.com/myapp:latest# 查看镜像标签curlhttps://registry.hub.docker.com/v2/repositories/library/nginx/tags/
  2. 认证管理

    # 登录仓库docker login docker login registry.example.com docker login -u username -p password registry.example.com# 查看登录信息docker info|grep-A5"Registry"cat~/.docker/config.json# 登出dockerlogoutdockerlogoutregistry.example.com

4.3.5 企业级仓库解决方案

  1. Nexus Repository Manager

    # docker-compose.yml for Nexusversion:'3.8'services: nexus: image: sonatype/nexus3:latest container_name: nexus restart: unless-stopped ports: -"8081:8081"-"5000:5000"volumes: - ./nexus-data:/nexus-data environment: -INSTALL4J_ADD_VM_PARAMS=-Xms2g -Xmx2g -XX:MaxDirectMemorySize=2g
  2. Harbor(企业级 Registry)

    # Harbor 特性- 基于角色的访问控制(RBAC)- LDAP/AD 集成 - 镜像漏洞扫描 - 镜像复制 - Webhook 通知 - 图形化管理界面# 快速部署curl-s https://raw.githubusercontent.com/goharbor/harbor/master/make/harbor.yml -o harbor.yml ./install.sh
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/30 21:08:39

抖音无水印视频下载完整教程:3分钟学会专业级视频保存技巧

想要完美保存抖音上的精彩视频却总是被水印困扰&#xff1f;douyin_downloader抖音无水印下载器正是你需要的解决方案。这款开源工具支持抖音视频无水印下载和批量保存&#xff0c;让你轻松收藏喜爱的短视频内容。无论是个人收藏还是内容创作&#xff0c;都能获得原画质的高清视…

作者头像 李华
网站建设 2026/4/16 14:36:28

线性代数(六)列空间和零空间

前篇文章给出了向量子空间的的定义&#xff0c;本篇来进一步讨论一些形式的向量子空间。取两个子空间P和L&#xff0c;P构成平面&#xff0c;L构成直线&#xff0c;讨论两种情况&#xff1a;1.P和L的并集&#xff0c;能构成子空间吗&#xff1f;显然不能&#xff0c;因为P空间内…

作者头像 李华
网站建设 2026/4/14 17:34:19

云顶之弈智能挂机助手:解放双手的自动化游戏解决方案

云顶之弈智能挂机助手&#xff1a;解放双手的自动化游戏解决方案 【免费下载链接】LOL-Yun-Ding-Zhi-Yi 英雄联盟 云顶之弈 全自动挂机刷经验程序 外挂 脚本 ,下载慢可以到https://gitee.com/stringify/LOL-Yun-Ding-Zhi-Yi 项目地址: https://gitcode.com/gh_mirrors/lo/LOL…

作者头像 李华
网站建设 2026/4/16 14:36:33

Day 39 信贷数据集神经网络训练

文章目录Day 39 信贷数据集神经网络训练一、数据预处理二、构建 DataLoader 与神经网络三、可视化Dropout 模型表现四、小结Day 39 信贷数据集神经网络训练 import pandas as pd import numpy as np import torch import torch.nn as nn import torch.optim as optim import…

作者头像 李华
网站建设 2026/4/16 14:36:25

桌面开发,在线%对联管理%系统,基于vs2022,c#,winform,sql server数据库

经验心得两个crud单子&#xff0c;没啥可聊的&#xff0c;按照不同模块实现对应的业务逻辑就行哦。毕竟只和数据库打交道&#xff0c;桌面和web开发不一样&#xff0c;web后端除了基础crud&#xff0c;咱们还得重点考虑并发问题等其他安全问题&#xff0c;比如多个请求同时执行…

作者头像 李华