Using Docker to deploy applications, encapsulate software tools, and otherwise simplify software development

Multi-stage Docker image builds, minimizing final image size, supporting multi-architecture containers

(Sun Oct 20 2024 00:00:00 GMT+0300 (Eastern European Summer Time)) Docker supports creating images/containers for (almost) every CPU architecture. But, the image build workflow differs based on the architecture. We discuss one way to handle building Docker images across platforms while minimizing the resulting image size.

Inspecting a Docker container filesystem without starting a container

(Sat Jul 20 2024 00:00:00 GMT+0300 (Eastern European Summer Time)) Docker images contain instructions for building a filesystem one layer at a time. Sometimes we need to explore the layers to ensure the image is built correctly. Since it's non-obvious how to do that, let's explore several tools.

Installing Dockge, a lightweight Docker management tool

(Mon Jan 15 2024 00:00:00 GMT+0200 (Eastern European Standard Time)) Managing Docker infrastructure solely with command-line tools is powerful but full of geeky details which can be simplified with a GUI. Dockge is a web GUI offering a point-and-click approach to managing application stacks deployed with Docker Compose.

Installing Docker Engine or Desktop on Ubuntu, macOS or Windows

(Tue Jan 02 2024 00:00:00 GMT+0200 (Eastern European Standard Time)) Docker is a system for deploying containerized software on laptops, single board computers, server farms, or massive compute systems. It gives you a Linux environment in which to install software, that is packaged in a portable format, for execution on any system that can run Open Container Initiative (OCI) containers. It is easy to setup Docker on Linux hosts, and only slightly harder on Mac or Windows systems.

How to install NextCloud using Docker Compose: a comprehensive guide

(Wed Dec 13 2023 00:00:00 GMT+0200 (Eastern European Standard Time)) NextCloud is open source software implementing the equivalent to Google Drive, Dropbox, and the like. Beyond file sharing, it supports document editing, calendars, email, and is attempting to compete with the full breadth of Google Workspace services. It can be self-hosted on your own server, giving you privacy you don't get from commercial cloud services.

Using Podman to run MongoDB on MacOS mounting data directory from MacOS host

(Fri Oct 06 2023 00:00:00 GMT+0300 (Eastern European Summer Time)) Podman, the Docker alternative for running Docker containers, runs great on MacOS. But, some scenarios can be tricky, such as mounting macOS host directories into a container.

Self-hosted metasearch engine protects against tracking from Google, Bing, etc

(Wed Jul 13 2022 00:00:00 GMT+0300 (Eastern European Summer Time)) Are you worried that Google/Bing/etc know too many details about you? These companies collect data about us, to then sell advertising targeting us. This can be avoided using search tools that protect privacy. One, SearXNG, is an open source metasearch engine that guarantees complete anonymity.

Self-hosted DMARC report viewer to aid your anti-SPAM effort

(Tue Jul 12 2022 00:00:00 GMT+0300 (Eastern European Summer Time)) DMARC is an important tool for websites that send e-mails to do so legitimately. Implementation requires catching e-mails containing DMARC reports then using a tool to parse/summarize/report on their content. We look at a simple DMARC reporting tool that is easily deployable using Docker.

Self-hosting services using Docker

(Thu May 12 2022 00:00:00 GMT+0300 (Eastern European Summer Time)) Self-hosting is the opposite of using a 3rd party cloud service like Dropbox or Google Drive, and instead to host an equivalent service, like Nextcloud, on their own hardware. For every popular cloud service there is probably an independently developed open source equivalent one can host on their own hardware. Self-hosting gives one control, and peace of mind that their private information is not being sold to others, and it can save a lot of money from service fees that aren't paid. The personal security implications are huge, since it is known that governments around the world are pressuring internet services for data on user activity. While there is a legitimate need to know about criminal activities, do we really need to risk our data being snooped upon?

Why self-host web services for more control and lower cost than cloud-based web services

(Fri Dec 17 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) Self-hosting is about hosting Internet services on your computers, controlled by you. This is different from just Using the Cloud by signing up for services like Dropbox, Github, Travis, or other 3rd party controlled services. Instead of taking the easy path, just using cloud services, self-hosters have control over their data, and enjoy lower costs. For most commercial services there are equivalent open source alternatives you can host on your own hardware.

Replacing Docker Desktop with Multipass, to avoid Docker Desktop fees

(Sat Oct 30 2021 00:00:00 GMT+0300 (Eastern European Summer Time)) Docker is open source software, and Docker Desktop is a spiffy GUI application to simplify installing Docker on a macOS or Windows machine. It's worth using, because of how easy it makes to use Docker. However, Docker Inc has changed to a freemium model for the Docker Desktop application, which will lead some to avoid using Docker Desktop and instead seek an alternative to avoid paying the fee. What we'll discuss is using Multipass, or other virtual machine, to avoid those fees.

Docker Inc squeezing money from Docker Desktop and other Docker tools

(Sat Oct 30 2021 00:00:00 GMT+0300 (Eastern European Summer Time)) From its launch, Docker Desktop was a free product letting us easily install Docker on macOS and Windows machines. Docker doesn't run natively on either, and previously required serious hackery to get Docker running. But, the company behind Docker recently announced changes including describing Docker Desktop as being available for individual developers, education, open source, and small businesses. That's led to some outcry, and calls to abandon using Docker.

Self-hosted Docker infrastructure in home or office using low-cost computers like Intel NUC

(Fri Mar 26 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) Using Docker, and a simple small computer, you can build a powerful computing "cloud" in your home, on your desktop, at low cost, giving you control over your data. If you need more power, adding another computer or three to the mix quickly adds more capabilities. For almost any popular 3rd party service like Github, Dropbox, and Trello, there is an open source package that might even be better. With open source operating systems, open source packages like Gitea, Nextcloud, and Kanboard, you gain control over your destiny.

Scheduling background tasks using cron in a Docker container

(Thu Mar 25 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) The cron service has, for time immemorial in Unix-like systems, long helped us schedule the occasional background process that keeps our systems ticking. Typically it is used to gather up or summarize log files, or collect and process data from external systems. In the old days when e-mail exchange, and the all-too-important Usenet news exchange, happened using UUCP over modem lines, a cron job scheduled regular UUCP calls to neighboring servers. Having cron running in the background is part of normal Unix/Linux/etc system admin practices. Even though the crontab format is kind of hokey, we all learn it and set up automated background tasks to keep the world functioning. Let's see how to set this up in a Docker container.

Using multiple databases and PHPMyAdmin in a single MySQL Docker instance

(Sat Mar 20 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) Sometimes our applications need multiple database, but with a single database server instance. The typical recommendation is for each Docker container to serve a single application. For databases, that means one database server for each application. That's the result of following a theoretical best practice, but isn't there another best practice to avoid excess processes and overhead? MySQL, like most other database servers, can support multiple databases, multiple user identities, and has an extensive system for controlling access on IP address, user names, and passwords. The MySQL container for Docker is easy to use, but supports only a single database instance per server container. In this article let's learn how to go ahead and configure the MySQL container for Docker to support multiple databases each with their own user ID.

Connect with SSL to MySQL in Docker container

(Wed Mar 17 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) MySQL might throw an error when an application connects without using SSL to encrypt the connection. Therefore the MySQL team clearly hints it is best to use SSL connections to MySQL servers. Clearly a database connection has critical data that you don't want to leak to 3rd parties, and encryption is a great counter-measure. The official MySQL Docker container automatically generates a set of SSL certificates to use for connections, so let's see how to put those certificates to use.

Using SSH to remotely control a Docker Engine or Docker Swarm in two easy steps

(Mon Mar 15 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) To remotely manage a Docker instance, we can SSH into that host to run Docker commands there. But a not-well-documented Docker feature lets us remotely access, and manage, Docker instances from the comfort of our laptop, via SSH. It's fast, easy and very powerful.

Understanding MySQL the Access Denied error in or outside a Docker container

(Wed Mar 10 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) I once wasted more than a full workday fighting the MySQL error message Access denied for user (using password: YES). After finding the solution I want to help others avoid this problem. Along the way to fixing the issue, I learned a lot about how MySQL authenticates user ID's. I've been using MySQL for years and had glossed over this topic, but it turns out to both not be terribly difficult, and very crucial to the solution.

Running MongoDB with Docker and Docker Compose

(Wed Mar 10 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) MongoDB, as one of the popular NoSQL databases, is part of many software projects. Hence, one must sometimes know how to configure and setup MongoDB in a Docker environment.

Set up MySQL using Docker on your laptop

(Wed Mar 10 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) Setting up MySQL on Docker is fairly simple, and the MySQL team has created a flexible Docker image that can be used in many ways. Databases, like MySQL, serve as the data persistence and retrieval layer of many applications we might deploy.

Wordpress local development environment with Docker and Docker Compose on your laptop

(Tue Mar 09 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) We normally install Wordpress on a public Internet server, and installation on your local machine is normally limited to developing or testing a Wordpress feature or theme. The development loop is a lot shorter when you can directly edit Wordpress files on your machine, as opposed to working out a method to edit remote files. While it's convenient, it's not always clear how to create a website hosting environment on your laptop. In the past we would use MAMP (or the Windows equivalent), which is a macOS-native environment for running Apache/MySQL/PHP stacks. But today we have a different tool, Docker, that is easily able to run that stack, as well as any other stack. Docker easily runs on a laptop, so let's take a look at using it to run a local Wordpress development environment.

Deploying MySQL to get started using a Docker Compose file

(Mon Mar 08 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) While the docker run CLI command is powerful, Docker Compose files let us succinctly describe a whole system of Docker containers, virtual networks, and file systems, in one easy to read file. This is a powerful tool with which you can easily describe deployment of a full application stack. Compose files support not only deployment to the local Docker host, but to Docker Swarm clusters, and now to AWS ECS and Azure ACI cloud platforms.

Set up PHPMyAdmin and Wordpress Docker containers using existing MySQL

(Fri Mar 05 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) There are several ways to launch a PHP service, backed by a MySQL database, on Docker. That combination is literally the LAMP Stack (Linux, Apache, MySQL, PHP/Python/etc), and we can use Docker to easily set up this combination on our laptop or deploy it to a production server. Elsewhere we went over setting up MySQL on Docker, so lets now demonstrate the LAMP Stack, on Docker, by deploying PHPMyAdmin and Wordpress on our laptop.

Familiarizing ourselves with Docker

(Thu Mar 04 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) Getting to know Docker by running a few commands.

Implementing HTTPS with Docker services on AWS ECS using Docker Compose

(Fri Feb 05 2021 00:00:00 GMT+0200 (Eastern European Standard Time)) Thanks to a new Docker CLI feature we can directly deploy to AWS Elastic Container Service (ECS) using a Docker Compose file. It's very cool, and greatly simplifies deploying applications to AWS, but it lacks an important feature which is implementing HTTPS support. The solution offered by the Docker team involves rewriting the Cloud Formation template they generate for us, so let's learn how it works.

Wordpress production deployment with Docker Compose

(Fri Sep 25 2020 00:00:00 GMT+0300 (Eastern European Summer Time)) Hosting a Wordpress site in Docker is relatively easy, and is largely a matter of properly configuring three standard containers. It requires a MySQL database, NGINX, and the Wordpress PHP-FPM container, with simple configuration. Starting from a freshly provisioned virtual server, the process takes less than two hours to set up hosting with HTTPS support.

How to share a Docker network between Stacks deployed to a Docker Swarm

(Sun Sep 20 2020 00:00:00 GMT+0300 (Eastern European Summer Time)) How do you handle a system deployed to Docker Swarm, with multiple Stacks, where a container in one Stack must communicate with a container in another Stack? For example, you may have a database Stack, and an application layer Stack, where the application needs to communicate with the database. It's simplest to put both into the same Stack. But it's a best practice for the database to stay running, and to separately bring the application up and down to deploy updates. Therefore it's best to use separate Stacks for each layer, raising the question of how will the application containers find the database containers.

Using NGINX, Lets Encrypt and Cron in Docker to manage HTTPS/SSL certificates for multiple domains

(Sun Jul 05 2020 00:00:00 GMT+0300 (Eastern European Summer Time)) NGINX is a hugely flexible webserver with which it's very easy to manage HTTPS with Lets Encrypt. With a simple configuration file it is easy to add HTTPS support to a back-end service, using NGINX's reverse proxy. It's possible to use this for deployments both small and large. As with any website Internet-visible nowadays, it is necessary to use HTTPS. Which leads to the task of using Lets Encrypt to provision SSL certificates for several domains, using NGINX to terminate the HTTPS connections, while proxying from NGINX to the actual services. This blog post discusses a Docker container designed explicitly for that purpose.

Manage Letsenrypt HTTPS/SSL certificates with a Docker container using Cron, Nginx, and Certbot

(Mon Jun 29 2020 00:00:00 GMT+0300 (Eastern European Summer Time)) Modern websites must have HTTPS support for security reasons. As a result web browsers and search engines have begun downgrading sites that do not support HTTPS. That means we all must have a simple, low cost, way to set up HTTPS support on our websites. The Letsencrypt project offers free SSL certificates for HTTPS. In this project we will create a Docker container for handling HTTPS via Nginx, and automated SSL certificate renewal using the Letsencrypt command-line tools (Certbot).

Avoid 'could not be accessed' error when deploying a Service to a Docker Swarm on AWS

(Sat May 30 2020 00:00:00 GMT+0300 (Eastern European Summer Time)) Launching a Docker Swarm on EC2 instances is relatively easy, but of course there are pitfalls. One involves deploying a service to the swarm, but getting an error message about being unable to access the container image from the ECR registry.

Creating a Docker Swarm using Multipass and Ubuntu 20.04 on your laptop

(Thu May 21 2020 00:00:00 GMT+0300 (Eastern European Summer Time)) Docker is a cool system for deploying applications as reusable containers, and Docker Swarm is a Docker Orchestrator that let's us scale the number of containers across multiple machines. Multipass is a very light weight virtual machine manager application running on Windows, Linux and macOS, that let's us easily set up multiple Ubuntu instances on our laptop at low performance impact. Therefore Multipass can serve as a means to easily experiment with Docker Swarm on your laptop, learning how it works, setting up networks, etc.

Correctly launch MySQL on Docker for Windows, avoiding 'Bind on unix socket' error

(Wed May 06 2020 00:00:00 GMT+0300 (Eastern European Summer Time)) Docker is an excellent tool for launching Linux-containerized applications, and it even runs on Windows. But running Docker containers on Windows has a few unexpected rough edges. One will come if you try the default way to launch MySQL doesn't work on Windows. Instead of the expected successful launch you might instead be told Can't start server : Bind on unix socket and asked whether there is another MySQL server running. That misleading error can send you on a tangential wild goose chase.

Solve 'Drive has not been shared' error with Docker on Windows

(Tue May 05 2020 00:00:00 GMT+0300 (Eastern European Summer Time)) We often mount folders into a Docker container to ensure data is persistent while letting us freely destroy and recreate the container. But on Windows you might get a head-scratching error message saying "Unhandled exception: Drive has not been shared". The most common advice that might come up when searching the Internet is not about this situation, but about general file sharing in Windows. In this case the error refers to configuration settings in Docker.

Installing a self-hosted Docker Registry to aid Docker image development

(Sun Mar 15 2020 00:00:00 GMT+0200 (Eastern European Standard Time)) When developing Docker images it's useful to store them in a Docker registry. While using Docker Hub is free, it's bad form to fill up that shared resource with images built for personal use. It's better to only publish the Docker images that are truly useful to everyone, and that have documentation. That leaves us with the problem of a location to host our own Docker images. Do we pay for a private repository somewhere? Or, as a self-hoster, do we host a local Docker Registry to store our personal Docker images? In this post let's explore the latter idea.

Setting up Docker for an easy-to-configure self-hosting environment

(Sun Mar 15 2020 00:00:00 GMT+0200 (Eastern European Standard Time)) Self-hosting is about hosting Internet services in an easy-to-manage environment. Docker is an excellent tool for managing these kind of services since it is easy to reuse software packages, and it has a fairly strong security barrier around those packages. In many cases we'll just need to install and configure the Docker container. But to ease the task we need a well organized system for managing configuration files, data directories, and other stuff associated with running several Docker containers.

Installing Gitea for self-hosted Git service, replacing Gogs

(Wed Mar 11 2020 00:00:00 GMT+0200 (Eastern European Standard Time)) While Gogs is an excellent tool to have a self-hosted Git service (like Github), I recently found out the project is semi-abandoned. A group of Gogs users launched Gitea as a replacement, and in any case it looks like a better server. The goal here is to install Gitea, evaluate it, and see how to convert Gogs-based repositories over to Gitea. The result will be managed in the Docker self-hosting machine I have at home.

Easily manage Docker containers on both local and remote Docker hosts with Portainer

(Mon Mar 09 2020 00:00:00 GMT+0200 (Eastern European Standard Time)) Docker is a wonderful advancement for software engineers and system administrators. It simplifies launching and maintaining background processes, while adding a layer of much-needed encapsulation and security. But the default command-line administrative tools are less than pleasant to use, and we instead want a good GUI with which to manage our Docker hosts. That's where Portainer comes in. It manages the Docker containers we have running on our local host, or on remote hosts.

Directly deploying a Docker service to AWS ECS using Docker Compose

(Thu Feb 06 2020 00:00:00 GMT+0200 (Eastern European Standard Time)) Deploying Docker services to AWS ECS is becoming much simpler thanks to new feature collaboration between the Docker and AWS teams. It is now possible to take a normal Docker Compose file, using modern Compose features, and deploy directly to AWS. Nothing complex or unusual is required, with all the complexity handled under the covers with a generated CloudFormation file. In this article we'll take a first look at using these features, which are in early release right now.

Run Linux/X11 apps in Docker and display on a Mac OS X desktop

(Tue Dec 10 2019 00:00:00 GMT+0200 (Eastern European Standard Time)) While the MacPorts and Homebrew projects bring many Linux apps to the Mac environment, they don't support every app we'd want to run. Since the X11 environment is not native to macOS it's not a simple recompile, since you have to rewrite the GUI system. Thankfully there is an X11 display server for Mac OS X that can be used to run an application in a Linux environment and display it on the macOS desktop. In this article we'll look at one way to get this all connected up and running.

Learn to use Docker for application development and deployment

(Tue Apr 03 2018 00:00:00 GMT+0300 (Eastern European Summer Time))

Docker is a wonderful tool that abstracts away all kinds of details about configuring and maintaining Linux Containers. The power to simply type "docker run image-name" and have a bunch of complexity automatically handled is great. However Docker is one of those tools with lots of moving parts behind the scenes, and some training is needed to use it well.

HTTPS with nginx, using Lets Encrypt, proxying to Gogs and Jenkins back-end services

(Sat Mar 31 2018 00:00:00 GMT+0300 (Eastern European Summer Time))

Modern development environments require a continuous integration system, along with a reasonable git-based repository hosting service. It's possible to rent these services, Github and Gitlab are both excellent hosted git repository services for example, and there are several hosted continuous integration systems. Gitlab in particular is a one-stop-shop offering both Git hosting and continuous integration in one service. But, you can easily host Git and Continuous Integration services on your own hardware. And with a little work the services can be HTTPS-protected using Lets Encrypt.

Moving Docker's files to a custom location

(Tue Jan 30 2018 00:00:00 GMT+0200 (Eastern European Standard Time))

Docker is a wonderful tool that abstracts away all kinds of details about configuring and maintaining Linux Containers. The power to simply type "docker run image-name" and have a bunch of complexity automatically handled is great. But you may want to change Docker's defaults, and just how do you do so? In my case "/var/lib/docker" would be on an SSD drive, and to lengthen its lifetime I want to minimize the number of writes to that drive. Moving this directory to the SSD should help with that goal.

Deploying Docker images to a server without using a Docker Registry

(Wed Aug 30 2017 00:00:00 GMT+0300 (Eastern European Summer Time))

We formerly deployed server applications to a Linux server using manual processes. An advanced team might use shell scripts to automate deployment. Over time tools like Chef or Ansible and more grew to handle ever-more-complex server application deployment scenarios. A few years ago, Docker came onto the scene with a whole new approach involving building a "Container" housing a complete operating system image that runs your application. Having built the Container, it's easy to ship that container to a server or run it on your laptop. The compelling gain is having the exact same development environment on your laptop as is deployed to your servers. Using the EXACT same environment streamlines your work by removing a ton of potentially destabilizing variables.

The preferred method is to build a Docker container image on your laptop, or on a build server, and upload the image to a Docker Registry. The image can then be downloaded from the Registry onto any number of systems.

What if you don't want to, or cannot, use a Registry? You could instead deploy the source code to the server, and build the container image on the server. That's a very unwise move, and it's better to ship the container image to the server. Turns out that is easy to do.

Using Docker to host ARM toolchain to cross-compile C code

(Thu Jan 19 2017 00:00:00 GMT+0200 (Eastern European Standard Time)) I'm starting up a project that will see me doing custom software development for an ARM single-board-computer running Linux. The recommendation isn't to do compiles ON the board, but instead to cross compile from a Linux workstation (Debian). But, I use a Mac laptop, as do most software engineers these days. While I could run VirtualBox to set up a Debian cross-compiling environment, Docker is much lighter weight. While Docker was originally targeted for deploying server applications, it is useful for packaging anything. In this case there's a ready-made set of Docker containers for cross-compilation including for ARM CPU's.