{"id":42377,"date":"2016-12-08T15:00:23","date_gmt":"2016-12-08T13:00:23","guid":{"rendered":"http:\/\/examples.javacodegeeks.com\/?p=42377"},"modified":"2019-03-29T14:12:33","modified_gmt":"2019-03-29T12:12:33","slug":"docker-kernel-requirements","status":"publish","type":"post","link":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/","title":{"rendered":"Docker Kernel Requirements"},"content":{"rendered":"<h2>1. Introduction<\/h2>\n<p>Docker is a containerization technology that provides OS level virtualization to applications.&nbsp; It isolates processes, storage, networking, and also provide security to services running within it&#8217;s containers.&nbsp; To enable this, Docker depends on various features of the Linux Kernel.&nbsp; Let us get introduced to these Docker kernel requirements in this post.<\/p>\n<h2>2. Docker engine dependencies from the Linux kernel<\/h2>\n<p>The dependencies on the Linux kernel can be broadly categorized into 4 classes &#8211; resource constraining, security, networking, and storage.&nbsp; Resource constraining features allow container creators to place restrictions on container environments like memory usage, cpu, etc.,.&nbsp; Security features allow security policies to be applied on containers.&nbsp; Networking features allow for the SDN networking features provided by Docker.&nbsp; Storage features allow Docker to support volumes, and various storage backends.<\/p>\n<p><figure id=\"attachment_42380\" aria-describedby=\"caption-attachment-42380\" style=\"width: 860px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2016\/12\/docker-ketnel-requirements.png\"><img decoding=\"async\" class=\"size-full wp-image-42380\" src=\"http:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2016\/12\/docker-ketnel-requirements.png\" alt=\"Kernel dependencies for Docker\" width=\"860\" height=\"608\" srcset=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2016\/12\/docker-ketnel-requirements.png 860w, https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2016\/12\/docker-ketnel-requirements-300x212.png 300w, https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2016\/12\/docker-ketnel-requirements-768x543.png 768w\" sizes=\"(max-width: 860px) 100vw, 860px\" \/><\/a><figcaption id=\"caption-attachment-42380\" class=\"wp-caption-text\">Kernel dependencies for Docker<\/figcaption><\/figure><\/p>\n<p>Let us now examine each of these dependencies in brief.\n<\/p>\n<h2>3. Resource constraining dependencies<\/h2>\n<h3><strong>3.1 Control groups a.k.a cgroups<\/strong><\/h3>\n<p><a href=\"https:\/\/access.redhat.com\/documentation\/en-US\/Red_Hat_Enterprise_Linux\/6\/html\/Resource_Management_Guide\/ch01.html\">Control groups<\/a>, or <a href=\"https:\/\/en.wikipedia.org\/wiki\/Cgroups\">cgroups<\/a>, is a kernel feature to constrain the resource usage of a process or a set of processes.&nbsp; This provides Docker with 4 main features:<\/p>\n<ul>\n<li>Limit resources (CPI, memory, network, disk I\/O, &#8230;) to user-defined processes.<\/li>\n<li>Prioritize resources to processes (a set of processes will get more resources than another set).<\/li>\n<li>Measure resource usage for billing purposes.<\/li>\n<li>Control a group of processes.<\/li>\n<\/ul>\n<p>The <code>docker run<\/code> command is used to manipulate resources allocated to a container. For instance, <code>docker run --cpu-shares=&lt;value&gt;<\/code> sets the cpu share allocated to a container (every container gets 1024 shares by default). <code>docker run --cpuset-cpus=&lt;value&gt;<\/code> sets the CPU core on which the container would be run. Do look at <a href=\"https:\/\/goldmann.pl\/blog\/2014\/09\/11\/resource-management-in-docker\/#_cgroups_fs\">this insightful article<\/a> for some examples of manipulating cgroups settings for Docker containers.<\/p>\n<h3>3.2 Namespaces<\/h3>\n<p><a href=\"https:\/\/en.wikipedia.org\/wiki\/Linux_namespaces\">Namespaces<\/a> is a kernel feature that provides lightweight process virtualization to containers.&nbsp; This helps Docker to isolate these resources for a container &#8211; process IDs, hostnames, user IDs, network access, IPC and filesystems. Docker combines namespaces and cgroups to isolate resources for containers and place resource usage constraints.&nbsp; These namespaces are used to isolate containers &#8211; Process ID (pid), Network (net), Mount (mnt), Hostname (uts), Shared Memory (ipc).<\/p>\n<ul>\n<li>A pid namespace provides processes running within containers with separate pids isolated from other containers.\/li&gt;<\/li>\n<li>A net namespace creates separate network interfaces, IP adrresses and such for each container.<\/li>\n<li>A mnt namespace creates isolated mounts for each container. Mount points from host OS may be carried into the container but any any additions to the container mounts are not propagated back to the host.<\/li>\n<li>An uts namespace creates containers with their own hostnames without affecting other containers or the rest of the system.<\/li>\n<li>An ipc namespace creates isolated shared memory space for each container and prevents access between shared memory of different computers.<\/li>\n<\/ul>\n<h2>4. Security dependencies<\/h2>\n<h3>4.1 AppArmor<\/h3>\n<p><a href=\"http:\/\/apparmor.net\">AppArmor<\/a> is a <a href=\"https:\/\/en.wikipedia.org\/wiki\/Mandatory_access_control\">Mandatory Access Control (MAC)<\/a> tool to restrict programs to a limited set of resources.&nbsp; Restriction policies are set in a simple text file to administer storage, networking, capabilities of a program.&nbsp; A policy can run in <em>enforcement<\/em> or <em>complain<\/em> mode.&nbsp; A policy running in <em>enforcement mode<\/em> will enforce the policy and report violations.&nbsp; A policy running in <em>complain mode<\/em> will not enforce restrictions but only report violations.<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<p>Docker installs a default AppArmor profile &#8211; <code>\/etc\/apparmor.d\/docker<\/code> &#8211; during installation.&nbsp; This profile is applied to all Docker containers.&nbsp; To apply a specific AppArmor profile to a container&nbsp; use the option <code>docker run -it &lt;container-name&gt; --security-opt=apparmor=&lt;profile-name&gt;<\/code><code><\/code>.<\/p>\n<p>Read <a href=\"https:\/\/docs.docker.com\/engine\/security\/apparmor\/\">this page<\/a> for more details about Docker&#8217;s usage of AppArmor.<\/p>\n<h3>4.2 Security Enhanced Linux a.k.a SELinux<\/h3>\n<p><a href=\"https:\/\/selinuxproject.org\/page\/Main_Page\">SELinux<\/a>, like AppArmor, enforces MAC policies on other subsystems of the Linux kernel.&nbsp; When compared to AppArmor, SELinux follows a more elaborate multi-level security policy control.&nbsp; This is currently developed and maintained by <a href=\"https:\/\/www.redhat.com\">RedHat<\/a>.<\/p>\n<h3>4.3 Posix capabilities a.k.a Capabilities<\/h3>\n<p>Capabilites as implemented in Linux (known as &#8220;<a href=\"https:\/\/www.kernel.org\/pub\/linux\/libs\/security\/linux-privs\/kernel-2.2\/capfaq-0.2.txt\">Posix Capabilities<\/a>&#8220;) partitions the root user&#8217;s privileges into distinct smaller units called &#8220;capabilities&#8221;.&nbsp; These capabilities are enabled\/disabled as a unit and assigned to individual threads.&nbsp; This allows a thread\/process to perform some privileged operation with a minimal set of capabilities but without assuming superuser permissions.&nbsp; See <a href=\"http:\/\/man7.org\/linux\/man-pages\/man7\/capabilities.7.html\"><code>man capabilities<\/code><\/a> in any Linux system for more details on capabilities.&nbsp; Docker uses capabilities to restrict the actual capabilities of the container while providing all possible features to the service within it.&nbsp; A root user within a Docker container may not have all privileges as a root user in the actual host OS.<\/p>\n<p>Read <a href=\"https:\/\/docs.docker.com\/engine\/security\/security\/#\/linux-kernel-capabilities\">this post<\/a> for more explanation on Docker&#8217;s support of capabilities.<\/p>\n<h3>4.4 Secure Computing Mode a.k.a seccomp<\/h3>\n<p><a href=\"https:\/\/www.kernel.org\/doc\/Documentation\/prctl\/seccomp_filter.txt\">Secure Computing Mode<\/a>, also called <a href=\"https:\/\/en.wikipedia.org\/wiki\/Seccomp\">seccomp<\/a>, provides a facility to place filters on the system calls available to a user-defined process. This is combined with other tools to <a href=\"https:\/\/en.wikipedia.org\/wiki\/Seccomp\">provide a secure computing sandbox<\/a> to filter a thread from all available system calls.&nbsp; When seccomp is applied to a thread, the thread can perform only 4 system calls &#8211; read(), write(), sigreturn() and exit().&nbsp; The kernel will kill the process if it uses any other system call.[ulp id=&#8217;6PVIvOz3kDbYmNRn&#8217;]<\/p>\n<p>A seccomp profile is set to a Docker container with the <code>security-opt<\/code> option of <code>docker run<\/code> like so:<\/p>\n<pre class=\"brush:bash\">$ docker run -it &lt;container-name&gt; --security-opt &lt;value&gt;<\/pre>\n<p>Read <a href=\"https:\/\/docs.docker.com\/engine\/security\/seccomp\/\">this<\/a> doc for more information about Docker&#8217;s use of seccomp.<\/p>\n<h2>5. Networking dependencies<\/h2>\n<h3>5.1 Netfilter<\/h3>\n<p><a href=\"https:\/\/www.netfilter.org\">Netfilter<\/a> is a framework provided by the Linux Kernel that allows network packets flowing through the machine to be manipulated.&nbsp; Features include stateless and stateful packet filtering of IPv4 and IPv6 packets, Network address translation, port address translation, extensible APIs for 3rd party app developers.&nbsp; Docker uses Netfilter through it&#8217;s userspace counterpart IPTables.<\/p>\n<h3>5.2 IPTables<\/h3>\n<p><a href=\"http:\/\/ipset.netfilter.org\/iptables.man.html\">iptables<\/a> is the user-space utility counterpart for netfilter. It interacts with netfilter and allows a system administrator to define tables of firewalling rules for packet filtering, network address translation (NAT), and so on.&nbsp; The Docker daemon automatically appends rules firewalling rules to iptables if it sees it installed in the system.&nbsp; For example when we expose a container&#8217;s port to the outside world Docker adds a corresponding rule to iptables.&nbsp; To disable iptables, start Docker daemon with the option <code>iptables<\/code> set to <code>false<\/code> like so:<\/p>\n<pre class=\"brush:bash\">$ dockerd --iptables=false<\/pre>\n<p>See <a href=\"https:\/\/fralef.me\/docker-and-iptables.html\">this blog post<\/a> for a few examples of how Docker uses iptables.<\/p>\n<h3>5.3 Netlink<\/h3>\n<p><a href=\"https:\/\/wiki.linuxfoundation.org\/networking\/netlink\">Netlink<\/a> as a tool provides a mechanism for communication between kernel and userspace components using a socket interface.&nbsp; Even userspace components can use this to communicate among one another.&nbsp; This is an alternative to <a href=\"http:\/\/www.tldp.org\/LDP\/lkmpg\/2.4\/html\/x856.html\">ioctl<\/a> and reduces dependence on direct system calls, ioctl calls, and such.&nbsp; Docker implements it&#8217;s netlink libraries to talk to the kernel&#8217;s netlink interface to create and configure network devices.<\/p>\n<p><a href=\"http:\/\/containerops.org\/2014\/07\/30\/tenus-golang-powered-linux-networking\/\">This excellent post<\/a> has more details about how Docker uses Netlink.<\/p>\n<h2>6. File system dependencies<\/h2>\n<p>Docker supports several storage drivers with a plug-in architecture.&nbsp; One can choose a storage driver to run the Docker daemon with.&nbsp; However, Docker Engine can support only one active storage driver at a time.&nbsp; A change in the storage drive will need the Docker daemon to restart.<\/p>\n<h3>6.1 Device mapper<\/h3>\n<p>The <a href=\"http:\/\/www.sourceware.org\/dm\/\">devicemapper framework<\/a> is provided by the kernel to map physical block devices as virtual devices devices.&nbsp; It provides the foundation for features such as logical volume management, device encryption, copy-on-write files, etc.,. Docker uses this framework to support copy-on-write files in containers.<\/p>\n<h2>7. Other non-kernel dependencies<\/h2>\n<h3>7.1 LibContainer a.k.a RunC<\/h3>\n<p><a href=\"https:\/\/blog.docker.com\/2015\/06\/open-container-project-foundation\/\">libcontainer<\/a> (Now called <a href=\"https:\/\/github.com\/opencontainers\/runc\/tree\/master\/libcontainer\">opencontainers\/RunC<\/a>) &#8211; This is not exactly a kernel feature. Docker developed this as an execution engine that exposes a consistent standardized Go API to work with Linux namespaces, cgroups, capabilities, AppArmor, security profiles, network interfaces, firewalls and firewalling rules.&nbsp; RunC has replaced LXC as the default execution driver of the Docker Engine.<\/p>\n<h3>7.2 LXC<\/h3>\n<p>Like libcontainer, <a href=\"https:\/\/linuxcontainers.org\/lxc\/introduction\/\">LXC<\/a> provides a userspace interface for the Linux Kernel&#8217;s container supporting features.&nbsp; LXC was the initial execution engine before Docker moved to RunC.<\/p>\n<h2>8. Summary<\/h2>\n<p>In this post we were introduced to the key kernel features on which Docker depends and builds to enable containerization.&nbsp; Each of the Kernel features in itself can be pursued further and understood more deeply to <a href=\"https:\/\/opensource.com\/business\/14\/7\/docker-security-selinux\">improve container security<\/a> in Docker.&nbsp; The <a href=\"https:\/\/docs.docker.com\/engine\/security\/security\/\">Docker docs<\/a> also contain more information about kernel level enablers.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. Introduction Docker is a containerization technology that provides OS level virtualization to applications.&nbsp; It isolates processes, storage, networking, and also provide security to services running within it&#8217;s containers.&nbsp; To enable this, Docker depends on various features of the Linux Kernel.&nbsp; Let us get introduced to these Docker kernel requirements in this post. 2. Docker &hellip;<\/p>\n","protected":false},"author":103,"featured_media":31013,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1354],"tags":[],"class_list":["post-42377","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Docker Kernel Requirements - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"This post introduces the key features of the Linux Kernel that Docker builds on to enable containerization.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker Kernel Requirements - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"This post introduces the key features of the Linux Kernel that Docker builds on to enable containerization.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/\" \/>\n<meta property=\"og:site_name\" content=\"Examples Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2016-12-08T13:00:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-03-29T12:12:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/12\/docker-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Hariharan Narayanan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hariharan Narayanan\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/\"},\"author\":{\"name\":\"Hariharan Narayanan\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/780d96edfe3bce18c5440613fa88bce3\"},\"headline\":\"Docker Kernel Requirements\",\"datePublished\":\"2016-12-08T13:00:23+00:00\",\"dateModified\":\"2019-03-29T12:12:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/\"},\"wordCount\":1361,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/12\/docker-logo.jpg\",\"articleSection\":[\"Docker\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/\",\"name\":\"Docker Kernel Requirements - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/12\/docker-logo.jpg\",\"datePublished\":\"2016-12-08T13:00:23+00:00\",\"dateModified\":\"2019-03-29T12:12:33+00:00\",\"description\":\"This post introduces the key features of the Linux Kernel that Docker builds on to enable containerization.\",\"breadcrumb\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#primaryimage\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/12\/docker-logo.jpg\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/12\/docker-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/examples.javacodegeeks.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/devops\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Docker\",\"item\":\"https:\/\/examples.javacodegeeks.com\/category\/devops\/docker\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Docker Kernel Requirements\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#website\",\"url\":\"https:\/\/examples.javacodegeeks.com\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Examples and Code Snippets\",\"publisher\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/examples.javacodegeeks.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\/\/examples.javacodegeeks.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/javacodegeeks\",\"https:\/\/x.com\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/780d96edfe3bce18c5440613fa88bce3\",\"name\":\"Hariharan Narayanan\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/Hariharan-Narayanan-96x96.jpg\",\"contentUrl\":\"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/Hariharan-Narayanan-96x96.jpg\",\"caption\":\"Hariharan Narayanan\"},\"description\":\"Hari graduated from the School of Computer and Information Sciences in the University of Hyderabad. Over his career he has been involved in many complex projects in mobile applications, enterprise applications, distributed applications, micro-services, and other platforms and frameworks. He works as a consultant and is mainly involved with projects based on Java, C++ and Big Data technologies.\",\"sameAs\":[\"https:\/\/www.javacodegeeks.com\"],\"url\":\"https:\/\/examples.javacodegeeks.com\/author\/hariharan-narayanan\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Docker Kernel Requirements - Java Code Geeks","description":"This post introduces the key features of the Linux Kernel that Docker builds on to enable containerization.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/","og_locale":"en_US","og_type":"article","og_title":"Docker Kernel Requirements - Java Code Geeks","og_description":"This post introduces the key features of the Linux Kernel that Docker builds on to enable containerization.","og_url":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/","og_site_name":"Examples Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2016-12-08T13:00:23+00:00","article_modified_time":"2019-03-29T12:12:33+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/12\/docker-logo.jpg","type":"image\/jpeg"}],"author":"Hariharan Narayanan","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Hariharan Narayanan","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#article","isPartOf":{"@id":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/"},"author":{"name":"Hariharan Narayanan","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/780d96edfe3bce18c5440613fa88bce3"},"headline":"Docker Kernel Requirements","datePublished":"2016-12-08T13:00:23+00:00","dateModified":"2019-03-29T12:12:33+00:00","mainEntityOfPage":{"@id":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/"},"wordCount":1361,"commentCount":0,"publisher":{"@id":"https:\/\/examples.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#primaryimage"},"thumbnailUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/12\/docker-logo.jpg","articleSection":["Docker"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/","url":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/","name":"Docker Kernel Requirements - Java Code Geeks","isPartOf":{"@id":"https:\/\/examples.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#primaryimage"},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#primaryimage"},"thumbnailUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/12\/docker-logo.jpg","datePublished":"2016-12-08T13:00:23+00:00","dateModified":"2019-03-29T12:12:33+00:00","description":"This post introduces the key features of the Linux Kernel that Docker builds on to enable containerization.","breadcrumb":{"@id":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#primaryimage","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/12\/docker-logo.jpg","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2015\/12\/docker-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/examples.javacodegeeks.com\/devops\/docker\/docker-kernel-requirements\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/examples.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"DevOps","item":"https:\/\/examples.javacodegeeks.com\/category\/devops\/"},{"@type":"ListItem","position":3,"name":"Docker","item":"https:\/\/examples.javacodegeeks.com\/category\/devops\/docker\/"},{"@type":"ListItem","position":4,"name":"Docker Kernel Requirements"}]},{"@type":"WebSite","@id":"https:\/\/examples.javacodegeeks.com\/#website","url":"https:\/\/examples.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Examples and Code Snippets","publisher":{"@id":"https:\/\/examples.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/examples.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/examples.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/examples.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/780d96edfe3bce18c5440613fa88bce3","name":"Hariharan Narayanan","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/examples.javacodegeeks.com\/#\/schema\/person\/image\/","url":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/Hariharan-Narayanan-96x96.jpg","contentUrl":"https:\/\/examples.javacodegeeks.com\/wp-content\/uploads\/2016\/10\/Hariharan-Narayanan-96x96.jpg","caption":"Hariharan Narayanan"},"description":"Hari graduated from the School of Computer and Information Sciences in the University of Hyderabad. Over his career he has been involved in many complex projects in mobile applications, enterprise applications, distributed applications, micro-services, and other platforms and frameworks. He works as a consultant and is mainly involved with projects based on Java, C++ and Big Data technologies.","sameAs":["https:\/\/www.javacodegeeks.com"],"url":"https:\/\/examples.javacodegeeks.com\/author\/hariharan-narayanan\/"}]}},"_links":{"self":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/42377","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/users\/103"}],"replies":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=42377"}],"version-history":[{"count":0,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/42377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/media\/31013"}],"wp:attachment":[{"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=42377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=42377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/examples.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=42377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}