{"id":8245,"date":"2015-06-09T13:54:33","date_gmt":"2015-06-09T11:54:33","guid":{"rendered":"http:\/\/blog.zhaw.ch\/icclab\/?p=8245"},"modified":"2015-06-09T14:21:22","modified_gmt":"2015-06-09T12:21:22","slug":"process-management-in-docker-containers","status":"publish","type":"post","link":"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/","title":{"rendered":"Process Management in Docker Containers"},"content":{"rendered":"<p style=\"text-align: justify\">In the context of the <a href=\"http:\/\/blog.zhaw.ch\/icclab\/category\/research-approach\/themes\/cloud-native-applications\/\" target=\"_blank\">Cloud Native Applications<\/a> (CNA) <a href=\"http:\/\/blog.zhaw.ch\/icclab\/cloud-native-applications-seed-project-kickoff\/\" target=\"_blank\">Seed Project <\/a>we are working on migrating an open source CRM application into to the cloud. After enabling horizontal scalabilty of the original application and moving it onto our OpenStack cloud with the help of CoreOS (etcd, fleet) and docker we&#8217;ve now just finished adding the monitoring \/ logging \/ log-collection functionality\u00a0&#8211; a blog post describing this process in its detail will follow &#8211; which is needed for the next part of the project: enabling <em>automatic scaling<\/em>. As part of this process we&#8217;ve learnt some lessons concerning the process management in docker containers which we&#8217;d like to share in this post.<\/p>\n<p style=\"text-align: justify\"><!--more--><\/p>\n<h1>Containers and Processes<\/h1>\n<p style=\"text-align: justify\">If you use Docker to run an application (e.g a webserver) you just have to write a Dockerfile that installs the webserver and define a command that tells docker what process should be started if the docker container is run. There is no problem yet because if you stop the container the process is stopped, too. If the process in the container exits the container also stops. So there is something like a 1:1 mapping: one container starts\/stops one process. Docker containers are intended to be used like that.<\/p>\n<p>Pseudo-Dockerfile of a webserver:<\/p>\n<pre># Use base image\r\nFROM ubuntu:14.04\r\n\r\n# install the service (e.g webserver)\r\nRUN apt-get update &amp;&amp; apt-get install webserver\r\n\r\n# add some configuration\/application\r\nADD webserver_config.cfg \/etc\/webserver\/webserver_config.cfg\r\nADD webserver_app \/app\r\n\r\n# process executed when container starts (starting webserver)\r\nCMD \/bin\/start-webserver --foreground<\/pre>\n<h1>Problems arise<\/h1>\n<p style=\"text-align: justify\">But very soon you start adding more things to your container. Very likely you start more processes inside the container. An easy way to achieve this is to use a bash-script that is used to start all the processes you use:<\/p>\n<p>Pseudo-Dockerfile:<\/p>\n<pre><i>[...]\r\n<\/i>\r\n# install the service (e.g webserver)\r\nRUN apt-get update &amp;&amp; apt-get install webserver\r\n\r\n# install more needed applications\r\napt-get install debugging-tool monitoring-tool service-discovery\r\n\r\n<i>[...]\r\n\r\n<\/i>ADD start.sh \/start.sh\r\n\r\n# process executed when container starts (start-script)\r\nCMD \/start.sh<\/pre>\n<p>Start-script (start.sh):<\/p>\n<pre>#!\/bin\/bash\r\n\/bin\/monitoring-tool &amp;\r\n\/bin\/service-discovery &amp;\r\n\/bin\/start-webserver &amp;\r\n\/bin\/debbugging-tool &amp;\r\ntail -f \/var\/log\/webserver_logfile.log<\/pre>\n<p style=\"text-align: justify\">This works well although you might notice that the last line of the script tailing a logfile is a bit hacky and lets you feel a bit uncomfortable. This line is needed to keep the script running and prevents that it exits. The script should not terminate because this is the process started when you run the docker container. If you omit the last line, the container would just stop right after starting all the processes. All these processes will not be running anymore because the container they\u2019re living in is stopped!<\/p>\n<p style=\"text-align: justify\">Another problem is logging. With this simple script only the log of the webserver is written to stdout. That means that if you issue the \u2018docker logs\u2019 command, only the webservers logfile will be shown. But it would be much more comfortable if you could read all the logs from all the processes inside the container with this command.<\/p>\n<p style=\"text-align: justify\">A typical use case is running an application together with dynamic configuration management. That means the application is running inside the container together with another process which is responsible that the service is running with the latest configuration. This could be some tool like <i>confd<\/i> that watches some keys in a distributed key-value store like <i>etcd<\/i>. If a change of the desired configuration is detected, the tool has to take care of restarting the service (e.g apache) inside the container. If the service is the process the container is started with, it is not possible to restart this process because stopping this process from within the container stops the container.<\/p>\n<p style=\"text-align: justify\">You could setup your apache as daemon using init systems like Upstart\/Systemd. This way you solve one and introduce even more problems because you would use the container like a virtual machine. What would happen if the apache service in the container fails? The container would still be running and you wouldn\u2019t notice that the apache process isn\u2019t running anymore.<\/p>\n<h1>Using process supervision &#8211; supervisord<\/h1>\n<p style=\"text-align: justify\">The solution for this is relatively easy. Just use an init process for the container that handles the lifecycle of the other processes you want to run in the container. Applications that can do this are called <i>process supervision tools<\/i> &#8211; Tools like <a href=\"http:\/\/skarnet.org\/software\/s6\/\">s6<\/a>, <a href=\"http:\/\/smarden.org\/runit\/\">runit <\/a>or <a href=\"http:\/\/supervisord.org\/\">supervisord<\/a>.<\/p>\n<p style=\"text-align: justify\">All you need to do now is to install one of these tools in the docker image, write the configuration which is basically a definition what processes you want to start and finally set the supervision tool as init process in the Dockerfile.<\/p>\n<p>For Supervisord this can be done as follows:<\/p>\n<p>Install supervisord (in Ubuntu based image):<br \/>\nDockerfile:<\/p>\n<pre><i>[...]\r\n<\/i>RUN apt-get install -yq supervisor\r\n<i>[...]<\/i><\/pre>\n<p>Write the configuration (\/etc\/supervisor\/conf.d\/webserver_supervisord.conf):<\/p>\n<pre>[program:webserver]\r\ncommand=\/bin\/start-webserver\r\nnumprocs=1\r\nstdout_logfile=\/dev\/fd\/1\r\nstdout_logfile_maxbytes=0\r\n\r\n[program:monitoring-tool]\r\ncommand=\/bin\/start-monitoring\r\nnumprocs=1\r\nstdout_logfile=\/dev\/fd\/1\r\nstdout_logfile_maxbytes=0\r\n\r\n[program:service-discovery]\r\ncommand=\/bin\/start-servicediscovery\r\nnumprocs=1\r\nstdout_logfile=\/dev\/fd\/1\r\nstdout_logfile_maxbytes=0\r\n\r\n[program:debugging-tool]\r\ncommand=\/bin\/start-debugging\r\nnumprocs=1\r\nstdout_logfile=\/dev\/fd\/1\r\nstdout_logfile_maxbytes=0<\/pre>\n<p>Set supervisor as init process:<br \/>\nDockerfile:<\/p>\n<pre><i>[...]\r\n<\/i>CMD \/usr\/bin\/supervisord\r\n<i>[...]<\/i><\/pre>\n<p style=\"text-align: justify\">Supervisord will be started as the initial process when launching the container. Supervisord then starts and supervises the processes you defined in the configuration file. The stdout_logfile lines in the configuration tells supervisord to log to stdout. That means all outputs from all processes in the container can then be shown by \u2018docker logs\u2019. There are many more options offered by supervisord. For example it can be configured to restart a process if it fails.<\/p>\n<p style=\"text-align: justify\">From within the container you can now talk to supervisord with the supervisorctl client. This way you can easily start\/stop\/restart processes defined in the configuration file. This is very similar to Upstart\/Systemd. For example to start the debugging-tool the command would be:<\/p>\n<pre>$ supervisorctl start debugging-tool<\/pre>\n<h1>The eternal process<\/h1>\n<p style=\"text-align: justify\">There is still a problem with this approach. Supervisord is always running no matter what other processes are running by supervisord. For your container life cycle that means that as long as supervisord is running your container is running. This maybe is something you don\u2019t want or is something that can confuse other applications monitoring the containers\u2019 status as kind of health management.<\/p>\n<p style=\"text-align: justify\">For instance if you use <a href=\"https:\/\/github.com\/coreos\/fleet\">fleet <\/a>to start docker containers in a cluster environment this can really break the expected behavior. A fleet service can be automatically restarted if it fails. If you start a container as fleet service, it would be restarted if the container stops. But with supervisord the container would run forever, even if the webserver inside the container had crashed. Fortunately there is a possibility to shutdown supervisor if a process exits, but this includes writing an additional script and extending the configuration with an event listener.<\/p>\n<p style=\"text-align: justify\">The event listener is called when the process specified enters the specified state. In this example, if the webserver process enters the process state fatal, the kill_supervisor.py script is executed.<\/p>\n<p>Configuration file (\/etc\/supervisor\/conf.d\/webserver_supervisord.conf):<\/p>\n<pre><i>[...]\r\n<\/i>[eventlistener:webserver_exit]\r\ncommand=\/usr\/bin\/kill_supervisor.py\r\nprocess_name=webserver\r\nevents=PROCESS_STATE_FATAL\r\n<i>[...]<\/i><\/pre>\n<p>kill_supervisor.py script:<\/p>\n<pre>#!\/usr\/bin\/env python\r\nimport sys\r\nimport os\r\nimport signal\r\n\r\ndef write_stdout(s):\r\n\u00a0\u00a0\u00a0sys.stdout.write(s)\r\n\u00a0\u00a0\u00a0sys.stdout.flush()\r\ndef write_stderr(s):\r\n\u00a0\u00a0\u00a0sys.stderr.write(s)\r\n\u00a0\u00a0\u00a0sys.stderr.flush()\r\ndef main():\r\n\u00a0\u00a0\u00a0while 1:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0write_stdout('READY\\n')\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0line = sys.stdin.readline()\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0write_stdout('This line kills supervisor: ' + line);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0try:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pidfile = open('\/var\/run\/supervisord.pid','r')\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pid = int(pidfile.readline());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0os.kill(pid, signal.SIGQUIT)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0except Exception as e:\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0write_stdout('Could not kill supervisor: ' + e.strerror + '\\n')\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0write_stdout('RESULT 2\\nOK')\r\nif __name__ == '__main__':\r\n\u00a0\u00a0\u00a0main()\r\n\u00a0\u00a0\u00a0import sys<\/pre>\n<h1>Conclusion<\/h1>\n<p style=\"text-align: justify\">Process supervision tools like supervisord simplify process handling in docker containers.\u00a0Especially if you need to run multiple processes or need to restart processes\u00a0inside containers.<\/p>\n<p style=\"text-align: justify\">Supervisord is one of these process supervision tools. It is easy to install, configure and provides many features. More advanced tasks such as stopping the container as soon as a supervised process is stopped involve writing additional scripts for event handling.<\/p>\n<p style=\"text-align: justify\">Word of caution: Supervisord does not resolve all problems regarding process management in docker containers: A problem that is still present is the <a href=\"https:\/\/blog.phusion.nl\/2015\/01\/20\/docker-and-the-pid-1-zombie-reaping-problem\/\">PID 1 zombie reaping problem<\/a>. Usually an init system is responsible to cleanup zombie processes. Supervisord does not do this. To tackle this problem, you can use one of the other supervision tools mentioned above or use a <a href=\"https:\/\/github.com\/phusion\/baseimage-docker\">proper base-image<\/a> for this.<\/p>\n<h1>Sources<\/h1>\n<ul>\n<li><a href=\"https:\/\/docs.docker.com\/articles\/using_supervisord\/\">Docker Article<\/a><\/li>\n<li><a href=\"http:\/\/tech.paulcz.net\/2014\/12\/multi-process-docker-images-done-right\/\">Multiprocess Docker Images Done Right<\/a><\/li>\n<\/ul>\n<h1>Links<\/h1>\n<ul>\n<li><a href=\"http:\/\/blog.zhaw.ch\/icclab\/category\/research-approach\/themes\/cloud-native-applications\/\">Cloud-Native Applications Initiative Page<\/a><\/li>\n<li><a href=\"http:\/\/blog.zhaw.ch\/icclab\/cna-seed-project-migration-process-part-1\/\">CNA Seed Project: Migration Process Part 1<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/icclab\/cna-seed-project\">CNA Seed Project: Github Repository<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<div class=\"pt-sm\">Schlagw\u00f6rter: <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/cloud-native-application\/\">cloud-native application<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/containers\/\">containers<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/docker\/\">docker<\/a>, <a href=\"https:\/\/blog.zhaw.ch\/icclab\/tag\/process-management\/\">process management<\/a><br><\/div>","protected":false},"excerpt":{"rendered":"<p>In the context of the Cloud Native Applications (CNA) Seed Project we are working on migrating an open source CRM application into to the cloud. After enabling horizontal scalabilty of the original application and moving it onto our OpenStack cloud with the help of CoreOS (etcd, fleet) and docker we&#8217;ve now just finished adding the [&hellip;]<\/p>\n","protected":false},"author":174,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1,5],"tags":[558,609,484,610],"features":[],"class_list":["post-8245","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-articles","tag-cloud-native-application","tag-containers","tag-docker","tag-process-management"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.2 (Yoast SEO v27.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Process Management in Docker Containers - Service Engineering (ICCLab &amp; SPLab)<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Process Management in Docker Containers\" \/>\n<meta property=\"og:description\" content=\"In the context of the Cloud Native Applications (CNA) Seed Project we are working on migrating an open source CRM application into to the cloud. After enabling horizontal scalabilty of the original application and moving it onto our OpenStack cloud with the help of CoreOS (etcd, fleet) and docker we&#8217;ve now just finished adding the [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/\" \/>\n<meta property=\"og:site_name\" content=\"Service Engineering (ICCLab &amp; SPLab)\" \/>\n<meta property=\"article:published_time\" content=\"2015-06-09T11:54:33+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2015-06-09T12:21:22+00:00\" \/>\n<meta name=\"author\" content=\"bloe\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"bloe\" \/>\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:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/\"},\"author\":{\"name\":\"bloe\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c4a5e402c3db722df260fc6accc8841e\"},\"headline\":\"Process Management in Docker Containers\",\"datePublished\":\"2015-06-09T11:54:33+00:00\",\"dateModified\":\"2015-06-09T12:21:22+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/\"},\"wordCount\":1194,\"commentCount\":1,\"keywords\":[\"cloud-native application\",\"containers\",\"docker\",\"process management\"],\"articleSection\":[\"*.*\",\"Articles\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/\",\"name\":\"Process Management in Docker Containers - Service Engineering (ICCLab &amp; SPLab)\",\"isPartOf\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\"},\"datePublished\":\"2015-06-09T11:54:33+00:00\",\"dateModified\":\"2015-06-09T12:21:22+00:00\",\"author\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c4a5e402c3db722df260fc6accc8841e\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/blog.zhaw.ch\/icclab\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Process Management in Docker Containers\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#website\",\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/\",\"name\":\"Service Engineering (ICCLab &amp; SPLab)\",\"description\":\"A Blog of the ZHAW Zurich University of Applied Sciences\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c4a5e402c3db722df260fc6accc8841e\",\"name\":\"bloe\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/b0ec3ebe7131600d8d18bc8eac192fe4ba39e8120f6c5efbddd86db96e383ff4?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/b0ec3ebe7131600d8d18bc8eac192fe4ba39e8120f6c5efbddd86db96e383ff4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/b0ec3ebe7131600d8d18bc8eac192fe4ba39e8120f6c5efbddd86db96e383ff4?s=96&d=mm&r=g\",\"caption\":\"bloe\"},\"url\":\"https:\/\/blog.zhaw.ch\/icclab\/author\/bloe\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Process Management in Docker Containers - Service Engineering (ICCLab &amp; SPLab)","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:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/","og_locale":"en_US","og_type":"article","og_title":"Process Management in Docker Containers","og_description":"In the context of the Cloud Native Applications (CNA) Seed Project we are working on migrating an open source CRM application into to the cloud. After enabling horizontal scalabilty of the original application and moving it onto our OpenStack cloud with the help of CoreOS (etcd, fleet) and docker we&#8217;ve now just finished adding the [&hellip;]","og_url":"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/","og_site_name":"Service Engineering (ICCLab &amp; SPLab)","article_published_time":"2015-06-09T11:54:33+00:00","article_modified_time":"2015-06-09T12:21:22+00:00","author":"bloe","twitter_card":"summary_large_image","twitter_misc":{"Written by":"bloe","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/#article","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/"},"author":{"name":"bloe","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c4a5e402c3db722df260fc6accc8841e"},"headline":"Process Management in Docker Containers","datePublished":"2015-06-09T11:54:33+00:00","dateModified":"2015-06-09T12:21:22+00:00","mainEntityOfPage":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/"},"wordCount":1194,"commentCount":1,"keywords":["cloud-native application","containers","docker","process management"],"articleSection":["*.*","Articles"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/","url":"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/","name":"Process Management in Docker Containers - Service Engineering (ICCLab &amp; SPLab)","isPartOf":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#website"},"datePublished":"2015-06-09T11:54:33+00:00","dateModified":"2015-06-09T12:21:22+00:00","author":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c4a5e402c3db722df260fc6accc8841e"},"breadcrumb":{"@id":"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.zhaw.ch\/icclab\/process-management-in-docker-containers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/blog.zhaw.ch\/icclab\/"},{"@type":"ListItem","position":2,"name":"Process Management in Docker Containers"}]},{"@type":"WebSite","@id":"https:\/\/blog.zhaw.ch\/icclab\/#website","url":"https:\/\/blog.zhaw.ch\/icclab\/","name":"Service Engineering (ICCLab &amp; SPLab)","description":"A Blog of the ZHAW Zurich University of Applied Sciences","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.zhaw.ch\/icclab\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.zhaw.ch\/icclab\/#\/schema\/person\/c4a5e402c3db722df260fc6accc8841e","name":"bloe","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/b0ec3ebe7131600d8d18bc8eac192fe4ba39e8120f6c5efbddd86db96e383ff4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/b0ec3ebe7131600d8d18bc8eac192fe4ba39e8120f6c5efbddd86db96e383ff4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b0ec3ebe7131600d8d18bc8eac192fe4ba39e8120f6c5efbddd86db96e383ff4?s=96&d=mm&r=g","caption":"bloe"},"url":"https:\/\/blog.zhaw.ch\/icclab\/author\/bloe\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/8245","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/users\/174"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/comments?post=8245"}],"version-history":[{"count":12,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/8245\/revisions"}],"predecessor-version":[{"id":8260,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/posts\/8245\/revisions\/8260"}],"wp:attachment":[{"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/media?parent=8245"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/categories?post=8245"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/tags?post=8245"},{"taxonomy":"features","embeddable":true,"href":"https:\/\/blog.zhaw.ch\/icclab\/wp-json\/wp\/v2\/features?post=8245"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}