Back to basic : Docker

In the field of system administration, professionals constantly face a variety of challenges that can hinder efficiency and productivity. These challenges range from managing inconsistent development environments to grappling with resource-intensive applications, and the ever-present need for scalability and flexibility in response to fluctuating demands. Docker emerges as a powerful solution to these prevalent issues.

🤖
This article was written with the assistance of a generative AI. For more information how generative AI are used at Technodabbler, please check out the following article.

What's a Docker?

Docker is a platform that allows you to create, deploy, and run applications in containers. Think of containers as little, lightweight boxes where you can pack everything an application needs to run. This includes the code, runtime, libraries - basically everything that you might install on a server. The beauty of these containers is that they are isolated from each other and the host system, yet they share the same operating system kernel. This makes them very efficient and lightweight compared to traditional virtual machines (VMs).

Simplifying Deployment

One of Docker's biggest advantages is simplifying the deployment process. In the past, sysadmins faced the challenge of the dreaded "it works on my machine" syndrome. An application might run perfectly in a developer's environment, but encounter issues in production due to differences in operating systems or configurations. Docker containers ensure consistency across multiple development, testing, and production environments. Since the container includes the application and all its dependencies, it runs the same regardless of where it is deployed.

docker run -d \
	--name some-ghost \
	-e NODE_ENV=development \
	-e database__connection__filename='/var/lib/ghost/data/ghost.db' \
	-p 3001:2368 \
	-v /path/to/ghost/blog:/var/lib/ghost/content \
	ghost:alpine

Sample command to create a container for Ghost Blog

Efficient Use of Resources

Sysadmins are also tasked with efficiently managing resources. Traditional VMs can be resource-heavy, as each VM runs not just the application but a full-blown operating system. Docker containers, on the other hand, share the host system's kernel but run in isolated user spaces. This means you can run multiple containers on a single host machine without the overhead of multiple operating systems, leading to significant savings in terms of computational resources.

Rapid Scaling and Flexibility

Imagine you're running an e-commerce website that sees a huge spike in traffic during the holiday season. Docker makes it easy to scale up your application to handle that extra load. You can quickly create more containers to handle the increased demand, and just as easily reduce them when the traffic goes back to normal. This flexibility is a massive boon for sysadmins who need to adapt to changing demands quickly.

Streamlined Management

Docker also offers tools like Docker Swarm and Kubernetes for managing a cluster of Docker containers. These tools provide a straightforward way to deploy and manage a large number of containers, making it easier to maintain the infrastructure. This is especially beneficial in a micro-services architecture, where an application is broken down into smaller, independent services that run in separate containers.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ghostk3s
  namespace: ghostk3s
spec:
  replicas: 1
  template:
    metadata:
      namespace: ghostk3s
    spec:
      volumes:
        - name: ghostk3s-static-ghost
          persistentVolumeClaim:
            claimName: ghostk3s-static-ghost
        - name: ghost-config-prod
          secret:
            secretName: ghost-config-prod
            defaultMode: 420

      containers:
        - name: ghostk3s
          image: ghcr.io/sredevopsdev/ghost-on-kubernetes:main
          ports:
            - name: ghk3s
              containerPort: 2368
              protocol: TCP
          env:
            - name: NODE_ENV
              value: production
          resources:
            limits:
              cpu: '2'
              memory: 2Gi
            requests:
              cpu: '0'
              memory: 16Mi
          volumeMounts:
            - name: ghostk3s-static-ghost
              mountPath: /var/lib/ghost/content
            - name: ghost-config-prod
              readOnly: true
              mountPath: /var/lib/ghost/config.production.json
              subPath: config.production.json
            - name: tmp
              mountPath: /tmp
              readOnly: false
          imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst

Example of a Kubernetes deployment file (one of many) in a scalable Ghost blog deployment.

Try it out

As we've seen, Docker is a game-changer in the world of system administration, offering innovative solutions for deploying and managing applications. The best way to truly understand Docker's capabilities is by diving in and trying it out yourself. The first and most exciting step in your Docker journey is to select an application that resonates with your interests and deploy it using Docker. The internet is a treasure trove of examples and guides for a variety of applications. Whether it's setting up a Minecraft server, a forum, or even a torrent downloader, choose a project that sparks your passion. Docker Hub contains a collection of thousands of application pre-packaged and ready to deploy.

For those seeking to deepen their understanding and embrace a bit more complexity, the next step is to venture into cloud computing. Start by setting up a Virtual Private Server (VPS) with a cloud provider. This will give you a taste of handling Docker in a more production-like environment. An excellent project to undertake is deploying a web application with Docker. For instance, you could set up a blog and its accompanying database within Docker containers. This not only reinforces your understanding of Docker but also introduces you to key concepts in cloud computing and web services. If you are a student, the GitHub Student Pack offers a variety of offers to get you started.

These hands-on experiences are crucial for developing a robust understanding of Docker. They allow you to see firsthand how Docker functions in different scenarios, how it handles various applications, and how it interacts with the cloud environment. Remember, the learning process is incremental. Start with simple projects and gradually move to more complex setups. As you progress, your skills and confidence in using Docker will grow, opening up new possibilities for innovation and efficiency in your work or personal projects.

Docker is more than just a tool; it's your journey to understanding modern software deployment and management techniques. By starting your Docker journey with practical projects that align with your interests and gradually scaling up to more challenging endeavours, you're well on your way to becoming proficient in this essential technology.

💡
Have you used docker in a project? Sound off in the comments bellow with your idea. If you enjoyed reading about Docker, you might enjoy reading a bit about deployment targets or a deployment pipeline that leverages Kubernetes. And you can get more Technodabbler articles directly in your email box as they are published by subscribing to our mailing list.