{"id":1869,"date":"2016-07-18T08:30:30","date_gmt":"2016-07-18T07:30:30","guid":{"rendered":"https:\/\/www.inovex.de\/\/?p=1869"},"modified":"2026-03-17T08:00:33","modified_gmt":"2026-03-17T07:00:33","slug":"docker-plugins","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/","title":{"rendered":"Docker Plugins: How to write your own"},"content":{"rendered":"<p>Docker Plugins are an easy way to extend the capabilities of the Docker Engine. You can load third-party plugins to extend e.g. the Networking, Storage and Authorization capabilities of the Docker Engine. In this article we&#8217;ll show you the capabilities of plugins and walk you through the process of writing your own.<!--more--><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#What-types-of-plugins-are-out-there\" >What types of plugins are out there<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#Using-Docker-Plugins\" >Using Docker Plugins<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#Networking\" >Networking<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#Volume\" >Volume<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#Write-your-own-Docker-Plugin\" >Write your own Docker Plugin<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#Writing-a-Volume-Plugin-for-Quobyte\" >Writing a Volume Plugin (for Quobyte)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#Quobyte-Mount-and-Docker-%E2%80%94-whats-special\" >Quobyte Mount and Docker \u2014 what\u2019s special<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#Conclusion\" >Conclusion<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#Read-on\" >Read on<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#Join-us\" >Join us!<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"What-types-of-plugins-are-out-there\"><\/span>What types of plugins are out there<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>At the moment you can find three types of Docker Plugins:<\/p>\n<p><strong>Network:<\/strong> these allow you to use third-party container networking solutions like weave to connect your containers across multiple hosts or to set specific policies. This means you aren\u2019t tied to the <a href=\"https:\/\/docs.docker.com\/engine\/userguide\/networking\/\" target=\"_blank\" rel=\"noopener\">Docker Network<\/a> and can easily use (virtually) any tool you want.<\/p>\n<p><strong>Storage\/Volume:<\/strong> these allow you to use third-party container data management solutions to persist data on your hosts or across multiple hosts. With these plugins it\u2019s much easier to run stateful applications inside containers than before. One of the first Volume Plugins was probably Flocker.<\/p>\n<p>&nbsp;<\/p>\n<p>Authorization: allows to include third-party solutions for container authorization for example the <a href=\"https:\/\/github.com\/twistlock\/authz\" target=\"_blank\" rel=\"noopener\">twistlock<\/a> plugin allows you to define which users can perform which actions.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Using-Docker-Plugins\"><\/span>Using Docker Plugins<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>If the core functionality provided by Docker doesn\u2019t fit your need you are free to use any Docker Plugin that you want. Further this provides the users with the flexibility to simply use other core functionalities like network providers than the default Docker components and on the other hand it allows tool-creators to develop Docker Plugins that make it easier for other users to use their tools with Docker.<\/p>\n<p>After you installed the Docker Plugin of your choice (there are different ways to do so) you can easily use them with the Docker CLI:<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Networking\"><\/span>Networking<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Creating a network is the same as with Docker Networking: just specify the driver which should be used and define some optional driver specific arguments with <span class=\"lang:sh decode:true crayon-inline \">&#8211;opt key=value<\/span>:<\/p>\n<pre class=\"lang:sh decode:true \">docker network create -d &lt;driver-name&gt; &lt;options&gt; Network<\/pre>\n<p>If you want to use your newly created Network just use the network name from above when calling Docker run. The Docker engine automatically attaches the container to the network:<\/p>\n<pre class=\"lang:sh decode:true \">docker run --net Network centos:7<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Volume\"><\/span>Volume<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Using a Docker Volume Plugin is nearly the same as using a network plugin. When you create a volume with the Docker CLI you just have to specify the driver which should be used and the driver specific options:<\/p>\n<pre class=\"lang:sh decode:true \">docker volume create --driver quobyte --name MyDockerVol --opt user=docker --opt group=docker<\/pre>\n<p>This command for example will create a persistent storage volume (in this case with <a href=\"http:\/\/www.quobyte.com\/\" target=\"_blank\" rel=\"noopener\">Quobyte<\/a>) , the owner of the Volume is user \u201cdocker\u201c and the group \u201cdocker\u201c. Per default these optional values are defined as root.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Write-your-own-Docker-Plugin\"><\/span>Write your own Docker Plugin<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>If you are a tool-maker and want to write your own Docker Plugin there are many ways to do so. At first you are completely free to write the Docker Plugin in any language you want; just keep in mind to make it as easy as possible for users to use your Plugin (I think it wouldn\u2019t be the best idea to use some \u201cesoteric\u201c programming language which needs to install many dependencies, albeit it\u2019s possible). If you choose <a href=\"https:\/\/golang.org\/\" target=\"_blank\" rel=\"noopener\">golang<\/a> as your programming language, Docker provides <a href=\"https:\/\/github.com\/docker\/go-plugins-helpers\" target=\"_blank\" rel=\"noopener\">plugin-helpers<\/a> to make it really simple to write your own plugin. Later we will learn in detail how to implement a specific Plugin. But first let\u2019s have a look at the basics of Docker Plugins.<\/p>\n<p>So at first a Docker Plugin is a process that runs (mostly) on the same machine or on a remote machine. The Docker Engine has a Plugin discovery to automatically detect (newly installed) Plugins on your machine and on remote machines. The Plugin Discovery has three ways to detect Plugins:<\/p>\n<ul>\n<li>Unix domain sockets: (.sock) the matching socket file must be located under \/run\/docker\/plugins to be automatically detected.<\/li>\n<li>A spec file (.spec) , that contains a URL of the plugin e.q. unix:\/\/myplugin.sock or tcp:\/\/remote-host:8080<\/li>\n<li>Or a json spec file (.json) that contains a full specification of the plugin. You can find an example json specification in the <a href=\"https:\/\/docs.docker.com\/engine\/extend\/plugin_api\/#\/json-specification\" target=\"_blank\" rel=\"noopener\">Docker documentation<\/a>.<\/li>\n<\/ul>\n<p>Spec files can be located at <span class=\"lang:sh decode:true crayon-inline \">\/etc\/docker\/plugins<\/span> or <span class=\"lang:sh decode:true crayon-inline \">\/usr\/lib\/docker\/plugins<\/span>.<\/p>\n<p>To activate a Plugin the Docker Engine calls the endpoint \/Plugin.Activate and as a result gets the plugin type that is implemented by this Plugin, e.g. VolumeDriver.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Writing-a-Volume-Plugin-for-Quobyte\"><\/span>Writing a Volume Plugin (for Quobyte)<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Now let\u2019s have a closer look at how you can implement a Volume Plugin for Docker. In this case we will refer to the <a href=\"https:\/\/github.com\/quobyte\/docker-volume\" target=\"_blank\" rel=\"noopener\">Quobyte Docker Plugin<\/a> that I created with the help of <a href=\"https:\/\/twitter.com\/drhu\" target=\"_blank\" rel=\"noopener\">Felix Hupfeld<\/a> of <a href=\"http:\/\/www.quobyte.com\/\" target=\"_blank\" rel=\"noopener\">Quobyte<\/a>. We chose go as programming language mainly because of the go-plugin-helper and the ability to create static linked binaries. Assuming that you already have a working go environment you can easily get the go-plugin helpers with<\/p>\n<pre class=\"lang:go decode:true \">go get -u github.com\/docker\/go-plugins-helpers<\/pre>\n<p>Now you can simply import the go-plugin-helpers.<\/p>\n<p>In the first step we implement the driver interface, that\u2019s the core component of the Docker plugin that handles all request. The interface is specified as follows:<\/p>\n<pre class=\"lang:go decode:true \">type Driver interface {\r\n\r\n\tCreate(Request) Response\r\n\r\n\tList(Request) Response\r\n\r\n\tGet(Request) Response\r\n\r\n\tRemove(Request) Response\r\n\r\n\tPath(Request) Response\r\n\r\n\tMount(Request) Response\r\n\r\n\tUnmount(Request) Response\r\n\r\n\tCapabilities(Request) Response\r\n\r\n}<\/pre>\n<p>and a Response is defined as:<\/p>\n<pre class=\"lang:go decode:true \">type Response struct {\r\n\r\n\tMountpoint   string\r\n\r\n\tErr          string\r\n\r\n\tVolumes      []*Volume\r\n\r\n\tVolume       *Volume\r\n\r\n\tCapabilities Capability\r\n\r\n}<\/pre>\n<p>Depending on the request you don\u2019t need to set all fields in the Response struct. Now let\u2019s look at the <a href=\"https:\/\/docs.docker.com\/engine\/extend\/plugins_volume\/#\/volume-plugin-protocol\" target=\"_blank\" rel=\"noopener\">VolumeDriver methods<\/a>:<\/p>\n<ul>\n<li>Create: is called when the user wants to create a volume. In our example this request results in an API call to the Quobyte registry that creates the requested Volume if possible. The user get\u2019s an empty error as a result if everything goes well or the error message if something went wrong.<\/li>\n<li>Remove: is called when a Volume is deleted. The Response is the same as at creation.<\/li>\n<li>Mount: is called when a container wants to use the specified volume. The response contains an empty error and returns the mount point on the host for the specified volume.<\/li>\n<li>Path: is called to get the path of a volume mounted on the host. This request has the same response as mount.<\/li>\n<li>Unmount: is called when Docker doesn\u2019t use a volume anymore and it\u2019s probably safe to unmount it.<\/li>\n<li>Get: requests information about the specified volume and returns the name, mount point and optional status.<\/li>\n<li>List: lists all volumes and optionally the mount point of the volume.<\/li>\n<li>Capabilities: indicates if a volume has to be created multiple times (for every host) or only once.<\/li>\n<\/ul>\n<p>When all these handlers are implemented all you have to do is to create a new driver object in your main file and add this to the volume handler. In a next step you can tell the handler to listen on a Unix socket or on a TCP socket. In our example we use a Unix socket that will be automatically created in <span class=\"lang:sh decode:true crayon-inline \">\/run\/docker\/plugins<\/span>. When we start the driver, this is done by the go-plugin-helper.<\/p>\n<pre class=\"lang:go decode:true \">qDriver := newQuobyteDriver(quobyteAPIURL, qmgmtUser, qmgmtPassword)\r\n\r\nhandler := volume.NewHandler(qDriver)\r\n\r\nlog.Println(handler.ServeUnix(\"root\", quobyteID))<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Quobyte-Mount-and-Docker-%E2%80%94-whats-special\"><\/span>Quobyte Mount and Docker \u2014 what\u2019s special<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>When you read the <a href=\"https:\/\/docs.docker.com\/engine\/extend\/plugins_volume\/#\/volumedriver-mount\" target=\"_blank\" rel=\"noopener\">VolumeDriver.Mount<\/a> you\u2019ll notice that Docker suggests to mount each Volume individually and if a volume is used by multiple containers the Plugin takes track of how many containers are using the volume. If you use many different volumes on your system this will result in many separated mounts on the host, which will end up in a lot of memory management . When we created the Quobyte Docker Plugin we thought that it would be much more practical to do only one mount in <span class=\"lang:sh decode:true crayon-inline \">\/run\/docker\/quobyte\/mnt<\/span>. All Quobyte volumes can be found in this directory.<\/p>\n<p>So we now have only one mount and we don\u2019t need to track the volume usage. This allows us to use the Plugin even on distributions that don\u2019t allow you to install packages, such as CoreOS. You can now use a Docker container to mount all Quobyte Volumes inside <span class=\"lang:sh decode:true crayon-inline \">\/run\/docker\/quobyte\/mnt<\/span> and the Plugin will know that it doesn\u2019t need to mount the Quobyte Volumes again.<\/p>\n<p>Another cool feature that will be introduced with Quobyte 1.3 are fixed-user mounts. The fixed-user mounts simply allow to mount all Quobyte Volumes inside one directory and use them as different users. All access to the Quobyte Volume will be rewritten to the specified user and group \u2013 both are optional, independent of the user inside the container.<\/p>\n<p>The image below is an example for such a fixed-user mount. Inside container 1 all actions are done by the user mysql but on the Quobyte volume all reads\/writes are executed as the user \u201cjohscheuer\u201c. When we look at container 2 all actions inside the container are performed as root but access to the Quobyte volume is performed as user \u201chans\u201c in the group \u201croot\u201c. This allows to map the access to the real user and not to the user that runs inside the container.<\/p>\n<p>Sadly this feature isn\u2019t implemented in the current Docker Plugin of Quobyte. The reason why we didn\u2019t implemented it yet is that there is no possibility to pass a user name or group to the Docker Plugin when starting a Container.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-1871 size-large\" src=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-1024x576.png\" alt=\"Fixed user mount with Quobyte and Docker\" width=\"800\" height=\"450\" srcset=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-1024x576.png 1024w, https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-300x169.png 300w, https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-768x432.png 768w, https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-1536x864.png 1536w, https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-400x225.png 400w, https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-720x406.png 720w, https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-360x203.png 360w, https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte.png 1920w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/p>\n<p>If you want to read more about Quobyte and containers you can have a look at the <a href=\"http:\/\/www.quobyte.com\/containers\" target=\"_blank\" rel=\"noopener\">Quobyte website<\/a>.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Conclusion\"><\/span>Conclusion<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Docker Plugins allow an easy extension of the Docker Engine and enable users to replace core components without pain or combine different components. With the go-plugin-helpers it is pretty easy to write your own Docker Plugin for your favorite tool.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Read-on\"><\/span>Read on<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Want to know more about containers and the services we offer in <a href=\"https:\/\/www.inovex.de\/en\/our-services\/it-engineering\/\" target=\"_blank\" rel=\"noopener\">IT Engineering<\/a>? Visit our website, write an email to <a href=\"mailto:info@inovex.de\" target=\"_blank\" rel=\"noopener\">info@inovex.de<\/a> or call <a href=\"tel:+497216190210\">+49 721 619 021-0<\/a>!<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Join-us\"><\/span>Join us!<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Looking for a new job in Karlsruhe, Munich, Stuttgart, Cologne or Hamburg? We&#8217;re hiring Big Data Systems Engineers (m\/w\/d)!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Docker Plugins are an easy way to extend the capabilities of the Docker Engine. You can load third-party plugins to extend e.g. the Networking, Storage and Authorization capabilities of the Docker Engine. In this article we&#8217;ll show you the capabilities of plugins and walk you through the process of writing your own.<\/p>\n","protected":false},"author":22,"featured_media":12580,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[71,823],"service":[414],"coauthors":[{"id":22,"display_name":"Johannes M. Scheuermann","user_nicename":"jscheuermann"}],"class_list":["post-1869","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-cloud","tag-docker","service-cloud"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Docker Plugins: How to write your own - inovex GmbH<\/title>\n<meta name=\"description\" content=\"Docker Plugins are an easy way to extend the capabilities of the Docker Engine. We&#039;ll show the capabilities of plugins.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker Plugins: How to write your own - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"Docker Plugins are an easy way to extend the capabilities of the Docker Engine. We&#039;ll show the capabilities of plugins.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2016-07-18T07:30:30+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-17T07:00:33+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2300\" \/>\n\t<meta property=\"og:image:height\" content=\"678\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Johannes M. Scheuermann\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild-1024x302.png\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Johannes M. Scheuermann\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"10\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Johannes M. Scheuermann\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/\"},\"author\":{\"name\":\"Johannes M. Scheuermann\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/0bacb2c9ca9064212903a844e408fb12\"},\"headline\":\"Docker Plugins: How to write your own\",\"datePublished\":\"2016-07-18T07:30:30+00:00\",\"dateModified\":\"2026-03-17T07:00:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/\"},\"wordCount\":1597,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild.png\",\"keywords\":[\"Cloud\",\"Docker\"],\"articleSection\":[\"English Content\",\"General\",\"Infrastructure\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/\",\"url\":\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/\",\"name\":\"Docker Plugins: How to write your own - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild.png\",\"datePublished\":\"2016-07-18T07:30:30+00:00\",\"dateModified\":\"2026-03-17T07:00:33+00:00\",\"description\":\"Docker Plugins are an easy way to extend the capabilities of the Docker Engine. We'll show the capabilities of plugins.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#primaryimage\",\"url\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild.png\",\"contentUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild.png\",\"width\":2300,\"height\":678,\"caption\":\"Docker Quobyte\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.inovex.de\/de\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker Plugins: How to write your own\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.inovex.de\/de\/#website\",\"url\":\"https:\/\/www.inovex.de\/de\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.inovex.de\/de\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.inovex.de\/de\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\/\/www.inovex.de\/de\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/inovexde\",\"https:\/\/x.com\/inovexgmbh\",\"https:\/\/www.instagram.com\/inovexlife\/\",\"https:\/\/www.linkedin.com\/company\/inovex\",\"https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/0bacb2c9ca9064212903a844e408fb12\",\"name\":\"Johannes M. Scheuermann\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/f922827beb705676e2040c1ecc2b6370\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d3df0e3e0fa19f031fc539be1bd60a808d56719e4f9d367bf9b116ef6d653b1b?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d3df0e3e0fa19f031fc539be1bd60a808d56719e4f9d367bf9b116ef6d653b1b?s=96&d=retro&r=g\",\"caption\":\"Johannes M. Scheuermann\"},\"url\":\"https:\/\/www.inovex.de\/de\/blog\/author\/jscheuermann\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Docker Plugins: How to write your own - inovex GmbH","description":"Docker Plugins are an easy way to extend the capabilities of the Docker Engine. We'll show the capabilities of plugins.","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:\/\/www.inovex.de\/de\/blog\/docker-plugins\/","og_locale":"de_DE","og_type":"article","og_title":"Docker Plugins: How to write your own - inovex GmbH","og_description":"Docker Plugins are an easy way to extend the capabilities of the Docker Engine. We'll show the capabilities of plugins.","og_url":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2016-07-18T07:30:30+00:00","article_modified_time":"2026-03-17T07:00:33+00:00","og_image":[{"width":2300,"height":678,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild.png","type":"image\/png"}],"author":"Johannes M. Scheuermann","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild-1024x302.png","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Johannes M. Scheuermann","Gesch\u00e4tzte Lesezeit":"10\u00a0Minuten","Written by":"Johannes M. Scheuermann"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/"},"author":{"name":"Johannes M. Scheuermann","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/0bacb2c9ca9064212903a844e408fb12"},"headline":"Docker Plugins: How to write your own","datePublished":"2016-07-18T07:30:30+00:00","dateModified":"2026-03-17T07:00:33+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/"},"wordCount":1597,"commentCount":2,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild.png","keywords":["Cloud","Docker"],"articleSection":["English Content","General","Infrastructure"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/","url":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/","name":"Docker Plugins: How to write your own - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild.png","datePublished":"2016-07-18T07:30:30+00:00","dateModified":"2026-03-17T07:00:33+00:00","description":"Docker Plugins are an easy way to extend the capabilities of the Docker Engine. We'll show the capabilities of plugins.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/07\/docker-quobyte-artikelbild.png","width":2300,"height":678,"caption":"Docker Quobyte"},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/docker-plugins\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Docker Plugins: How to write your own"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/0bacb2c9ca9064212903a844e408fb12","name":"Johannes M. Scheuermann","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/image\/f922827beb705676e2040c1ecc2b6370","url":"https:\/\/secure.gravatar.com\/avatar\/d3df0e3e0fa19f031fc539be1bd60a808d56719e4f9d367bf9b116ef6d653b1b?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d3df0e3e0fa19f031fc539be1bd60a808d56719e4f9d367bf9b116ef6d653b1b?s=96&d=retro&r=g","caption":"Johannes M. Scheuermann"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/jscheuermann\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/1869","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=1869"}],"version-history":[{"count":4,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/1869\/revisions"}],"predecessor-version":[{"id":66550,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/1869\/revisions\/66550"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/12580"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=1869"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=1869"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=1869"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=1869"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}