<?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>Forem: Davinder</title>
    <description>The latest articles on Forem by Davinder (@idevkamboj).</description>
    <link>https://forem.com/idevkamboj</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%2F204967%2F1be8ae40-9e2d-46b8-88e5-d01a7c90e4a3.jpg</url>
      <title>Forem: Davinder</title>
      <link>https://forem.com/idevkamboj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/idevkamboj"/>
    <language>en</language>
    <item>
      <title>Automate Nginx conf file validation using Docker</title>
      <dc:creator>Davinder</dc:creator>
      <pubDate>Wed, 04 Dec 2019 10:00:00 +0000</pubDate>
      <link>https://forem.com/idevkamboj/validate-nginx-conf-file-using-docker-ki4</link>
      <guid>https://forem.com/idevkamboj/validate-nginx-conf-file-using-docker-ki4</guid>
      <description>&lt;p&gt;Nginx is an open-source web server, HTTP cache, reverse proxy server, and load balancer and is used by over 50% of the world’s busiest websites. And Docker with Nginx is a perfect combination to automate your app deployment.&lt;/p&gt;

&lt;p&gt;Automated testing is an integral part of CI/CD pipelines. It would be nice to have one more check for the Nginx config file.&lt;/p&gt;

&lt;p&gt;Automating Nginx configuration file validation using docker.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;$pwd&lt;/span&gt;/config:/data/ &lt;span class="nt"&gt;--name&lt;/span&gt; check-nginx-conf &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; stdout nginx:latest nginx &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; /data/nginx.conf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h1&gt;
  
  
  What’s happing here:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;-v $pwd/config:/data/&lt;/strong&gt; : bind your &lt;strong&gt;$pwd/config&lt;/strong&gt; to &lt;strong&gt;/data&lt;/strong&gt; inside the container. Make sure you have nginx.conf inside config folder and other directories that your config file is using ext SSL folder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;—name check-nginx-conf&lt;/strong&gt; : Name of the container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;-t -a stdout&lt;/strong&gt; : Attach to standard stream stdout to get the logs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nginx:latest&lt;/strong&gt; : Nginx Image version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nginx -t -c&lt;/strong&gt; : &lt;strong&gt;-t&lt;/strong&gt; to validate the config file and &lt;strong&gt;-c&lt;/strong&gt; to use an alternative configuration file instead of a default file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your should see this output if your config is valid&lt;a href="///static/ab2c6b9b4471c5888a7a2018b560e004/bf492/nginx-conf-valid.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q8DArHEX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://devkamboj.in/static/ab2c6b9b4471c5888a7a2018b560e004/913fc/nginx-conf-valid.png" alt="nginx-conf-valid-output" title="nginx-conf-valid-output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Further, you could use grep command to check if &lt;strong&gt;test is successful&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nv"&gt;$pwd&lt;/span&gt;/config:/data/ &lt;span class="nt"&gt;--name&lt;/span&gt; check-nginx-conf &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; stdout nginx:latest nginx &lt;span class="nt"&gt;-t&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; /data/nginx.conf | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"test is successful"&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;grep &lt;strong&gt;“test is successful”&lt;/strong&gt; will return the line which contains &lt;strong&gt;test is successful&lt;/strong&gt; and &lt;strong&gt;wc -l&lt;/strong&gt; to count the number of lines.&lt;/p&gt;

&lt;p&gt;if the syntax is valid, you will get 1 otherwise 0&lt;/p&gt;

</description>
      <category>docker</category>
      <category>nginx</category>
      <category>devops</category>
    </item>
    <item>
      <title>Access Docker Using Rest API</title>
      <dc:creator>Davinder</dc:creator>
      <pubDate>Mon, 05 Aug 2019 12:46:39 +0000</pubDate>
      <link>https://forem.com/idevkamboj/access-docker-using-rest-api-pi</link>
      <guid>https://forem.com/idevkamboj/access-docker-using-rest-api-pi</guid>
      <description>&lt;p&gt;Most of the time we use Docker CLI to manage Docker Objects such as containers, images, volumes, and networks. But we Also can use Rest API to Manage Docker objects.&lt;/p&gt;

&lt;p&gt;Originally published at &lt;a href="https://devkamboj.in"&gt;https://devkamboj.in&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Docker CLI also uses the Docker rest API to manage Objects. As you can see in the above image. But it is also possible to use the Rest API Directly.&lt;/p&gt;

&lt;p&gt;The Docker daemon can listen for Docker Engine API requests via three different types of Socket: &lt;strong&gt;unix&lt;/strong&gt;, &lt;strong&gt;tcp&lt;/strong&gt;, and &lt;strong&gt;fd&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;By Default, unix socket is enabled. This does not help if you want to access the Docker Rest API remotely. Because unix socket works for exchanging data between processes executing on the same host operating system.&lt;br&gt;
If you need to access the Docker daemon remotely, you need to enable the TCP Socket.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dockerd &lt;span class="nt"&gt;-H&lt;/span&gt; tcp://0.0.0.0:2375
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can listen on port 2375 on all network interfaces with -H tcp://0.0.0.0:2375&lt;/p&gt;

&lt;h3&gt;
  
  
  There is also another way by using &lt;strong&gt;systemd&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /lib/systemd/system
vi docker.service
&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/dockerd &lt;span class="nt"&gt;-H&lt;/span&gt; fd:// &lt;span class="nt"&gt;-H&lt;/span&gt; tcp://0.0.0.0:2375
&lt;span class="c"&gt;#just add -H tcp://0.0.0.0:2375 and restart docker&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Now you can start using the api&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; GET http://ip:4243/containers/json
&lt;span class="o"&gt;[{&lt;/span&gt;
  &lt;span class="s2"&gt;"Id"&lt;/span&gt;:&lt;span class="s2"&gt;"fff8c7927e19d5a7da280424a09572729641137a8f42e116c3073c72da2978d3"&lt;/span&gt;,
 &lt;span class="s2"&gt;"Names"&lt;/span&gt;:[&lt;span class="s2"&gt;"/rockey"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
  &lt;span class="s2"&gt;"Image"&lt;/span&gt;:&lt;span class="s2"&gt;"busybox"&lt;/span&gt;,
  ...
&lt;span class="o"&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;But if you do not want to access Rest API remotely then you do not need to enable TCP. Then you can just use unix socket.&lt;/p&gt;

&lt;h3&gt;
  
  
  List containers that are running same like &lt;strong&gt;docker ps&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;--unix-socket&lt;/span&gt; /var/run/docker.sock http:/v1.24/containers/json
&lt;span class="o"&gt;[{&lt;/span&gt;
  &lt;span class="s2"&gt;"Id"&lt;/span&gt;:&lt;span class="s2"&gt;"ae63e8b89a26f01f6b4b2c9a7817c31a1b6196acf560f66586fbc8809ffcd772"&lt;/span&gt;,
  &lt;span class="s2"&gt;"Names"&lt;/span&gt;:[&lt;span class="s2"&gt;"/tender_wing"&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;,
  &lt;span class="s2"&gt;"Image"&lt;/span&gt;:&lt;span class="s2"&gt;"bfirsh/reticulate-splines"&lt;/span&gt;,
  ...
&lt;span class="o"&gt;}]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;You can use Python and Go as well here is the Example:&lt;/p&gt;

&lt;h3&gt;
  
  
  Python
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;docker&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;docker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;from_env&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;containers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
  &lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Go
&lt;/h3&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/docker/docker/api/types"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/docker/docker/api/types/container"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/docker/docker/pkg/stdcopy"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/docker/docker/client"&lt;/span&gt;
    &lt;span class="s"&gt;"golang.org/x/net/context"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewClientWithOpts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromEnv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithAPIVersionNegotiation&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImagePull&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"docker.io/library/alpine"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ImagePullOptions&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainerCreate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;Image&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"alpine"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;Cmd&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"echo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"hello world"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;Tty&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainerStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainerStartOptions&lt;/span&gt;&lt;span class="p"&gt;{});&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;statusCh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;errCh&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainerWait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;container&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WaitConditionNotRunning&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;errCh&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;statusCh&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainerLogs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;types&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContainerLogsOptions&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;ShowStdout&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;stdcopy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StdCopy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;There are a number of libraries available for other languages.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;libdocker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C#&lt;/td&gt;
&lt;td&gt;Docker.DotNet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;lasote/docker_client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dart&lt;/td&gt;
&lt;td&gt;bwu_docker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Erlang&lt;/td&gt;
&lt;td&gt;erldocker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gradle&lt;/td&gt;
&lt;td&gt;gradle-docker-plugin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Groovy&lt;/td&gt;
&lt;td&gt;docker-client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Haskell&lt;/td&gt;
&lt;td&gt;docker-hs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HTML (Web Components)&lt;/td&gt;
&lt;td&gt;docker-elements&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;docker-client&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;docker-java&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;docker-java-api&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NodeJS&lt;/td&gt;
&lt;td&gt;dockerode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NodeJS&lt;/td&gt;
&lt;td&gt;harbor-master&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perl&lt;/td&gt;
&lt;td&gt;Eixo::Docker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP&lt;/td&gt;
&lt;td&gt;Docker-PHP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ruby&lt;/td&gt;
&lt;td&gt;docker-api&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;docker-rust&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;shiplift&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scala&lt;/td&gt;
&lt;td&gt;tugboat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scala&lt;/td&gt;
&lt;td&gt;reactive-docker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Swift&lt;/td&gt;
&lt;td&gt;docker-client-swift&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Now you can create your own User Interface by using Docker Rest API. This API could help you in automating stuff for your Apps.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>python</category>
      <category>go</category>
    </item>
    <item>
      <title>JavaScript Parser and Engine</title>
      <dc:creator>Davinder</dc:creator>
      <pubDate>Thu, 01 Aug 2019 08:50:19 +0000</pubDate>
      <link>https://forem.com/idevkamboj/javascript-parser-and-engine-3c1c</link>
      <guid>https://forem.com/idevkamboj/javascript-parser-and-engine-3c1c</guid>
      <description>&lt;p&gt;In this article, I will just very quickly tell you. How the JavaScript codes that we write is actually executed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devkamboj.in/javascriptEnginesAndParsing/"&gt;Originally posted at&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, JavaScript is always hosted in some environment. And that is most typically a browser such a Google Chrome, Firefox, Safari, etc. This is where JavaScript runs. There can also be other hosts such as the NodeJS web server, or even some applications that accept JavaScript code as input. However, I will just focus on the browser in this Article.&lt;/p&gt;

&lt;p&gt;So when we write our JavaScript code and actually want to run it, there’s a lot of stuff happening behind the scenes. So what happens is that the host where JavaScript is hosted has some kind of JavaScript engine that takes our code and executes it. So in very simple terms, a JavaScript engine is a program that executes JavaScript code. There are many different engines out there, like&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://v8.dev/?source=post_page"&gt;Google’s V8&lt;/a&gt; engine, that is used in Google Chrome.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey?source=post_page"&gt;SpiderMonkey&lt;/a&gt; is Mozilla’s JavaScript engine&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://en.wikipedia.org/wiki/JavaScript_engine?source=post_page"&gt;JavaScriptCore&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/List_of_ECMAScript_engines?source=post_page---------------------------"&gt;many more&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now, the first thing that happens inside the engine, is that our code is parsed by a parser, which basically reads our code line by line, and checks if the syntax of the code that we gave it, is correct. So this means that the parser knows the JavaScript rules and how it has to be written in order to be correct, to be valid. And if you make some mistakes, it basically throws an error and stops the execution.&lt;/p&gt;

&lt;p&gt;&lt;a href="///static/9f96480e9c1dc593ce716091bccdab10/e334e/javascriptParser.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OWlT9ImT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://devkamboj.in/static/9f96480e9c1dc593ce716091bccdab10/e334e/javascriptParser.png" alt="javascriptParser" title="javascriptParser"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If everything is correct though, then the parser produces a data structure known as the Abstract Syntax Tree, which is then translated into machine code. So this code is no longer JavaScript code, but a code, or let’s say a set of instructions, that can be executed directly by the computer’s processor. And it’s only when our code already converted to machine code, actually runs and does its work.&lt;/p&gt;

&lt;p&gt;&lt;a href="///static/9d5ffc27e5c0a859e9cf4b183fc897c2/e334e/javascriptEngine1.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Un4TVTvP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://devkamboj.in/static/9d5ffc27e5c0a859e9cf4b183fc897c2/e334e/javascriptEngine1.png" alt="javascriptEngine1" title="javascriptEngine1"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I just want you to get the basic idea of what actually happens once we choose to run our code. And there is actually way more going on behind the scenes. And different engines do things in a slightly different way.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Secure Docker : Enable Docker Content Trust</title>
      <dc:creator>Davinder</dc:creator>
      <pubDate>Thu, 01 Aug 2019 08:22:47 +0000</pubDate>
      <link>https://forem.com/idevkamboj/care-about-security-enable-docker-content-trust-4djh</link>
      <guid>https://forem.com/idevkamboj/care-about-security-enable-docker-content-trust-4djh</guid>
      <description>&lt;p&gt;I love Docker and Security so I thought why not write about Docker Content Trust. so here you go...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devkamboj.in/ContentTrustInDocker/"&gt;Originally posted at&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docker Content Trust allows you to have an image&lt;br&gt;
signing so you can make sure that you're&lt;br&gt;
not running arbitrary code you're&lt;br&gt;
actually running the code that you wanted&lt;br&gt;
to run in the first place.&lt;/p&gt;

&lt;p&gt;When Docker trust is Enabled And publisher pushes the image to a remote registry, Docker Engine signs the image locally with the publisher’s private key. When someone pulls this image, Docker uses the publisher’s public key to verify the image integrity and checks image is exactly what the publisher created, has not been tampered with, and is up to date.&lt;/p&gt;
&lt;h2&gt;
  
  
  Enabling Content Trust
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Enable via Environment Variable
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOCKER_CONTENT_TRUST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Or CLI Flag:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; docker pull &lt;span class="nt"&gt;--disable-content-trust&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;false &lt;/span&gt;mongo:tag
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;As soon as you enable docker content trust using Environment Variable&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOCKER_CONTENT_TRUST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Every docker single docker operation is secure like&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;docker push&lt;/li&gt;
&lt;li&gt;docker run &lt;/li&gt;
&lt;li&gt;docker pull&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every single operation is now gonna have to operate on the signature. if you try to run unsigned image docker will not allow you.&lt;/p&gt;

&lt;p&gt;If you are creating a docker image of your application and pushing it to Repository and pull it over the network. Then you should enable content trust.&lt;/p&gt;

&lt;h4&gt;
  
  
  Steps to Sign Docker Images.
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;enable docker content trust
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;    &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOCKER_CONTENT_TRUST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Push image
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; docker push  &lt;span class="o"&gt;[&lt;/span&gt;yourImage:tag]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;If you are doing it first time it will generate &lt;strong&gt;root key&lt;/strong&gt;, &lt;strong&gt;repo key&lt;/strong&gt; and other keys.&lt;em&gt;(By default this is stored in ~/.docker/trust/)&lt;/em&gt;. you need to enter the passphrase for &lt;strong&gt;root key&lt;/strong&gt; and &lt;strong&gt;repo key&lt;/strong&gt;. After giving the passphrase it will push the signed image.&lt;/p&gt;

&lt;p&gt;You should back up the root key somewhere safe. Given that it is only required to create new repositories, it is a good idea to store it offline in hardware.&lt;br&gt;
  &lt;a href="https://docs.docker.com/engine/security/trust/trust_key_mng/"&gt;manage keys for DCT.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From now on docker push operation will prompt you to enter the passphrase of your repo. if the content trust is enabled. but this can be automated.&lt;/p&gt;
&lt;h2&gt;
  
  
  Automation with content trust
&lt;/h2&gt;

&lt;p&gt;Most of the time we build our images using the automation system. To enable content trust on our automation system we can use the Environment variable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;DOCKER_CONTENT_TRUST_REPOSITORY_PASSPHRASE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"strongpassword"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;if you use this variable then you do not need to enter the passphrase every time.&lt;/p&gt;

&lt;p&gt;Docker Content Trust is available in Docker CS Engine 1.9.0 and Docker EE. May be Docker content trust will be enabled by default in the future. &lt;/p&gt;

</description>
      <category>docker</category>
      <category>devops</category>
      <category>security</category>
      <category>privacy</category>
    </item>
    <item>
      <title>What Is Container Orchestration?</title>
      <dc:creator>Davinder</dc:creator>
      <pubDate>Tue, 30 Apr 2019 10:00:00 +0000</pubDate>
      <link>https://forem.com/idevkamboj/what-is-container-orchestration-52ab</link>
      <guid>https://forem.com/idevkamboj/what-is-container-orchestration-52ab</guid>
      <description>&lt;p&gt;Container orchestration is a process that automates the deployment, management, scaling, networking, and availability of container-based applications&lt;/p&gt;

&lt;p&gt;&lt;a href="/static/2f310240973323d7b5b30c088bd26143/47007/dockerHost.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevkamboj.in%2Fstatic%2F2f310240973323d7b5b30c088bd26143%2F47007%2FdockerHost.png" title="dockerHost" alt="dockerHost"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your application relies on other containers such as databases or messaging services or other backend services? What if the number of users increases and you need to scale your application? How do you scale down when the load decreases? To enable these functionalities, you need an underlying platform with a set of resources and capabilities. The platform needs to orchestrate the connectivity between the containers and automatically scale up or down based on the load. This whole process of automatically deploying and managing containers is known as Container Orchestration. Kubernetes is just a container orchestration technology. There are multiple such technologies available today. Docker has its own tool called &lt;strong&gt;Docker Swarm&lt;/strong&gt; , &lt;strong&gt;Kubernetes from Google&lt;/strong&gt; and &lt;strong&gt;MESOS from Apache&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="/static/3dc1f41a3aa2eed01ff1a2c50c7dd064/e334e/orchestrationTechnologies.png"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdevkamboj.in%2Fstatic%2F3dc1f41a3aa2eed01ff1a2c50c7dd064%2Fe334e%2ForchestrationTechnologies.png" title="orchestrationTechnologies" alt="orchestrationTechnologies"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While &lt;a href="https://docs.docker.com/swarm/overview/?source=post_page" rel="noopener noreferrer"&gt;Docker Swarm&lt;/a&gt; is really easy to set up and get started, it lacks some of the advanced features required for complex applications.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://mesos.apache.org/?source=post_page#what-is-mesos-a-distributed-systems-kernel" rel="noopener noreferrer"&gt;MESOS&lt;/a&gt;, on the other hand, is quite difficult to set up and get started but supports many advanced features.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kubernetes.io/?source=post_page" rel="noopener noreferrer"&gt;Kubernetes&lt;/a&gt; arguably the most popular of it all, is a bit difficult to set up and get started by provides a lot of options to customize deployments and supports the deployment of complex architectures. Kubernetes is now supported on all public cloud service providers like GCP, Azure, AWS, and Kubernetes project is one of the top-ranked projects in Github.&lt;/p&gt;

&lt;p&gt;There are various advantages of Container Orchestration: Your application is now highly available as hardware failures to not bring your application down because we have multiple instances of your application running on different nodes.&lt;/p&gt;

&lt;p&gt;The user traffic is load balanced across the various containers. When demand increases, deploy more instances of the applications seamlessly and within a matter of seconds. And we have the ability to do that at a service level when we run out of hardware resources, scale the number of underlying nodes up or down without having to take down the application and do all of these easily with a set of declarative object configuration files. And that is Kubernetes. It is a container orchestration technology used to orchestrate the deployment and management of hundreds and thousands of containers in a clustered environment.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>kubernetes</category>
      <category>mesos</category>
    </item>
  </channel>
</rss>
