Docker容器配置进阶

一、容器的自动重启

  • Docker提供重启策略选项控制容器退出时或Docker重启时是否自动启动该容器。
  • 重启策略能够确保关联的多个容器按照正确的顺序启动
  • Docker建议使用重启策略,并避免使用进程管理器启动容器。运行容器时可以使用--restart选项指定重启策略。
  • 容器的重启都是由Docker守护进程完成的因此与守护进程息息相关。

注意点

  • 重启策略只在容器成功启动后才会生效。(至少运行 10s 以上且 Docker守护进程已开始监控它,可以防止=从未启动的容器进入重启循环)
  • 如果手动停止一个容器,那么它的重启策略会被忽略,直到Docker 守护进程重启或容器手动重启。(防止重启循环)
  • 这所讲的重启策略只适用于容器。Docker Swarm服务的重启策略采用不同的配置方式
  • 重启策略不同于dockerd命令的--live-restore 选项(--live-restore选项使得在Docker升级过程中,即使网络和用户输入都中断了,容器仍然可以保持运行)

如果重启策略无法满足需求,如当 Docker 外部的进程依赖容器时,那么可以改用像upstart、systemd或supervisor这样的进程管理器来解决。要注意,不要尝试组合使用Docker重启策略与主机级进程管理器,因为这会产生冲突。

二、在Docker停止时保持容器继续运行

当 Docker 守护进程终止时,正在运行的容器会关闭(默认)。管理员配置 Docker 守护进程,使容器在Docker守护进程不可用时仍然保持运行,这个功能被称为实时恢复(Live Restore )

使用此功能有助于减少因Docker守护进程崩溃、计划停机或升级导致的容器停机时间。(运行Windows操作系统的容器不支持此功能)但对于Docker for Windows运行的Linux容器,该功能则是可用的。

实时恢复功能仅适用于独立容器,不适用于Swarm服务。Swarm服务由Swarm管理器管理。如果Swarm 管理器不可用,则Swarm服务将继续在工作节点上运行,但无法管理,直到有足够多的可用Swarm管理器,即能够保持法定的数量为止。

2.1、启用实时恢复功能

方法一、在Docker守护进程配置文件(在Linux系统上默认是/etc/docker/daemon.json)中进行设置,加入以下选项。

 {  

        "live-restore":true  

}

重启Docker守护进程。

 systemctl reload docker
 或者
 kill -SIGHUP dockerd

方法二、在手动启动dockerd 进程时指定--live-restore选项。(不建议)

2.2、升级期间的实时恢复

实时恢复功能支持Docker守护进程在升级期间保持容器的运行(仅限补丁版本升级,不支持主要或次要版本升级)。

2.3、重启时的实时恢复

只有 Docker 守护进程选项(如网桥IP地址和图形驱动程序)未发生更改时,实时恢复功能才可以用于恢复容器。

如果这些守护进程的配置选项中有任意一个已更改,则实时恢复可能不起作用,管理员可能需要手动停止容器。

2.4、实时恢复功能对运行容器的影响

若Docker守护进程长时间停止,则运行中的容器可能会填满FIFO日志(守护程序所读取的)并阻止记录更多日志。(必须重启Docker刷新)

管理员可以通过更改/proc/sys/fs/pipe-max-size来修改内核的缓冲区大小。注意,不能修改 Docker Desktop for Mac 或 Docker Desktop for Windows 的缓冲区大小。

三、一个容器中运行多个服务

--init 选项可以将一个精简的初始化进程作为主进程插入容器,并在容器退出时回收所有进程。

解决这些进程启停最好的方式是设置一个上层的进程来统一处理这些进程的生命周期。比较稳定的初始化进程有sysvinit、upstart、systemd。

实现一个容器中运行多个服务方法:

  • 将所有命令放入包装器脚本中,并提供测试和调试信息,使用CMD指令运行包装器脚本。
  • 如果有一个主进程需要首先启动并保持运行,但是临时需要运行一些其他进程(可能与主进程交互),可以使用bash脚本的作业控制实现。
  • 在容器中使用supervisord等进程管理器。

四、容器健康检查机制

4.1、在Dockerfile中使用HEALTHCHECK指令

在Dockerfile 文件中使用HEALTHCHECK指令声明健康检测配置,用于判断容器主进程的服务状态是否正常,反映容器的实际健康状态。

 HEALTHCHECK 选项 CMD<命令>
 或
 HEALTHCHECK NONE

第1种格式表示设置检查容器健康状况的命令;第2种格式表示禁止从基础镜像继承HEALTHCHECK指令设置。

--interval:设置容器运行之后开始健康检查的时间间隔,默认为30S。--timeout:设置允许健康检查命令运行的最长时间,默认为30s。超时则失败。 --start-period:设置需要启动的容器的初始化时间,在启动过程中的健康检查失败不会被计入,默认为0s。--retries:设置允许连续重试的次数,默认为3次。当健康检查连续失败指定的次数后,则将容器状态视为不健康状态。

返回值:

  • 0:成功。容器是健康且可用的。
  • 1:失败。容器不健康,不能正常工作。
  • 2:保留值。暂时不要使用。

在Dockerfile 中HEALTHCHECK指令只可以出现一次,如果出现多次,则只有最后一次生效。

# 每5min执行一次健康检查,通过访问Web服务器主页进行检查,每次检查限制在3s以内
 HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1

4.2、启动容器时通过相应选项实现健康检查

可以通过执行docker run命令时启动容器,或者执行docker create命令创建容器时通过相应选项指定容器的健康检查策略,其中--health-cmd选项用于指定健康检查命令,对应于Dockerfile中HEALTHCHECK指令的命令参数;---health-interval--health-retries--health-timeout--health-start-period分别对应 --interval--retries--timeout--start-period选项。 --no-healthcheck选项用于禁用容器的任何HEALTHCHECK指令。

五、运行时选项覆盖Dockerfile 指令

5.1、CMD(默认的命令或选项)

在命令行中重新调用可选的命令

 docker run [选项] 镜像[:标签|@摘要值][命令] [参数···]

5.2、ENTRYPOINT(运行时执行的默认命令)

使用 docker run命令的--entrypoint 运行时选项设置会覆盖定义镜像的 Dockerfile 中的ENTRYPOINT指令设置。

镜像的ENTRYPOINT指令定义容器启动时要执行的命令,在启动容器时不容易被覆盖。

ENTRYPOINT 指令为容器给出默认的行为,基于设置该指令的镜像可以直接运行容器

示例:

 # 在已设置为自动运行其他命令(如/usr/bin/redis-server)的容器中再运行一个shell命令
 docker run -it --entrypoint /bin/usr/bash example/redis
 # 将更多的参数传递给ENTRYPOINT指令
 docker run -it --entrypoint /bin/bash example/redis -c ls -l
 docker run -it --entrypoint /usr/bin/redis-cli example/redis --help

还可以通过传递一个空字符串重置容器的入口命令

 docker run -it --entrypoint="" mysql bash

运行时使用--entrypoint选项将清除镜像的任何默认命令(Dockerfile的任何CMD指令)。

5.3、EXPOSE(传入端口)

  • --expose=[]:对外暴露容器的一个端口或一个端口范围。
  • -P:将所有端口发布到主机接口
  • -p=[]:将容器的一个端口或一个端口范围发布到主机,使用docker port命令可以查看实际的端口映射。
  • --link="":增加到其他容器的连接

除了EXPOSE指令,镜像开发人员无法控制网络连接。

5.4、ENV(环境变量)

创建Linux容器时,Docker自动设置以下环境变量:

  • HOME(用户主目录):根据USER值设置
  • HOSTNAME(主机名):默认为容器名
  • PART(执行文件的默认路径)
  • TERM(终端):如果容器被分配了伪TTY,则为xterm。

5.5、HEALTHCHECK

5.6、VOLUME(共享的文件系统)

定义一个或多个与镜像关联的卷

5.7、USER

--user=[用户名 | 用户名:组名 | UID | UID:GID | 用户名:GID | UID:组名]

5.8、WORKDIR

该指令可以自定义工作目录。

六、示例

6.1、配置容器使用重启策略

容器默认是不支持自动重启的。要为容器配置重启策略,可以在执行docker run 或docker create命令启动或创建容器时使用--restart选项。

选项值功能
no容器退出时不要自动重启。这是默认设置
on-failure[:max-retrues]只在容器以非0状态码退出时重启。这种策略还可以使用max-retries参数指定 Docker守护进程尝试重启容器的次数
always不管是什么退出状态都始终重启容器,Docker守护进程将无限次地重启容器。容器也会在Docker守护进程启动时尝试重启,不管容器当时的状态如何
unless-stopped不管是什么退出状态都始终重启容器,只是当Docker 守护进程启动时,如果容器之前已经为停止状态,则不会尝试启动它

容器的退出状态可用状态码表示。

  • 0:表示正常退出
  • 125:Docker守护进程本身的错误。
  • 126:容器启动后,要执行的默认命令无法调用。
  • 127:容器启动后,要执行的默认命令不存在。
  • 其他:容器启动后正常执行命令,退出命令时该命令的返回状态码作为容器的退出状态码。

运行一个始终重启的contos容器,该容器退出时Docker将重启它

[root@docker ~]# docker run -d --name c1 --restart=always centos
4fb2f8dba09e9aea194f375a494a41a594efdccd640d42334b208ba131d2306b

当容器启用重启策略时,在docker ps命令的输出结果中会显示UpRestaring状态

[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS                        PORTS     NAMES
4fb2f8dba09e   centos    "/bin/bash"   11 seconds ago   Restarting (0) 1 second ago             c1

测试该容器是否自动重启,先停止Docker并查看当前是否有容器正在运行

[root@docker ~]# systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
  docker.socket
[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS                                  PORTS     NAMES
97fbf80d63c0   centos    "/bin/bash"   2 minutes ago   Restarting (0) Less than a second ago             c1

此时没有任何容器正在运行。再启动Docker并查看当前是否有容器正在运行

[root@docker ~]# systemctl start docker
[root@docker ~]# docker ps
CONTAINER ID   images   ...     STATUS                          PORTS     NAMES
97fbf80d63c0   centos   ...   Restarting (0) 23 seconds ago             c1

发现该容器随着Docker启动而启动

可以使用on-failure策略指定Docker尝试重启容器的最大次数,此命令将允许一个失败后重启、最大重启次数为10的redis容器。

docker run --restart=on-failure:10 centos

对于已经创建或运行的容器,可以通过docker update命令来更改其重启策略

docker update --restart=on-failure:3 97fbf80d63c0

6.2、测试Docker的实时恢复功能

通过重新加载Docker守护进程和结束Docker守护进程来测试实时恢复功能

编辑Docker守护进程配置文件/etc/docker/daemon.json,启用实时恢复功能

[root@docker ~]# vi /etc/docker/daemon.json
[root@docker ~]# cat /etc/docker/daemon.json 
{
	"registry-mirrors":["https://unx7713y.mirror.aliyuncs.com"],
	"insecure-registries":["10.0.0.2:5000"],
	"live-restore":true
}

重启Docker守护进程

[root@docker ~]# systemctl restart docker

基于httpd镜像创建一个运行Apache服务的容器

[root@docker ~]# docker run --rm -d -p 8080:80 httpd
f920707010871208ff9aba4e3ae1513b2ef92021320bf2539d766056bdf6fb16

重新加载Docker守护进程

[root@docker ~]# systemctl reload docker

查看该容器,可以发现该容器并没有停止,依然在运行

[root@docker ~]# docker ps
CONTAINER ID   IMAGE     ...  STATUS               PORTS              NAMES
f92070701087   httpd     ...  Up About a minute    0.0.0.0:8080->80/tcp, :::8080->80/tcp   stupefied_antonelli

使用kill命令结束进程需要获取进程号,以下操作获取dockerd的进程号

[root@docker ~]# ps -e | grep dockerd
   9530 ?        00:00:02 dockerd

向dockerd进程发送SIGHUP信号

[root@docker ~]# kill -SIGHUP 9530

再次查看该容器,发现该容器正在运行

访问该容器提供的Apache服务,结果正常

[root@docker ~]# curl 127.0.0.1:8080
<html><body><h1>It works!</h1></body></html>

实验完毕,停止该容器后自动被删除,恢复实验环境

6.3、测试容器健康检查功能

为便于快速启动镜像以检测初始状态,先下载busybox镜像

[root@docker ~]# docker pull busybox

一次执行以下两条命令

# 基于busybox镜像创建名为test-health的容器,并为该容器设置健康检查选项,检查时间间隔为20s,失败则重试1次,检查命令"stat/etc/passwd||exit 1“的含义是执行shell命令,输出/etc/passwd文件的详细信,如果找不到该文件则退出当前shell并返回状态码1。该容器启动后执行shell命令sleep 1的,休眠1天
docker run --rm --name test-health -d --health-cmd 'stat /etc/passwd || exit 1' --health-interval 20s --health-retries 1 busybox sleep 1d

# 获取该容器的健康状态信息,结果表明容器启动后的健康状态位Staring
docker inspect --format '{{.State.Health.Status}}' test-health

一次执行以下命令:

# 第一条命令延迟20秒,超过健康检查时间间隔,让Docker为该容器执行健康检查命令。
sleep 20s
docker inspect --format '{{.State.Health.Status}}' test-health
# 第二指令查看该容器的健康状态

执行以下命令查看该容器的当前信息,发现其处于不健康状态

[root@docker ~]# docker ps
CONTAINER ID   IMAGE     COMMAND      CREATED         STATUS                     PORTS     NAMES
a1fe7d7b3e59   busybox   "sleep 1d"   5 minutes ago   Up 5 minutes (unhealthy)             test-health

停止运行该容器,该容器会被自动删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/586539.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VScode 无法连接云服务器

试了很多方法&#xff0c;比如更换VScode版本&#xff0c;卸载重装&#xff0c;删除配置文件 重启电脑&#xff0c;都无法成功。最后重置电脑后才连接上&#xff0c;但是重启服务器后又出现该问题。 方法一&#xff1a;修改环境 方法二&#xff1a;把vscode卸载干净重下

【快速入门】数据库的增删改查与结构讲解

文章的操作都是基于小皮php study的MySQL5.7.26进行演示 what 数据库是能长期存储在计算机内&#xff0c;有组织的&#xff0c;可共享的大量数据的集合。数据库中的数据按照一定的数据模型存储&#xff0c;具有较小的冗余性&#xff0c;较高的独立性和易扩展性&#xff0c;并为…

LabVIEW智能变电站监控系统设计与实现

LabVIEW智能变电站监控系统设计与实现 随着电力系统和智能化技术的快速发展&#xff0c;建立一个高效、可靠的变电站监控系统显得尤为重要。通过分析变电站监控系统的需求&#xff0c;设计了一个基于LabVIEW软件的监控平台。该平台利用虚拟仪器技术、传感器技术和无线传输技术…

数据结构中的栈(C语言版)

一.栈的概念 栈是一种常见的数据结构&#xff0c;它遵循后进先出的原则。栈可以看作是一种容器&#xff0c;其中的元素按照一种特定的顺序进行插入和删除操作。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/入栈&#xff0c;入数据在栈顶。 出栈&#xff1a;栈的删除操作叫做…

2024年的十大技术趋势 - AI 等等

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

网优小工具-基站ID行列转换

网优小工具&#xff0d;基站ID行列转换 因在日常工作需要对基站ID批量行转列&#xff0c;以方便在网管上批量筛选指定网元&#xff0c;该小工具基于微软Power Query插件编写&#xff0c;工具方便、简洁、易用&#xff0c;共享出来以方便工作。 工作界面 &#xff11;.粘贴需筛…

学习VUE2第6天

一.请求拦截器 可以节流&#xff0c;防止多次点击请求 toast是单例 二.前置路由守卫 在Vue.js中&#xff0c;前置路由守卫是指在路由转换实际发生之前执行的钩子函数。这是Vue Router&#xff08;Vue.js官方的路由管理器&#xff09;提供的一种功能&#xff0c;允许开发者在用…

中兴UME网管LTE共享参数配置-PLMN添加

本文为中兴设备UME网管电联中频共享参数配置&#xff0c;PLMN添加参数配置部分&#xff0c;因UME与U&#xff13;&#xff11;网管添加PLMN配置区别较大&#xff0c;UME网管需同时配置运营商EN&#xff0d;DC策略&#xff0c;相关配置流程及参数配置如下文。 PLMN eNodeB CU …

与 Apollo 共创生态:观看7周年大会的心路历程

前言 在科技飞速发展的今天&#xff0c;自动驾驶技术已然成为行业创新的热点之一。作为一名长期关注自动驾驶领域的技术人员&#xff0c;我有幸见证了Apollo平台的成长与壮大。七年前&#xff0c;Apollo的诞生为我们带来了无尽的想象与期待&#xff1b;七年后的今天&#xff0…

【自研网关系列】过滤器链 -- 灰度发布过滤器

&#x1f308;Yu-Gateway&#xff1a;&#xff1a;基于 Netty 构建的自研 API 网关&#xff0c;采用 Java 原生实现&#xff0c;整合 Nacos 作为注册配置中心。其设计目标是为微服务架构提供高性能、可扩展的统一入口和基础设施&#xff0c;承载请求路由、安全控制、流量治理等…

【介绍下Unity编辑器扩展】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

ubuntu下安装配置python3.11

方案1 添加仓库&#xff1a; $ sudo add-apt-repository ppa:deadsnakes/ppa $ sudo apt update $ sudo apt install python3.11然后查看有多少个python版本已经安装了&#xff1a; ls -l /usr/bin/python*python2.7,python 3.8 ,python 3.11. 然后&#xff0c;设置系统默认…

Android4.4真机移植过程笔记(一)

1、RK源码编译 获取内核源码&#xff1a; git clone git172.28.1.172:rk3188_kernel -b xtc_ok1000 内核编译环境&#xff1a; 从172.28.1.132编译服务器的/data1/ZouZhiPing目录下拷贝toolchain.tar.gz&#xff08;交叉编译工具链&#xff09;并解压到与rk3188_kernel同级目…

Visual Studio中怎样更改Nuget程序包源

场景 Visual Studio 2019 在使用NuGet添加依赖包时&#xff0c;在预览中搜索不到程序包。 排查下NuGet的程序包源为本地。 将程序包源修改下。 实现 在解决方案上右击选择管理解决方案中的NuGet程序包(在 Visual Studio 中打开“工具”>“选项”>“NuGet 包管理器”…

【配置】Docker搭建JSON在线解析网站

云服务器打开端口8787 连接上docker运行 docker run -id --name jsonhero -p 8787:8787 -e SESSION_SECRETabc123 henryclw/jsonhero-webhttp://ip:8787访问 Github&#xff1a;地址

考研数学|《880题》不会做,怎么办?

如果880大部分都不会做&#xff0c;说明基础掌握太差&#xff0c;如果已经到了10月底&#xff0c;我建议直接刷知能行吧。因为我一个同学经历和你类似&#xff0c;最后通过一个月高强度刷知能行算是补救了一些。 对于刚开始准备考研的同学和上面的题主&#xff0c;我想聊几句建…

PCIe协议之RCB、MPS、MRRS详解

✨前言&#xff1a; PCIe总线的存储器写请求、存储器读完成等TLP中含有数据负载&#xff0c;即Data Payload。Data Payload的长度和MPS&#xff08;Max Payload Size&#xff09;、MRRS&#xff08;Max Read Request Size&#xff09;和RCB&#xff08;Read Completion Bounda…

物联网实战--平台篇之(二)基础搭建

目录 一、Qt工程创建 二、数据库知识 三、通信协议 四、名词定义 本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、Qt工程…

请编写函数fun,该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放在主函数的age数组中;

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

考研管理类联考(专业代码199)数学基础【2】整式与分式

一、整式及其运算 1.常用乘法公式&#xff08;逆运算就是因式分解&#xff09; 公式扩展① 公式扩展② 公式扩展③ 2.整式除法定理 若整式 F(x) 除以x-a的余式为r(x)&#xff0c;则 F(x) (x -a) g(x) r(x) &#xff0c;故r(a)F(a)成立 二、指数和对数的运算性质 1.指数运算…
最新文章