Docker容器原理和启动策略

Docker实战-镜像和容器的存储结构 一、镜像、容器和存储驱动的关系    前面也已经讲过说,镜像是程序和文件的集合,容器是镜像的运行实例。    Docker为了节约存储空间共享数据会对镜像和容器进行分层,不同镜像可以共享相同数据,并且在镜像上为容器分配一个RW层来加快容器的启动顺序1. 镜像层和容器层    每个镜像都由多个镜像层组成,从下往上以栈的方式组合在一起形成容器的根文件系统,Docker的存储驱动用于管理这些镜像层,对外提 阅读详情

一、Docker 容器的原理

1. 容器与虚拟机的区别(基础理解)

项目虚拟机(VM)容器(Container)
启动速度慢(分钟级)快(秒级)
资源隔离独立的内核、资源共享宿主机内核,进程级隔离
系统支持各自完整的 OS共用宿主系统内核
镜像体积几百 MB ~ GB通常几十 MB ~ 百 MB

Docker 是一种“轻量级虚拟化”,核心是利用 Linux 的 内核特性 实现进程隔离和资源限制。


2. Docker 容器的核心技术

Docker 容器的原理主要基于以下几个 Linux 特性:

(1)Namespaces(命名空间)—— 隔离性

Docker 使用以下几种 namespace 来实现容器的“独立世界”:

  • pid:进程号隔离
  • net:网络隔离(容器有自己的网络设备)
  • mnt:挂载点(文件系统)隔离
  • ipc:信号量、消息队列隔离
  • uts:主机名和域名隔离
  • user:用户 ID 映射隔离

这样容器就像是一个“独立的小系统”,进程和宿主机之间互不干扰。

(2)Cgroups(控制组)—— 资源限制

Cgroups 控制每个容器使用的 CPU、内存、磁盘 IO、网络带宽 等资源,防止某个容器“吃光资源”。

(3)UnionFS(联合文件系统)—— 镜像构建基础

UnionFS 支持将多个目录合并成一个文件系统,Docker 镜像就是由多个只读层 + 一个可写层组成,节省空间、提高构建效率。

如:

镜像层:
- ubuntu基础镜像(只读)
- 安装nginx(只读)
- 添加配置文件(只读)
容器层:
- 当前运行时的写层(可写)
(4)容器 = 镜像 + 可写层 + 隔离机制

容器启动时会基于镜像,加上一个 容器写层,再加上上述 namespace 和 cgroup 等机制,最终成为一个运行中的独立进程。


3. 容器运行架构

用户命令(docker cli)
      ↓
Docker Daemon(服务端)
      ↓
调用 containerd / runC
      ↓
Linux 内核(通过 namespace + cgroup)
      ↓
生成容器进程(共享内核,但逻辑隔离)
  • Docker CLI 提供命令行接口
  • Docker Daemon 是守护进程,处理容器管理逻辑
  • containerd 是容器运行时接口,负责容器生命周期
  • runC 是实际调用 Linux 系统创建容器的工具(OCI 兼容)

二、Docker 容器的启动策略

Docker 容器的启动策略,指的是 容器在宿主机重启后是否自动重启,这由 --restart 参数控制。

1. 常见的启动策略

docker run --restart=xxx ...
策略含义
no(默认)宿主机重启后,不自动启动容器
always总是自动重启容器(除非人为 stop)
on-failure[:max-retries]容器退出状态码非 0 时自动重启(可以指定最多重启次数)
unless-stopped宿主机重启时启动容器,除非用户手动 stop 过
示例:
# 容器失败时自动重启最多3次
docker run --restart=on-failure:3 nginx

# 永远自动重启(除非手动 stop)
docker run --restart=always nginx

# 宿主机重启时自动启动(除非你手动 docker stop)
docker run --restart=unless-stopped nginx

2. 容器启动流程(详细)

假设你运行了:

docker run -d --name web --restart=always nginx

背后流程是:

  1. Docker Daemon 接收命令
  2. 检查镜像是否存在,若无则拉取
  3. 创建容器的读写层(overlay2)
  4. 分配 namespace、设置 cgroup
  5. 创建网络(默认 bridge 网络)
  6. 启动容器(调用 containerd -> runC)
  7. 宿主机重启时,Docker 会根据 restart 策略自动重启该容器

三、小结(图示)

             ┌─────────────┐
             │ Docker CLI  │
             └────┬────────┘
                  ↓
        ┌──────────────┐
        │ Docker Daemon│
        └────┬────┬────┘
             ↓    ↓
       ┌────────┐ ┌────────────┐
       │runC等工具│ │Containerd │
       └────────┘ └─────┬──────┘
                        ↓
     ┌───────────────────────────────┐
     │ Linux Namespace + Cgroups     │
     │ OverlayFS 文件系统            │
     │ 创建容器进程(隔离但共用内核) │
     └───────────────────────────────┘

Docker基础教程(125)docker容器之后台运行容器:别让你的Docker容器在后台“摸鱼”!深度解剖 -d 参数的魔法与实战 在Docker的奇幻世界里,让容器在后台稳定运行而非霸占你的终端,是每位船长(开发者/运维)的必备技能。本文将以幽默易懂的方式,深度剖析docker run -d背后的“守护进程”魔法,揭秘容器后台运行的奥秘。从基础的-d参数到高级的日志追踪、进程管理,再到编写优雅的Dockerfile,你将全面掌握让容器成为可靠“打工人”的秘诀。文末附赠从Node.js到Redis的完整实战示例,让你的容器从此告别“摸鱼”,安心在后台为你创造价值! 阅读详情

相关推荐

服务器重启后如何自动重启 Docker 容器?

在现代 IT 运维中,容器化技术的普及使得 Docker 成为服务器管理的重要工具之一。然而,在实际生产环境中,服务器因各种原因(如定期维护、意外断电或升级操作系统)重启后,如何让 Docker 容器自动恢复运行成为一个关键问题。本文将详细介绍如何确保 Docker 容器在服务器重启后自动重启,包括相关原理、配置方法以及一些常见的注意事项。

网络技术联盟站 1137

Docker容器的重启策略

容器如果被守护进程重新拉起后,容器的id和名称都是不变的,但是对应在主机上的进程号会变化。运行一个nginx容器,通过 --restart 选项来指定 重启策略。再次使用docker top nginx 查看进程时发现进程号已经改变。多次killnginx进程会发现,RestartCount 会一直累加。容器状态码为127表示,容器启动后。要执行的默认命令不存在。创建容器,并设置容器重启策略为always。执行docker ps 查看容器运行状态。可以发现容器限制状态码127。

qq_50247813的博客 1806

高温环境下RS485通信故障分析与MOS管解决方案

RS485通信作为工业控制领域的基础总线技术,其可靠性直接影响系统稳定性。在高温等恶劣环境下,传统三极管开关电路会因温度特性导致通信故障。通过分析三极管Ube电压随温度变化的特性,揭示了电路失效的物理原理。相比之下,MOS管作为电压控制型器件,具有温度稳定性好、功耗低等优势,更适合工业环境应用。本文通过一个发动机舱内RS485通信故障的实际案例,详细对比了三极管与MOS管在高温环境下的性能差异,并给出了具体的电路改进方案。该案例对工业通信接口设计具有普遍参考价值,特别适用于需要应对高温、振动等挑战性环境的硬

weixin_42612405的博客 406

docker 容器 自启动策略 restart policy

docker run 中设置 在docker run通过 --restart 设置守护机制: no: 不自动重新启动容器(默认) no-failure: 容器发生error而退出(容器退出状态不为0)重启容器 unless-stopped:在容器已经stop掉或Docker stoped/restarted的时候才重启容器 always:如果容器停止,总是重新启动容器。如果手动ki...

追求卓越,做到专业 1万+

SAP公司间外协业务流程以及配置说明

SAP公司间外协业务流程以及配置说明

竹大的博客 7166

用deepseek部署全自动的机器人--bytebot

Bytebot是一款开源AI桌面代理,提供完整的虚拟桌面环境,支持跨应用任务处理、文件管理、文档处理等复杂工作流。其技术架构包含核心控制、LLM代理、UI等组件,支持Docker和Kubernetes部署。本文演示了基于CloudStudio的部署流程,包括环境配置、Docker部署及DeepSeek API集成,实现多模型调用功能。

Kin 2481

go语言之docker容器重启策略

在实际的应用场景中,Docker容器的重启策略可以提高应用的可靠性和稳定性。本文介绍了Docker容器的三种重启策略以及具体的数字选项,还介绍了如何使用命令行和Docker Compose文件设置容器的重启策略。在实际的应用场景中,正确地设置重启策略可以提高应用的可靠性和稳定性,但需要谨慎考虑其对服务器资源的影响。它可以快速地启动、停止和重启容器,但在某些情况下容器的重启策略对应用的稳定性和可靠性有着重要的影响。在启动容器时,可以使用--restart选项设置容器的重启策略。(免费订阅,永久学习)

SMILY12138的博客 1071

史上最详细的sqlmap使用教程

sqlmapsqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL进行SQL注入。目前支持的数据库有MySql、Oracle、Access、PostageSQL、SQL Server、IBM DB2、SQLite、Firebird、Sybase和SAP MaxDB等Sqlmap采用了以下5种独特的SQL注入技术基于布尔类型的盲注,即可以根据返回页面判断条件真假的注入。

大河之犬的博客 5万+

Docker 快速更改容器的重启策略(Restart Policies)以及重启策略详解

Docker 快速更改容器的重启策略(Restart Policies)以及重启策略详解。

一只奋斗的猪 7668

【TC3xx芯片】TC3xx DMA模块详解

TC3xx DMA模块详解

qq_36056498的博客 5917

基于FPGA的时间数字转换(TDC)设计(一:原理)

基于FPGA的时间数字转换(TDC)设计,此为第一篇

sdau2005的博客 5069

docker开机自启动,并设置容器自动重启

如果创建时未指定 --restart=always,可通过update 命令设置。标志来设置重启策略。Docker提供了几种重启策略,例如。当你运行容器时,可以使用。(1)创建容器时设置。(2)修改已有容器,使用update。1、设置docker开机启动。2、启动docker。3、设置容器自动重启。

weixin_42593038的博客 6499

构建AI招聘助手:提高人才筛选与匹配效率

人工成本高:传统招聘过程涉及大量的简历筛选和面试安排,需要耗费大量的人力和时间。匹配效率低:简历筛选过程中,人为因素可能导致信息遗漏或误判,影响匹配效果。招聘周期长:从职位发布到最终录用,传统招聘流程往往耗时较长,影响企业业务发展。机器学习(Machine Learning)是一门让计算机通过数据和经验来学习并改进性能的学科。自然语言处理(Natural Language Processing,NLP)是计算机科学领域与人工智能领域中的一个重要方向,旨在让计算机能够理解和解释人类语言。

AI天才研究院 1304

docker容器为啥会开机自启动

Docker容器可以配置为在主机系统启动时自动启动,这对于确保关键应用在服务器重启后自动恢复非常重要。开机自启动功能的实现主要依赖于容器启动时指定的重启策略。以下是关于Docker容器开机自启动的详细解析。

我的乌托 511

AutoSAR配置与实践(实践篇)13.1 如何添加一个NVM BLOCK

解决办法:如下红框选项都不要自定义,否则无法自动生成对应RAM/ROM映射接口函数。传送门–AUTOSAR配置与实践—总目录传送门–AUTOSAR配置与实践—总目录。

nihaoljq2010的博客 3036

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

docker运行容器时遇到的一个iptables的报错

这个报错Error response from daemon提示是daemon给了一个错误的响应daemon是这个为何能给response,因为dockerd是个RESTful的API server报错提到了iptables,这是关键线索。

Mantou023的博客 1207

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Docker4WordPress多容器协作原理:理解Traefik反向代理与容器网络

Docker4WordPress是一个基于Docker的WordPress本地开发环境栈,它通过巧妙的**多容器协作架构**实现了高效的服务管理和网络通信。本文将深入解析Docker4WordPress的**Traefik反向代理机制**和**容器网络通信原理**,帮助您全面理解这个现代化WordPress开发环境的内部工作机制。🚀 ## Docker4WordPress多容器架构概览 Do

gitblog_00970的博客 739

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Docker官方用户指南(中文)——关于Docker镜像、Docker容器和Docker存储驱动

关于 images、containers、storage drivers 英语原文:(https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/#data-volumes-and-the-stor...

chentuanwei9881的博客 368

Python学习之初识Docker容器

目录 一、Docker容器学习目标: 二、Docker简介 1 .什么是虚拟化 2 .什么是Docker 3.为什么选择Docker? 4 .Docker组件 4.1 Docker服务器与客户端 4.2 Docker镜像与容器 4.3 Registry(注册中心) 三、 Docker的安装与启动 1 .安装Docker 2.设置ustc的镜像 3. Docker的启动与停止 四、常用命令 1.镜像相关命令 1.1 查看镜像 1.2 搜索镜像 1.3 拉取镜像 1.4 删

daidadeguaiguai的博客 570

Docker 在容器中存储数据 - 关于存储驱动程序

原文地址 了解 Docker 如何构建和存储镜像以及容器如何使用这些镜像对高效使用存储驱动程序来说很重要。可以使用这些信息在选择持久化应用程序数据的最佳方式做出明智的选择,并避免出现性能问题。 注意:存储驱动程序允许你将数据保存在容器的可写层中。这是持久化数据的效率最低的方式。卷或绑定挂载提供更好的读写性能,卷提供比存储驱动程序或绑定挂载更高的安全性和隔离性。卷或绑定挂载都不适合本主题中...

kikajack的博客 4675

揭秘Docker容器假死之谜:健康检查超时的7种真实场景与应对策略

解决Docker容器假死难题,深入剖析Docker Compose健康检查超时的7种真实场景与应对策略。涵盖网络延迟、应用启动慢等典型问题,提供精准配置优化与故障排查方法,提升服务稳定性,值得收藏。

SimSolve的博客 919

【docker知识】联合文件系统(unionFS)原理

Docker CLI 操作起来比较简单——您只需掌握Create、Run、InspPull和Push容器和图像,但是谁想过Docker 背后的内部机制是如何工作的?在这个简单的表象背后隐藏着许多很酷的技术, UnionFS(统一文件系统)就是其中之一。

gongdiwudu的专栏 6866

一键启动所有容器,你真的会用docker-compose up -d吗?

掌握Docker Compose启动所有服务up -d技巧,轻松实现多容器一键部署。适用于微服务开发、本地环境搭建等场景,省时高效。了解常用参数与最佳实践,避免常见错误,提升运维效率。值得收藏

ProceSeed的博客 944

优化 docker 容器性能慢问题

D:\mydata\tomcat\webapps:/usr/local/tomcat/webapps # 指定对应的数据卷。我这边使用的是文件挂载。部署环境下tomcat容器启动缓慢,耗时10多分钟,性能较差,同时后端服务响应较慢。结果中看了一看出cpu、内存使用情况都不高,但是system:中in、CS 较高。考虑war解压不会占用过多的磁盘空间,直接不使用挂载,将jar包部署到容器内。性能是直线飙升,原先部署时间要10多分钟,现在2分钟内搞定。对比结果CPU、内存使用率都不高。

li371490890的博客 5818

docker读书笔记002

docker

zhu2525wei的博客 223

Docker compose多容器管理(nginx+haproxy实现负载均衡)

Docker Compose 将所管理的容器分为三层,工程(project),服务(service)以及容器(contaienr) Docker Compose 运行的目录下的所有文件(docker-compose.yml, extends 文件或环境变量文件等)组成一个工程 若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖 一个服务当中可包...

Rapig1的博客 783
上一篇: Go语言中的Options模式
下一篇: 数据库索引详解:原理、设计原则与应用场景
Cxzzzzzzzzzz
博客等级 码龄4年 229粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值