<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Evgeny Kolyakov</title>
    <description>The latest articles on DEV Community by Evgeny Kolyakov (@freaker2k7).</description>
    <link>https://dev.to/freaker2k7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F202903%2F0120d5d3-266d-49ee-8012-dd5c0160c4f1.jpeg</url>
      <title>DEV Community: Evgeny Kolyakov</title>
      <link>https://dev.to/freaker2k7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/freaker2k7"/>
    <language>en</language>
    <item>
      <title>DockerServer - Running docker containers from a remote machine in a simple &amp; a secure way.

</title>
      <dc:creator>Evgeny Kolyakov</dc:creator>
      <pubDate>Sun, 28 Jul 2019 18:51:24 +0000</pubDate>
      <link>https://dev.to/freaker2k7/new-super-lightweight-simple-restful-stateless-server-for-running-docker-containers-on-a-remote-machine-s-in-a-secure-way-40f1</link>
      <guid>https://dev.to/freaker2k7/new-super-lightweight-simple-restful-stateless-server-for-running-docker-containers-on-a-remote-machine-s-in-a-secure-way-40f1</guid>
      <description>&lt;h1&gt;
  
  
  DockerServer
&lt;/h1&gt;

&lt;p&gt;Super lightweight &amp;amp; simple RESTFul stateless server for running &lt;a href="https://docker.com/" rel="noopener noreferrer"&gt;docker&lt;/a&gt; containers on a remote machine(s) in a secure way.&lt;/p&gt;

&lt;center&gt;
  &lt;a href="https://dockerserver.io/" title="DockerServer Logo" rel="noopener noreferrer"&gt;
    &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2F14Cypln.png" alt="DockerServer Logo" title="DockerServer Logo"&gt;
  &lt;/a&gt;
&lt;/center&gt;

&lt;p&gt;&lt;a href="https://badge.fury.io/js/docker-server" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbadge.fury.io%2Fjs%2Fdocker-server.svg" alt="npm version"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/docker-server" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fnode%2Fv%2Fdocker-server" alt="node version"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.npmjs.com/package/docker-server" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fnpm%2Fdw%2Fdocker-server.svg" alt="npm downloads"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://gitter.im/freaker2k7-dockerserver/community?utm_source=badge&amp;amp;utm_medium=badge&amp;amp;utm_campaign=pr-badge" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbadges.gitter.im%2Ffreaker2k7-dockerserver%2Fcommunity.svg" alt="Gitter"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://lgtm.com/projects/g/freaker2k7/dockerserver/alerts/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Flgtm%2Falerts%2Fg%2Ffreaker2k7%2Fdockerserver.svg%3Flogo%3Dlgtm%26logoWidth%3D18" alt="Total alerts"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://lgtm.com/projects/g/freaker2k7/dockerserver/context:javascript" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Flgtm%2Fgrade%2Fjavascript%2Fg%2Ffreaker2k7%2Fdockerserver.svg%3Flogo%3Dlgtm%26logoWidth%3D18" alt="Language grade: JavaScript"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://scrutinizer-ci.com/g/freaker2k7/dockerserver/?branch=master" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fscrutinizer-ci.com%2Fg%2Ffreaker2k7%2Fdockerserver%2Fbadges%2Fquality-score.png%3Fb%3Dmaster" alt="Scrutinizer Code Quality"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://opensource.org/licenses/Apache-2.0" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbadge%2Flicense-Apache-brightgreen.svg" alt="License"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://bundlephobia.com/result?p=docker-server" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fbundlephobia%2Fminzip%2Fdocker-server" alt="Bungle size"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/freaker2k7/dockerserver" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Frepo-size%2Ffreaker2k7%2Fdockerserver" alt="Repo size"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://ci.appveyor.com/project/freaker2k7/dockerserver/branch/master" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fci.appveyor.com%2Fapi%2Fprojects%2Fstatus%2Frwbo4jvqp4032boj%2Fbranch%2Fmaster%3Fsvg%3Dtrue" alt="Build status"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://snyk.io//test/github/freaker2k7/dockerserver" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsnyk.io%2F%2Ftest%2Fgithub%2Ffreaker2k7%2Fdockerserver%2Fbadge.svg%3FtargetFile%3Dpackage.json" alt="Known Vulnerabilities"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://beerpay.io/freaker2k7/dockerserver" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbeerpay.io%2Ffreaker2k7%2Fdockerserver%2Fbadge.svg%3Fstyle%3Dflat" alt="Beerpay"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://liberapay.com/evgy/" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fimg.shields.io%2Fliberapay%2Freceives%2Fevgy.svg%3Flogo%3Dliberapay" alt="Liberapay"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npm i -g docker-server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker run -d -p 1717:1717 --restart=always --name=docker-server -v /var/run/docker.sock:/var/run/docker.sock -e "DS_TOKEN=my_secret_token" evgy/dockerserver&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;I needed to run a couple of containers on a remote machine and came to these conclusions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kubernetes is an overkill !&lt;/li&gt;
&lt;li&gt;docker-machine is also complicated !&lt;/li&gt;
&lt;li&gt;I just want to run a few containers on a remote machine.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Approach
&lt;/h2&gt;

&lt;p&gt;Built a small REST server with NodeJS, using the &lt;code&gt;express&lt;/code&gt; and &lt;code&gt;docker-cli-js&lt;/code&gt; packages as a base.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design Principles
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keep the business logic &lt;strong&gt;simple&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;It must be &lt;strong&gt;stateless&lt;/strong&gt;!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; is (a) present.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Current architecture
&lt;/h3&gt;

&lt;center&gt;
  &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.imgur.com%2F1LqU37z.png" alt="How things work today"&gt;&lt;br&gt;
  The cluster diagram demonstrates a PUT request.
&lt;/center&gt;

&lt;h4&gt;
  
  
  Notes for the Cluster Mode:
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;*0 - Connection between the load balancer and the docker-server.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;*1 - Save the machine load to a &lt;a href="https://json.org" rel="noopener noreferrer"&gt;JSON&lt;/a&gt; file in a shared folder (among all the machines).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PUT method&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;1 - Requests comes to any free (according to the load balancer) node to answer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;2 - Get the most free (according to actual cpu-mem ratio) node (from the shared storage).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;3 - Resend the current request to that node (or process if it's the current node) and return the answer.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For the rest of the methods&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Resent the current request to all the nodes and return the merged results.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage
&lt;/h2&gt;

&lt;p&gt;Install DockerServer on the machine that you want to run your containers.&lt;/p&gt;

&lt;p&gt;DockerServer can be run for a single session with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ docker-server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;or as a service using &lt;a href="https://pm2.keymetrics.io/" rel="noopener noreferrer"&gt;PM2&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ pm2 start /usr/lib/node_modules/docker-server/pm2.config.js&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;and if you want in addition to start it on startup just run:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ pm2 startup&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And of-course, as mentioned before, but using params, via docker itself:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ docker run -d -p 1717:1717 --restart=always --name=docker-server -v /var/run/docker.sock:/var/run/docker.sock evgy/dockerserver docker-server --token my_secret_token&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or you can run in &lt;strong&gt;HTTPS&lt;/strong&gt; mode:&lt;/p&gt;

&lt;p&gt;(Note that in this example I'm using &lt;a href="https://letsencrypt.org/" rel="noopener noreferrer"&gt;Let's Encrypt&lt;/a&gt; and I'm using &lt;code&gt;readlink&lt;/code&gt; because these files are symbolic links)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ docker run -d -p 443:1717 --privileged --restart=always --name=docker-server -v /var/run/docker.sock:/var/run/docker.sock &lt;br&gt;
-v $(readlink -f /home/user/letsencrypt/config/live/your-domain.com/cert.pem):/certs/cert.pem:ro &lt;br&gt;
-v $(readlink -f /home/user/letsencrypt/config/live/your-domain.com/chain.pem):/certs/chain.pem:ro &lt;br&gt;
-v $(readlink -f /home/user/letsencrypt/config/live/your-domain.com/privkey.pem):/certs/privkey.pem:ro &lt;br&gt;
evgy/dockerserver docker-server --token my_secret_token --https&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note: The &lt;strong&gt;--privileged&lt;/strong&gt; argument is only needed in order to use the 443 port, because all ports below 1024 are reserved by root.&lt;/p&gt;

&lt;p&gt;Moreover, you can run in a &lt;strong&gt;Cluster mode&lt;/strong&gt; when you have a couple of machines to use:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ docker run -d -p 1717:1717 --privileged --restart=always --name=docker-server -v /var/run/docker.sock:/var/run/docker.sock &lt;br&gt;
-v /some/shared/folder:/my/somewhy/custom/path evgy/dockerserver docker-server --token my_secret_token --cluster --folder /my/somewhy/custom/path&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or simply:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ docker run -d -p 1717:1717 --privileged --restart=always --name=docker-server -v /var/run/docker.sock:/var/run/docker.sock &lt;br&gt;
-v /some/shared/folder:/tmp/docker-server evgy/dockerserver docker-server --token my_secret_token --cluster&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Note: &lt;code&gt;/tmp/docker-server&lt;/code&gt; is the default folder so you can easily and safely run it even without docker.&lt;/p&gt;

&lt;p&gt;Now, you can do "remote" docker operation using simple HTTP requests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;HTTP Method&lt;/th&gt;
    &lt;th&gt;Endpoint&lt;/th&gt;
    &lt;th&gt;Desc.&lt;/th&gt;
    &lt;th&gt;Docker cmd&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;GET&lt;/td&gt;
    &lt;td&gt;/&lt;/td&gt;
    &lt;td&gt;List all the containers&lt;/td&gt;
    &lt;td&gt;docker ps -a&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;GET&lt;/td&gt;
    &lt;td&gt;/:id&lt;/td&gt;
    &lt;td&gt;Show the logs of a specific container&lt;/td&gt;
    &lt;td&gt;docker logs :id&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;PUT&lt;/td&gt;
    &lt;td&gt;/&lt;/td&gt;
    &lt;td&gt;Run a container&lt;/td&gt;
    &lt;td&gt;docker run...&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;POST&lt;/td&gt;
    &lt;td&gt;/:id&lt;/td&gt;
    &lt;td&gt;Execute a command in a container&lt;/td&gt;
    &lt;td&gt;docker exec...&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;DELETE&lt;/td&gt;
    &lt;td&gt;/:id&lt;/td&gt;
    &lt;td&gt;Delete a container with such a name or an ID&lt;/td&gt;
    &lt;td&gt;docker rm -f :id&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  Options
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Environment
&lt;/h3&gt;

&lt;p&gt;You can set the following environment variables to configure DockerServer:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;Environment Var.&lt;/th&gt;
    &lt;th&gt;Desc.&lt;/th&gt;
    &lt;th&gt;Default&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;DS_PORT&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;The port on which the DockerServer is running&lt;/td&gt;
    &lt;td&gt;1717&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;DS_TOKEN&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;The secret token for the authorization&lt;/td&gt;
    &lt;td&gt;xxxxxx&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Parameters
&lt;/h3&gt;

&lt;p&gt;Also, you can start DockerServerwith these parameters:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;Param&lt;/th&gt;
    &lt;th&gt;Desc.&lt;/th&gt;
    &lt;th&gt;Default&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--port [num]&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;The port on which the DockerServer is running&lt;/td&gt;
    &lt;td&gt;1717&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--token [string]&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;The secret token for the authorization&lt;/td&gt;
    &lt;td&gt;xxxxxx&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--low_burst [num]&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;Max number of requests per minute for Low burst.&lt;/td&gt;
    &lt;td&gt;60&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--mid_burst [num]&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;Max number of requests per minute for Mid burst.&lt;/td&gt;
    &lt;td&gt;180&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--high_burst [num]&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;Max number of requests per minute for High burst.&lt;/td&gt;
    &lt;td&gt;300&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--https&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;
      Enable &lt;b&gt;HTTPS&lt;/b&gt; mode.&lt;br&gt;
      For this you must have the following files:&lt;br&gt;
            a. /certs/cert.pem&lt;br&gt;
            b. /certs/privkey.pem&lt;br&gt;
            c. /certs/chain.pem (optional, to support self-signed certs)
    &lt;/td&gt;
    &lt;td&gt;false&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--cluster&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;Enable &lt;b&gt;Cluster&lt;/b&gt; mode.&lt;/td&gt;
    &lt;td&gt;false&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--folder [path]&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;Shared folder between all docker-servers. (Used only in cluster mode)&lt;/td&gt;
    &lt;td&gt;/tmp/docker-server&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--cache_interval [num]&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;Milliseconds between reads (of all the machines)&lt;/td&gt;
    &lt;td&gt;3000&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--log_lovel [option]&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;Log level [trace|debug|info|warn|error|fatal]&lt;/td&gt;
    &lt;td&gt;info&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--log_expiry [num]&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;Time for a log to live in days.&lt;/td&gt;
    &lt;td&gt;14&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--log_max_size [num]&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;Max log size in MB&lt;/td&gt;
    &lt;td&gt;25&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--help&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;Show he&lt;/td&gt;
    &lt;td&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;&lt;code&gt;--version&lt;/code&gt;&lt;/td&gt;
    &lt;td&gt;Show current version &lt;/td&gt;
    &lt;td&gt; &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  PUT Data
&lt;/h3&gt;

&lt;p&gt;When sending the PUT request, the following parameters are supported:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;Param&lt;/th&gt;
    &lt;th&gt;Desc.&lt;/th&gt;
    &lt;th&gt;Default&lt;/th&gt;
    &lt;th&gt;Docker cmd&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;image&lt;/td&gt;
    &lt;td&gt;The image for the run. (&lt;b&gt;required&lt;/b&gt;)&lt;/td&gt;
    &lt;td&gt;null&lt;/td&gt;
    &lt;td&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;name&lt;/td&gt;
    &lt;td&gt;The name of the container.&lt;/td&gt;
    &lt;td&gt;uuid4()&lt;/td&gt;
    &lt;td&gt;&lt;code&gt;--name&lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;remove&lt;/td&gt;
    &lt;td&gt;Flag to remove the container when it finishes &lt;code&gt;--rm&lt;/code&gt;
&lt;/td&gt;
    &lt;td&gt;false&lt;/td&gt;
    &lt;td&gt;&lt;code&gt;--rm&lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;detach&lt;/td&gt;
    &lt;td&gt;Flag to detach the container &lt;code&gt;-d&lt;/code&gt;
&lt;/td&gt;
    &lt;td&gt;false&lt;/td&gt;
    &lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;ports&lt;/td&gt;
    &lt;td&gt;
&lt;b&gt;Map&lt;/b&gt; of ports to publish.&lt;/td&gt;
    &lt;td&gt;null&lt;/td&gt;
    &lt;td&gt;&lt;code&gt;-p&lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;volumes&lt;/td&gt;
    &lt;td&gt;
&lt;b&gt;Map&lt;/b&gt; of volumes to mount.&lt;/td&gt;
    &lt;td&gt;null&lt;/td&gt;
    &lt;td&gt;&lt;code&gt;-v&lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;data&lt;/td&gt;
    &lt;td&gt;CMD to run inside the container.&lt;/td&gt;
    &lt;td&gt;null&lt;/td&gt;
    &lt;td&gt; &lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  POST Data
&lt;/h3&gt;

&lt;p&gt;When sending the POST request, the following parameters are supported:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tr&gt;
    &lt;th&gt;Param&lt;/th&gt;
    &lt;th&gt;Desc.&lt;/th&gt;
    &lt;th&gt;Default&lt;/th&gt;
    &lt;th&gt;Docker cmd&lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;data&lt;/td&gt;
    &lt;td&gt;CMD to run inside the container&lt;/td&gt;
    &lt;td&gt;null&lt;/td&gt;
    &lt;td&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;tty&lt;/td&gt;
    &lt;td&gt;Flag to enable TTY mode&lt;/td&gt;
    &lt;td&gt;false&lt;/td&gt;
    &lt;td&gt;&lt;code&gt;-t&lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
    &lt;td&gt;interactive&lt;/td&gt;
    &lt;td&gt;Flag to enable interactive mode&lt;/td&gt;
    &lt;td&gt;false&lt;/td&gt;
    &lt;td&gt;&lt;code&gt;-i&lt;/code&gt;&lt;/td&gt;
  &lt;/tr&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Examples
&lt;/h2&gt;

&lt;p&gt;NOTE: In the examples I assumed you're using the default port.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get a list of all the containers:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;$ curl -X GET http://1.2.3.4:1717/ -H 'Authorization: Basic base64EncodedToken'&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run redis on the remote machine:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;$ curl -X PUT http://1.2.3.4:1717/ -H 'Authorization: Basic base64EncodedToken' --data 'name=p-redis&amp;amp;image=redis&amp;amp;ports[1234]=6379'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And/or&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ curl -X PUT http://1.2.3.4:1717/ -H 'Authorization: Basic base64EncodedToken' --data 'name=v-redis&amp;amp;image=redis&amp;amp;volumes[/tmp/data]=/data'&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Remove our created container(s):&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;$ curl -X DELETE http://1.2.3.4:1717/p-redis -H 'Authorization: Basic base64EncodedToken'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And/or&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ curl -X DELETE http://1.2.3.4:1717/v-redis -H 'Authorization: Basic base64EncodedToken'&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Changelog
&lt;/h2&gt;

&lt;p&gt;1.8.4 - Edited some docs.&lt;/p&gt;

&lt;p&gt;1.8.2 - Added logger.&lt;/p&gt;

&lt;p&gt;1.8.1 - Cashed reading (in cluster mode) &amp;amp; fixed host issue in results (also in cluster mode).&lt;/p&gt;

&lt;p&gt;1.8.0 - &lt;strong&gt;Stable Cluster mode!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/freaker2k7/dockerserver/blob/master/CHANGELOG.md" rel="noopener noreferrer"&gt;See full changelog&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Roadmap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Queue (for heavy loads)&lt;/li&gt;
&lt;li&gt;Autoscaling&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  License
&lt;/h2&gt;

&lt;p&gt;APACHE-2.0 (see the LICENSE files in the repository).&lt;/p&gt;

&lt;h2&gt;
  
  
  Donate
&lt;/h2&gt;

&lt;p&gt;Running dockers is free, but &lt;strong&gt;beer&lt;/strong&gt; is always welcome &lt;a href="https://beerpay.io/freaker2k7/dockerserver" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img alt="Beerpay" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbeerpay.io%2Ffreaker2k7%2Fdockerserver%2Fbadge.svg%3Fstyle%3Dbeer"&gt;&lt;br&gt;
&lt;/a&gt;&lt;br&gt;
or directly donate to our cause &lt;a href="https://liberapay.com/evgy/donate" rel="noopener noreferrer"&gt;&lt;br&gt;
  &lt;img alt="Donate using Liberapay" src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fliberapay.com%2Fassets%2Fwidgets%2Fdonate.svg"&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;

</description>
      <category>docker</category>
      <category>javascript</category>
      <category>node</category>
    </item>
  </channel>
</rss>
