如何更改 Docker 堆栈重启行为?
How to change Docker stack restarting behaviour?
在我们的项目中,我们继承了 Docker 环境,其中包含一些服务堆栈。
我注意到 Docker 一旦遇到内存限制就会重新启动堆栈。
很遗憾,我在 Docker 的网站上没有找到任何符合我问题的信息,所以我在这里问:
- 这种行为可以配置吗?例如,我不希望 Docker
在任何情况下重新启动我的堆栈。如果是可配置的,
那怎么办
- 是否有任何 docker 日志来保留任何堆栈重新启动时的条目?
由于您没有向 post 添加任何配置片段或运行时命令,我将不得不根据您的实际问题做出假设。
我的假设:
- 您 运行 多个服务使用 docker-compose
- 这些服务配置了内存限制(在 docker-compose.yml 文件中)
- 您看到它们在达到配置的内存限制后重新启动,并且您想阻止它们重新启动
我假设您的 docker-compose.yml 如下所示:
version: '2.1'
services:
service1:
image: some/image
restart: always
mem_limit: 512m
service2:
image: another/image
restart: always
mem_limit: 512m
使用此配置,任何服务容器在尝试使用超过 512Mb 的内存时都会被内核 OOM 杀死。 Docker 然后会自动重启一个新容器来替换被杀死的容器。
所以回答你的第一个问题:是的,只需将 "restart" 更改为 "no",或者简单地删除此行(因为 "no" 是此参数的默认值).至于你的第二点,只需在 docker 守护程序日志中查找服务重启即可。
然而,如果您需要的是保持服务正常运行,这对您没有帮助:您的服务仍会尝试使用超过其允许的内存限制,它仍会被终止,...并且不再自动重启。
最好查看您的服务的内存使用模式,并了解为什么他们试图使用超过配置限制的内存。最终,解决方案要么将您的服务配置为使用更少的内存,要么在 docker-compose.yml.
中提高 mem_limit
例如:
- 对于数据库服务,配置内存选项以强制引擎使用的 RAM 不超过 mem_limit(Oracle 下的 SGA 和 PGA,MySQL/MariaDB 的各种缓冲区和高速缓存大小,.. .)
- 对于 java 应用程序,将 Xmx 配置得比 mem_limit 足够小(记住非堆内存的需求),或者最好使用最近的 JDK (最新的 8 或 9+)选择
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
.
希望对您有所帮助;更准确地说,我真的需要更多的上下文。
- Is this behaviour configurable? For instance, I don't want Docker to restart my stack under any circumstances. If it is configurable, then how?
对于版本 3 堆栈,重新启动策略已移至部署部分:
version: '3'
services:
crash:
image: busybox
command: sleep 10
deploy:
restart_policy:
condition: none
# max_attempts: 2
有关此的文档可在以下位置找到:https://docs.docker.com/compose/compose-file/#restart_policy
- Is there any docker journal to keep any stack restarts as it's entries?
根据任务历史记录限制(可配置 docker swarm update
,您可以查看服务之前的 运行 个任务:
$ docker service ps restart_crash
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
30okge1sjfno restart_crash.1 busybox:latest bmitch-asusr556l Shutdown Complete 4 minutes ago
papxoq1vve1a \_ restart_crash.1 busybox:latest bmitch-asusr556l Shutdown Complete 4 minutes ago
1hji2oko51sk \_ restart_crash.1 busybox:latest bmitch-asusr556l Shutdown Complete 5 minutes ago
并且您可以检查任何一项任务的状态:
$ docker inspect 30okge1sjfno --format '{{json .Status}}' | jq .
{
"Timestamp": "2018-11-06T19:55:02.208633174Z",
"State": "complete",
"Message": "finished",
"ContainerStatus": {
"ContainerID": "8e9310bde9acc757f94a56a32c37a08efeed8a040ce98d84c851d4eef0afc545",
"PID": 0,
"ExitCode": 0
},
"PortStatus": {}
}
docker引擎中还有一个事件历史可以查询:
$ docker events --filter label=com.docker.swarm.service.name=restart_crash --filter event=die --since 15m --until 0s
2018-11-06T14:54:09.417465313-05:00 container die f17d945b249a04e716155bcc6d7db490e58e5be00973b0470b05629ce2cca461 (com.docker.stack.namespace=restart, com.docker.swarm.node.id=q44zx0s2lvu1fdduk800e5ini, com.docker.swarm.service.id=uqirm6a8dix8c2n50thmpzj06, com.docker.swarm.service.name=restart_crash, com.docker.swarm.task=, com.docker.swarm.task.id=1hji2oko51skhv8fv1nw71gb8, com.docker.swarm.task.name=restart_crash.1.1hji2oko51skhv8fv1nw71gb8, exitCode=0, image=busybox:latest@sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812, name=restart_crash.1.1hji2oko51skhv8fv1nw71gb8)
2018-11-06T14:54:32.391165964-05:00 container die d6f98b8aaa171ca8a2ddaf31cce7a1e6f1436ba14696ea3842177b2e5e525f13 (com.docker.stack.namespace=restart, com.docker.swarm.node.id=q44zx0s2lvu1fdduk800e5ini, com.docker.swarm.service.id=uqirm6a8dix8c2n50thmpzj06, com.docker.swarm.service.name=restart_crash, com.docker.swarm.task=, com.docker.swarm.task.id=papxoq1vve1adriw6e9xqdaad, com.docker.swarm.task.name=restart_crash.1.papxoq1vve1adriw6e9xqdaad, exitCode=0, image=busybox:latest@sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812, name=restart_crash.1.papxoq1vve1adriw6e9xqdaad)
2018-11-06T14:55:00.126450155-05:00 container die 8e9310bde9acc757f94a56a32c37a08efeed8a040ce98d84c851d4eef0afc545 (com.docker.stack.namespace=restart, com.docker.swarm.node.id=q44zx0s2lvu1fdduk800e5ini, com.docker.swarm.service.id=uqirm6a8dix8c2n50thmpzj06, com.docker.swarm.service.name=restart_crash, com.docker.swarm.task=, com.docker.swarm.task.id=30okge1sjfnoicd0lo2g1y0o7, com.docker.swarm.task.name=restart_crash.1.30okge1sjfnoicd0lo2g1y0o7, exitCode=0, image=busybox:latest@sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812, name=restart_crash.1.30okge1sjfnoicd0lo2g1y0o7)
在以下位置查看有关事件命令的更多详细信息:https://docs.docker.com/engine/reference/commandline/events/
大型组织的最佳做法是将容器日志发送到中央位置(例如 Elastic)并在外部监控指标(例如 Prometheus/Grafana)。
在我们的项目中,我们继承了 Docker 环境,其中包含一些服务堆栈。
我注意到 Docker 一旦遇到内存限制就会重新启动堆栈。
很遗憾,我在 Docker 的网站上没有找到任何符合我问题的信息,所以我在这里问:
- 这种行为可以配置吗?例如,我不希望 Docker 在任何情况下重新启动我的堆栈。如果是可配置的, 那怎么办
- 是否有任何 docker 日志来保留任何堆栈重新启动时的条目?
由于您没有向 post 添加任何配置片段或运行时命令,我将不得不根据您的实际问题做出假设。
我的假设:
- 您 运行 多个服务使用 docker-compose
- 这些服务配置了内存限制(在 docker-compose.yml 文件中)
- 您看到它们在达到配置的内存限制后重新启动,并且您想阻止它们重新启动
我假设您的 docker-compose.yml 如下所示:
version: '2.1'
services:
service1:
image: some/image
restart: always
mem_limit: 512m
service2:
image: another/image
restart: always
mem_limit: 512m
使用此配置,任何服务容器在尝试使用超过 512Mb 的内存时都会被内核 OOM 杀死。 Docker 然后会自动重启一个新容器来替换被杀死的容器。
所以回答你的第一个问题:是的,只需将 "restart" 更改为 "no",或者简单地删除此行(因为 "no" 是此参数的默认值).至于你的第二点,只需在 docker 守护程序日志中查找服务重启即可。
然而,如果您需要的是保持服务正常运行,这对您没有帮助:您的服务仍会尝试使用超过其允许的内存限制,它仍会被终止,...并且不再自动重启。
最好查看您的服务的内存使用模式,并了解为什么他们试图使用超过配置限制的内存。最终,解决方案要么将您的服务配置为使用更少的内存,要么在 docker-compose.yml.
中提高mem_limit
例如:
- 对于数据库服务,配置内存选项以强制引擎使用的 RAM 不超过 mem_limit(Oracle 下的 SGA 和 PGA,MySQL/MariaDB 的各种缓冲区和高速缓存大小,.. .)
- 对于 java 应用程序,将 Xmx 配置得比 mem_limit 足够小(记住非堆内存的需求),或者最好使用最近的 JDK (最新的 8 或 9+)选择
-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap
.
希望对您有所帮助;更准确地说,我真的需要更多的上下文。
- Is this behaviour configurable? For instance, I don't want Docker to restart my stack under any circumstances. If it is configurable, then how?
对于版本 3 堆栈,重新启动策略已移至部署部分:
version: '3'
services:
crash:
image: busybox
command: sleep 10
deploy:
restart_policy:
condition: none
# max_attempts: 2
有关此的文档可在以下位置找到:https://docs.docker.com/compose/compose-file/#restart_policy
- Is there any docker journal to keep any stack restarts as it's entries?
根据任务历史记录限制(可配置 docker swarm update
,您可以查看服务之前的 运行 个任务:
$ docker service ps restart_crash
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
30okge1sjfno restart_crash.1 busybox:latest bmitch-asusr556l Shutdown Complete 4 minutes ago
papxoq1vve1a \_ restart_crash.1 busybox:latest bmitch-asusr556l Shutdown Complete 4 minutes ago
1hji2oko51sk \_ restart_crash.1 busybox:latest bmitch-asusr556l Shutdown Complete 5 minutes ago
并且您可以检查任何一项任务的状态:
$ docker inspect 30okge1sjfno --format '{{json .Status}}' | jq .
{
"Timestamp": "2018-11-06T19:55:02.208633174Z",
"State": "complete",
"Message": "finished",
"ContainerStatus": {
"ContainerID": "8e9310bde9acc757f94a56a32c37a08efeed8a040ce98d84c851d4eef0afc545",
"PID": 0,
"ExitCode": 0
},
"PortStatus": {}
}
docker引擎中还有一个事件历史可以查询:
$ docker events --filter label=com.docker.swarm.service.name=restart_crash --filter event=die --since 15m --until 0s
2018-11-06T14:54:09.417465313-05:00 container die f17d945b249a04e716155bcc6d7db490e58e5be00973b0470b05629ce2cca461 (com.docker.stack.namespace=restart, com.docker.swarm.node.id=q44zx0s2lvu1fdduk800e5ini, com.docker.swarm.service.id=uqirm6a8dix8c2n50thmpzj06, com.docker.swarm.service.name=restart_crash, com.docker.swarm.task=, com.docker.swarm.task.id=1hji2oko51skhv8fv1nw71gb8, com.docker.swarm.task.name=restart_crash.1.1hji2oko51skhv8fv1nw71gb8, exitCode=0, image=busybox:latest@sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812, name=restart_crash.1.1hji2oko51skhv8fv1nw71gb8)
2018-11-06T14:54:32.391165964-05:00 container die d6f98b8aaa171ca8a2ddaf31cce7a1e6f1436ba14696ea3842177b2e5e525f13 (com.docker.stack.namespace=restart, com.docker.swarm.node.id=q44zx0s2lvu1fdduk800e5ini, com.docker.swarm.service.id=uqirm6a8dix8c2n50thmpzj06, com.docker.swarm.service.name=restart_crash, com.docker.swarm.task=, com.docker.swarm.task.id=papxoq1vve1adriw6e9xqdaad, com.docker.swarm.task.name=restart_crash.1.papxoq1vve1adriw6e9xqdaad, exitCode=0, image=busybox:latest@sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812, name=restart_crash.1.papxoq1vve1adriw6e9xqdaad)
2018-11-06T14:55:00.126450155-05:00 container die 8e9310bde9acc757f94a56a32c37a08efeed8a040ce98d84c851d4eef0afc545 (com.docker.stack.namespace=restart, com.docker.swarm.node.id=q44zx0s2lvu1fdduk800e5ini, com.docker.swarm.service.id=uqirm6a8dix8c2n50thmpzj06, com.docker.swarm.service.name=restart_crash, com.docker.swarm.task=, com.docker.swarm.task.id=30okge1sjfnoicd0lo2g1y0o7, com.docker.swarm.task.name=restart_crash.1.30okge1sjfnoicd0lo2g1y0o7, exitCode=0, image=busybox:latest@sha256:2a03a6059f21e150ae84b0973863609494aad70f0a80eaeb64bddd8d92465812, name=restart_crash.1.30okge1sjfnoicd0lo2g1y0o7)
在以下位置查看有关事件命令的更多详细信息:https://docs.docker.com/engine/reference/commandline/events/
大型组织的最佳做法是将容器日志发送到中央位置(例如 Elastic)并在外部监控指标(例如 Prometheus/Grafana)。