{"id":386765,"date":"2021-12-28T17:43:03","date_gmt":"2021-12-28T14:43:03","guid":{"rendered":"https:\/\/en.buradabiliyorum.com\/10-tools-that-complement-docker-cloudsavvy-it\/"},"modified":"2021-12-28T17:43:03","modified_gmt":"2021-12-28T14:43:03","slug":"10-tools-that-complement-docker-cloudsavvy-it","status":"publish","type":"post","link":"https:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/","title":{"rendered":"#10 Tools That Complement Docker \u2013 CloudSavvy IT"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-6a29bbb3bb508\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #dd3333;color:#dd3333\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #dd3333;color:#dd3333\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-6a29bbb3bb508\" checked aria-label=\"Toggle\" \/><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:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/#Docker_Compose\" >Docker Compose<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/#Portainer\" >Portainer<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/#Kubernetes\" >Kubernetes<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/#Traefik\" >Traefik<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/#Trivy\" >Trivy<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/#Syft\" >Syft<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/#Dive\" >Dive<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/#Flocker\" >Flocker<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/#Dokku\" >Dokku<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/#Hadolint\" >Hadolint<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/buradabiliyorum.com\/en\/10-tools-that-complement-docker-cloudsavvy-it\/#Summary\" >Summary<\/a><\/li><\/ul><\/nav><\/div>\n<p><strong>&#8220;#10 Tools That Complement Docker \u2013 CloudSavvy IT&#8221;<\/strong><\/p>\n<div id=\"article-content-area\">\n<img loading=\"lazy\" decoding=\"async\" class=\"type:primaryImage aligncenter size-full wp-image-9034\" data-pagespeed-lazy-srcset=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/01\/6dc7b5a0.jpeg?width=398&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1 400w, https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/01\/6dc7b5a0.jpeg?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1 1200w\" sizes=\"auto, 400w, 1200w\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/01\/6dc7b5a0.jpeg?width=1198&amp;trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"1602\" height=\"902\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>Docker is the best known containerization platform but it doesn\u2019t exist in isolation. An entire ecosystem of complementary tools and spin-off projects has sprung up around the shift to containers.<\/p>\n<p>Here\u2019s a round-up of 10 open-source analyzers, indexers, and orchestrators that make Docker even more convenient and useful. Whether you\u2019re still early in your Docker journey, or you\u2019re a seasoned practitioner using the tech in production, you might find something here that\u2019s worth including alongside your next project.<\/p>\n<h2 id=\"docker-compose\"><span class=\"ez-toc-section\" id=\"Docker_Compose\"><\/span>Docker Compose<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/docs.docker.com\/compose\">Docker Compose<\/a> is the only tool on this list that\u2019s actually part of Docker. Compose is an accessible way to build \u201cstacks\u201d of Docker containers that you can manage in unison.<\/p>\n<p>The standard Docker CLI lets you interact with individual containers. Compose provides a similar interface for working with containers in aggregate. This makes it possible to easily control systems that require multiple containers, such as an <a href=\"https:\/\/buradabiliyorum.com\/en\/category\/download-scripts-themes-apps\/\" data-internallinksmanager029f6b8e52c=\"9\" title=\"Download Scripts &amp; Themes &amp; Apps\" target=\"_blank\" rel=\"noopener\">app<\/a> server, database, and caching layer. You define these components as services in a <code>docker-compose.yml<\/code> file, then use the <code>docker-compose<\/code> binary to start them all together:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co3\">version<\/span><span class=\"sy2\">: <\/span>3<span class=\"co4\">\nservices<\/span>:<span class=\"co4\">\n  app<\/span>:<span class=\"co3\">\n    image<\/span><span class=\"sy2\">: <\/span>example.com\/example-app:latest<span class=\"co4\">\n    ports<\/span><span class=\"sy2\">:\n<\/span>      - 80:80<span class=\"co4\">\n  database<\/span>:<span class=\"co3\">\n    image<\/span><span class=\"sy2\">: <\/span>mysql:latest<span class=\"co4\">\n    expose<\/span><span class=\"sy2\">:\n<\/span>      - 3306<span class=\"co4\">\n  cache<\/span>:<span class=\"co3\">\n    image<\/span><span class=\"sy2\">: <\/span>redis:latest<span class=\"co4\">\n    expose<\/span><span class=\"sy2\">:\n<\/span>      - 6379<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p>Running <code>docker-compose up -d<\/code> would create three containers, one each for the app, database, and cache services. They\u2019ll be automatically linked together. This is much more manageable than repeating the <code>docker run<\/code> command multiple times.<\/p>\n<h2 id=\"portainer\"><span class=\"ez-toc-section\" id=\"Portainer\"><\/span>Portainer<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/www.portainer.io\">Portainer is<\/a> a GUI for your Docker installation. It\u2019s a browser-based tool that offers a complete interface for viewing, creating, and configuring your containers. You can also interact with other Docker object types such as images, networks, and volumes.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-8919\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/01\/0b17107c.jpeg?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"Portainer's dashboard\" width=\"1268\" height=\"658\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>Portainer is deployed as its own Docker image:<\/p>\n<pre>docker run -d -p 9000:9000 --name=portainer &#13;\n    -v \/var\/run\/docker.sock:\/var\/run\/docker.sock &#13;\n    -v portainer_data:\/data &#13;\n    portainer\/portainer-ce<\/pre>\n<p>This sets up a Portainer instance which you can access at <code>localhost:9000<\/code>. It works by mounting your host\u2019s Docker socket into the Portainer container. Portainer can therefore use the socket to manage the containers running on your host.<\/p>\n<h2 id=\"kubernetes\"><span class=\"ez-toc-section\" id=\"Kubernetes\"><\/span>Kubernetes<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/kubernetes.io\">Kubernetes<\/a> is a distributed container orchestration platform. It\u2019s a common way to move Dockerized workloads into production environments. A Kubernetes cluster consists of multiple Nodes (physical machines) that are each eligible to host container instances.<\/p>\n<p>Kubernetes gives you straightforward scaling and distribution. Whereas plain Docker exposes individual containers on a single machine, Kubernetes manages multiple containers that run seamlessly over several Nodes.<\/p>\n<p>As Kubernetes is OCI-compatible, you can deploy your existing Docker images into your cluster:<\/p>\n<div class=\"wp-geshi-highlight-wrap5\">\n<div class=\"wp-geshi-highlight-wrap4\">\n<div class=\"wp-geshi-highlight-wrap3\">\n<div class=\"wp-geshi-highlight-wrap2\">\n<div class=\"wp-geshi-highlight-wrap\">\n<div class=\"wp-geshi-highlight\">\n<div class=\"yaml\">\n<pre class=\"de1\"><span class=\"co3\">apiVersion<\/span><span class=\"sy2\">: <\/span>apps\/v1<span class=\"co3\">\nkind<\/span><span class=\"sy2\">: <\/span>Deployment<span class=\"co4\">\nspec<\/span>:<span class=\"co3\">\n  replicas<\/span><span class=\"sy2\">: <\/span>3<span class=\"co4\">\n  selector<\/span>:<span class=\"co4\">\n    matchLabels<\/span>:<span class=\"co3\">\n      app<\/span><span class=\"sy2\">: <\/span>example<span class=\"co4\">\n  template<\/span>:<span class=\"co4\">\n    metadata<\/span>:<span class=\"co4\">\n      labels<\/span>:<span class=\"co3\">\n        app<\/span><span class=\"sy2\">: <\/span>example<span class=\"co4\">\n    spec<\/span>:<span class=\"co4\">\n      containers<\/span>:<span class=\"co3\">\n        - name<\/span><span class=\"sy2\">: <\/span>example<span class=\"co3\">\n          image<\/span><span class=\"sy2\">: <\/span>example.com\/example-image:latest<span class=\"co4\">\n          ports<\/span>:<span class=\"co3\">\n            - containerPort<\/span><span class=\"sy2\">: <\/span>80<\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<pre>kubectl apply -f deployment.yml<\/pre>\n<p>This example creates a Kubernetes deployment of the <code>example.com\/example-image:latest<\/code> image. The <code>replicas: 3<\/code> field means you\u2019ll end up with three container instances, providing redundancy for your system. The Deployment is similar to running <code>docker run -d -p 80:80 example.com\/example-image:latest<\/code>, although this would only start a single container.<\/p>\n<h2 id=\"traefik\"><span class=\"ez-toc-section\" id=\"Traefik\"><\/span>Traefik<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/traefik\/traefik\">Traefik<\/a> is an HTTP reverse proxy that\u2019s easy to integrate with container workloads. It automatically reconfigures itself with new routes as you create and remove containers.<\/p>\n<p>Traefik lets you attach labels to your containers to define domain names and forwarding behavior. The software will create appropriate proxy routes each time a container with matching labels joins the Traefik network.<\/p>\n<figure style=\"width: 1911px\" class=\"wp-caption aligncenter\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-15160\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/12\/98faa2e7.jpeg?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"The Traefik web UI\" width=\"1911\" height=\"1083\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><figcaption class=\"wp-caption-text\"><span class=\"imagecredit\"><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/traefik\/traefik\">Traefik<\/a><\/span><\/figcaption><\/figure>\n<p>Traefik also offers load balancing capabilities, support for WebSockets, a REST API, integrated metrics, and a web-based dashboard so you can monitor your traffic in real-time. It\u2019s a good way to expose multiple public-facing containers via domain names using a single Docker installation.<\/p>\n<h2 id=\"trivy\"><span class=\"ez-toc-section\" id=\"Trivy\"><\/span>Trivy<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Trivy is a container image scanner which uncovers known vulnerabilities. Scanning your images before you deploy them into production gives you confidence your workloads are safe and secure.<\/p>\n<p>Trivy is available as its own Docker image. You can start a simple scan of the <code>example-image:latest<\/code> image using the following command:<\/p>\n<pre>docker run --rm &#13;\n    -v trivy-cache:\/root\/.cache\/ &#13;\n    -v \/var\/run\/docker.sock:\/var\/run\/docker.sock &#13;\n    aquasec\/trivy:latest image example-image:latest<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12030\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/06\/3ea5f5d3.jpg?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"Screnshot of a Trivy report\" width=\"1332\" height=\"688\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>Trivy identifies the software packages in your image, looks for vulnerabilities, and produces a report containing each issue\u2019s CVE ID, severity, and impacted version range. You should upgrade each package to the <code>FIXED VERSION<\/code> indicated by Trivy. Running the tool after you build an image is therefore an easy way to boost the security of your deployments.<\/p>\n<h2 id=\"syft\"><span class=\"ez-toc-section\" id=\"Syft\"><\/span>Syft<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Syft generates SBOMs (software bill of materials) from Docker images. These are lists of all the OS packages and programming language dependencies included in the image.<\/p>\n<p>\u00a0<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-14684\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/11\/02b6d378.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"960\" height=\"548\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>Syft helps you audit your software supply chain. Docker makes it easy to reference remote content and layer up complex filesystems without necessarily realizing it. It\u2019s even harder for your image\u2019s users to work out what lies inside.<\/p>\n<p>Recent high-profile attacks have demonstrated that overly long software supply chains are a serious threat. Running Syft on your images keeps you informed of their composition, letting you assess whether you can remove some packages or switch to a more minimal base image.<\/p>\n<h2 id=\"dive\"><span class=\"ez-toc-section\" id=\"Dive\"><\/span>Dive<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>On a related theme, Dive simplifies Docker image filesystem inspections. Images are fairly opaque by default so it\u2019s common to start a container to work out what lies inside. This could put you at risk if the image contains a malicious process.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-14667\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/11\/7beeba46.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"964\" height=\"537\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>Dive lets you navigate an image\u2019s filesystem using an interactive tree view in your terminal. You can also browse individual layers to see how the image has been constructed. Viewing just the changes in a single layer helps you visualize the changes applied by each build stage, even if you don\u2019t have access to the original Dockerfile.<\/p>\n<h2 id=\"flocker\"><span class=\"ez-toc-section\" id=\"Flocker\"><\/span>Flocker<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/ClusterHQ\/flocker\">Flocker<\/a> is a volume manager which combines the management of containers and their persistent data. It supports multi-host environments, simplifying the migration of volumes between hosts as containers get rescheduled.<\/p>\n<p>This portability ensures volumes are available wherever containers are. Traditional Docker volumes can\u2019t leave the host they\u2019re created on, forcing your containers to stay in stasis too.<\/p>\n<p>Distributed storage support makes it easier to transition containers into production. Flocker is ideal for stateful containers that need to be scaled in distributed environments while maintaining compatibility with varied storage engines. It supports backends including Amazon EBS, Google GCE, and OpenStack Block Storage.<\/p>\n<h2 id=\"dokku\"><span class=\"ez-toc-section\" id=\"Dokku\"><\/span>Dokku<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Dokku uses Docker to let you self-host your own Platform-as-a-Service (PaaS). It automatically spins up Docker containers when you push code using Git.<\/p>\n<p>As a complete application platform, Dokku lets you map domains, add SSL, deploy multiple environments via Git branches, and configure auxiliary services such as databases. It\u2019s a great alternative to commercial platforms like Heroku and Firebase that lets you keep your production deployments on your own hardware.<\/p>\n<p>Setting up a Dokku server lets you start applications in isolated containers without learning all the intricacies of manual container management. You can concentrate on writing and committing code using established Git-based workflows. Adding your Dokku server as a Git remote means you can <code>git push<\/code> to deploy your changes, either locally in your terminal or as part of a CI pipeline.<\/p>\n<h2 id=\"hadolint\"><span class=\"ez-toc-section\" id=\"Hadolint\"><\/span>Hadolint<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Hadolint is a Dockerfile linter that checks your build stages adhere to the <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/docs.docker.com\/develop\/develop-images\/dockerfile_best-practices\">recommended best practices<\/a>. Running Hadolint can uncover common configuration issues that make your builds slower and less secure. Hadolint uses <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/koalaman\/shellcheck\">ShellCheck<\/a> internally to also lint the shell scripts in your Dockerfile <code>RUN<\/code> instructions.<\/p>\n<p>You can download Hadolint as a <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/hadolint\/hadolint\/releases\">precompiled binary<\/a>, try it <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/hadolint.github.io\/hadolint\">on the web<\/a>, or use its own Docker image, <code>hadolint\/hadolint<\/code>. Start a scan by supplying the path to a Dockerfile to the Hadolint binary:<\/p>\n<pre>hadolint Dockerfile<\/pre>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-15161\" data-pagespeed-lazy-src=\"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/12\/971de3d5.png?trim=1,1&amp;bg-color=000&amp;pad=1,1\" alt=\"\" width=\"850\" height=\"665\" src=\"\/pagespeed_static\/1.JiBnMqyl6S.gif\" onload=\"pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\" onerror=\"this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);\"\/><\/p>\n<p>Hadolint will scan your Dockerfile for problems and present the results in your terminal. Some of the bundled rules include checking for absolute <code>WORKDIR<\/code> paths, mandating unique <code>COPY --from<\/code> aliases, and not switching to a non-root user before the end of the Dockerfile. Running Hadolint regularly will result in safer and more performant image builds that comply with community standards.<\/p>\n<h2 id=\"summary\"><span class=\"ez-toc-section\" id=\"Summary\"><\/span>Summary<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Docker is a great developer tool but it gets even better when paired with other popular projects. Community initiatives can boost the security of your images, help you spot issues in your Dockerfiles, and provide versatile GUIs for managing your containers.<\/p>\n<p>New tools are constantly emerging so it\u2019s worth browsing code sharing sites like GitHub to discover upcoming projects. The <a rel=\"nofollow noopener\" target=\"_blank\" href=\"https:\/\/github.com\/topics\/docker?o=desc&amp;s=stars\">Docker topic<\/a> is a good starting point for your exploration.\n<\/div>\n<blockquote><p><strong><span style=\"color: #ff6600;\">If you liked the article, do not forget to share it with your friends. Follow us on\u00a0<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/news.google.com\/publications\/CAAqBwgKMLG0nwswvr63Aw\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Google News<\/a><\/span>\u00a0too, click on the star and choose us from your favorites.<\/span><\/strong><\/p><\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\">For forums sites go to <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/forum.buradabiliyorum.com\/\" target=\"_blank\" rel=\"noopener\">Forum.BuradaBiliyorum.Com<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<blockquote>\n<p style=\"text-align: center;\"><strong>If you want to read more like this article, you can visit our <span style=\"color: #ff9900;\"><a style=\"color: #ff9900;\" href=\"https:\/\/en.buradabiliyorum.com\/technology\/\" target=\"_blank\" rel=\"noopener\">Technology category.<\/a><\/span><\/strong><\/p>\n<\/blockquote>\n<p><span style=\"color: black;\"><a style=\"color: #ff9900;\" href=\"https:\/\/www.cloudsavvyit.com\/15158\/10-tools-that-complement-docker\/\" target=\"_blank\" rel=\"noopener\">Source<\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>&#8220;#10 Tools That Complement Docker \u2013 CloudSavvy IT&#8221; Docker is the best known containerization platform but it doesn\u2019t exist in isolation. An entire ecosystem of complementary tools and spin-off projects has sprung up around the shift to containers. Here\u2019s a round-up of 10 open-source analyzers, indexers, and orchestrators that make Docker even more convenient and&#8230;<\/p>\n","protected":false},"author":1,"featured_media":386766,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/www.cloudsavvyit.com\/p\/uploads\/2021\/01\/6dc7b5a0.jpeg","fifu_image_alt":"","footnotes":""},"categories":[18],"tags":[],"class_list":["post-386765","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology"],"_links":{"self":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/386765","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/comments?post=386765"}],"version-history":[{"count":0,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/posts\/386765\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media\/386766"}],"wp:attachment":[{"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/media?parent=386765"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/categories?post=386765"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/buradabiliyorum.com\/en\/wp-json\/wp\/v2\/tags?post=386765"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}