{"id":54093,"date":"2025-11-18T06:42:15","date_gmt":"2025-11-18T06:42:15","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=54093"},"modified":"2025-11-18T06:42:15","modified_gmt":"2025-11-18T06:42:15","slug":"docker-tutorials-docker-cgroup-drivers-complete-guide","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/docker-tutorials-docker-cgroup-drivers-complete-guide\/","title":{"rendered":"Docker Tutorials: Docker Cgroup Drivers \u2013 Complete Guide"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p>Docker uses <strong>cgroups (control groups)<\/strong> to manage resource constraints like CPU, memory, and I\/O for containers. These cgroups are orchestrated through <strong>cgroup drivers<\/strong> that act as an interface between Docker and the Linux kernel.<\/p>\n\n\n\n<p>Understanding Docker\u2019s cgroup drivers is critical for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Optimizing container resource management<\/li>\n\n\n\n<li>Integrating container runtime with Kubernetes<\/li>\n\n\n\n<li>Debugging container performance problems<\/li>\n\n\n\n<li>Ensuring compatibility with modern OS distributions<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udccb What Are Cgroup Drivers?<\/h2>\n\n\n\n<p>A <strong>cgroup driver<\/strong> tells Docker which mechanism to use to <strong>allocate and manage resource control groups<\/strong> (cgroups) in the Linux system.<\/p>\n\n\n\n<p>Docker supports two cgroup driver types:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>cgroupfs<\/strong> \u2014 Docker directly manages cgroups via the kernel\u2019s cgroup filesystem<\/li>\n\n\n\n<li><strong>systemd<\/strong> \u2014 Docker delegates cgroup management to <code>systemd<\/code>, which manages cgroups unified with system services<\/li>\n<\/ol>\n\n\n\n<p>As of Docker v20+, both are still relevant depending on OS and platform.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\uddf1 List of Docker Cgroup Drivers<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Driver<\/th><th>Control Mode<\/th><th>Supported Linux Cgroup Versions<\/th><\/tr><\/thead><tbody><tr><td><code>cgroupfs<\/code><\/td><td>Direct via <code>\/sys\/fs\/cgroup<\/code><\/td><td>cgroup v1 and hybrid v1\/v2<\/td><\/tr><tr><td><code>systemd<\/code><\/td><td>Delegated to systemd\u2019s unified hierarchy<\/td><td>Fully cgroup v2 compliant<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd27 1. cgroupfs Driver<\/h2>\n\n\n\n<p><strong>Definition:<\/strong> Docker directly creates and manages cgroups by interacting with the kernel\u2019s cgroup filesystem.<\/p>\n\n\n\n<p><strong>Filesystem structure:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">\/sys\/fs\/cgroup\/\n \u251c\u2500\u2500 cpu\/\n \u251c\u2500\u2500 memory\/\n \u251c\u2500\u2500 blkio\/\n \u2514\u2500\u2500 ...\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\u2714\ufe0f Pros:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Works with systems without systemd (e.g., Alpine, older distros)<\/li>\n\n\n\n<li>No systemd overhead<\/li>\n\n\n\n<li>Independent cgroup hierarchy \u2014 doesn\u2019t rely on OS unit governance<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u274c Cons:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Container and system services may use <strong>different cgroup hierarchies<\/strong>, causing interference<\/li>\n\n\n\n<li>Not recommended for Kubernetes \u2014 kubelet prefers unified hierarchy<\/li>\n\n\n\n<li>Difficult to manage under cgroup v2-only systems<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udce6 Use Cases:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Minimal Linux OS without systemd (e.g., Alpine, some IoT or embedded systems)<\/li>\n\n\n\n<li>Isolated, single-node Docker usage<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udded 2. systemd Driver<\/h2>\n\n\n\n<p><strong>Definition:<\/strong> Docker delegates cgroup management to <strong>systemd<\/strong>, ensuring that containers and system services are part of the same unified hierarchy.<\/p>\n\n\n\n<p><strong>Hierarchy example:<\/strong><\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">\/sys\/fs\/cgroup\/system.slice\/docker-<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">container-id<\/span>&gt;<\/span>.scope\/\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">\u2714\ufe0f Pros:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Kubernetes recommended driver<\/strong> via <code>cgroupDriver: systemd<\/code><\/li>\n\n\n\n<li>Prevents conflicting resource handling between services and containers<\/li>\n\n\n\n<li>Supports cgroup v2 (unified) by default<\/li>\n\n\n\n<li>Integrated with host\u2019s unit management (service-level resource control)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u274c Cons:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Requires systemd (not present on Alpine or older distros)<\/li>\n\n\n\n<li>Slightly more overhead in cgroup management<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udce6 Use Cases:<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kubernetes clusters<\/li>\n\n\n\n<li>Modern Linux systems (Ubuntu 20.04+, RHEL 8+, Debian 11+)<\/li>\n\n\n\n<li>Mixed workloads where system services and containers need consistent resource governance<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcca Comparison Summary<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th><code>cgroupfs<\/code><\/th><th><code>systemd<\/code><\/th><\/tr><\/thead><tbody><tr><td>Kubernetes-friendly<\/td><td>\u274c No<\/td><td>\u2714\ufe0f Yes<\/td><\/tr><tr><td>Works without systemd<\/td><td>\u2714\ufe0f Yes<\/td><td>\u274c No<\/td><\/tr><tr><td>Unified control system<\/td><td>\u274c No<\/td><td>\u2714\ufe0f Yes<\/td><\/tr><tr><td>cgroup v2 support<\/td><td>Partial<\/td><td>Full<\/td><\/tr><tr><td>Simplicity<\/td><td>\u2714\ufe0f Yes<\/td><td>Moderate<\/td><\/tr><tr><td>Recommended by Docker?<\/td><td>Only for non-systemd hosts<\/td><td>\u2714\ufe0f Preferred driver<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udee0\ufe0f How to Check Which Cgroup Driver You&#8217;re Using<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">For Docker:<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">docker info | grep -i cgroup\n<\/code><\/span><\/pre>\n\n\n<p>Output example:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">Cgroup Driver: systemd\nCgroup Version: 2\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">For Kubernetes:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">kubectl get node -o jsonpath=<span class=\"hljs-string\">'{.items&#91;0].status.nodeInfo.cgroupDriver}'<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 Best Practices and Recommendations<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On <strong>Kubernetes clusters<\/strong>: always use <code>systemd<\/code> cgroup driver (especially with CRI runtimes)<\/li>\n\n\n\n<li>On <strong>lightweight systems without systemd<\/strong>: use <code>cgroupfs<\/code><\/li>\n\n\n\n<li>On <strong>cgroup v2-only systems<\/strong> (e.g., newer Ubuntu, RHEL): ensure your Docker is using <code>systemd<\/code><\/li>\n\n\n\n<li>Set cgroup driver consistently across <strong>Docker, containerd, and Kubernetes<\/strong> components to avoid mismatch errors<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcd6 Configure Docker Cgroup Driver<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Edit Docker daemon configuration:<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo vim \/etc\/docker\/daemon.json\n<\/code><\/span><\/pre>\n\n\n<p>Set <code>systemd<\/code> driver:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JSON \/ JSON with Comments\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n  <span class=\"hljs-attr\">\"exec-opts\"<\/span>: &#91;<span class=\"hljs-string\">\"native.cgroupdriver=systemd\"<\/span>]\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON with Comments<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Restart Docker:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">sudo systemctl restart docker\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udded Troubleshooting Common Issues<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u274c Error: &#8220;cgroup driver conflict&#8221;<\/h3>\n\n\n\n<p>Occurs when Docker is using <code>cgroupfs<\/code> while Kubernetes (kubelet) uses <code>systemd<\/code>.<\/p>\n\n\n\n<p><strong>Fix:<\/strong> Align both to use <code>systemd<\/code><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u274c Not recognized cgroup v2<\/h3>\n\n\n\n<p>Upgrade Docker runtime to v20+ and configure <code>systemd<\/code> as cgroup driver.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde9 Summary<\/h2>\n\n\n\n<p>Docker supports two primary cgroup drivers \u2014 <code>cgroupfs<\/code> and <code>systemd<\/code>. The modern recommendation, especially for Kubernetes or systemd-based distributions, is to <strong>use <code>systemd<\/code><\/strong> as the cgroup driver.<\/p>\n\n\n\n<p>This ensures unified resource control between system services and containers, avoids cgroup conflicts, and fully supports cgroup v2.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Scenario<\/th><th>Recommended Driver<\/th><\/tr><\/thead><tbody><tr><td>Modern Linux with systemd (Ubuntu, RHEL, Debian)<\/td><td>systemd<\/td><\/tr><tr><td>Kubernetes clusters<\/td><td>systemd<\/td><\/tr><tr><td>Minimal Linux without systemd<\/td><td>cgroupfs<\/td><\/tr><tr><td>Legacy Docker usage on old OS<\/td><td>cgroupfs<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Docker uses cgroups (control groups) to manage resource constraints like CPU, memory, and I\/O for containers. These cgroups are orchestrated through cgroup drivers that act as an interface between&#8230; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-54093","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54093","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=54093"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54093\/revisions"}],"predecessor-version":[{"id":54094,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54093\/revisions\/54094"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=54093"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=54093"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=54093"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}