🐳 Docker

This page documents containerized application deployment using Docker and Ansible in the homelab. It covers architecture, deployment workflow, version pinning, and integration with external resources like PostgreSQL or NFS.

Think of this as a generic framework for all containerized services in the homelab.

To understand how Docker service deployment evolved in this homelab β€” including the challenges, patterns, and decisions that led to the creation of the shared docker_service_deploy role,

πŸ‘‰ see the Evolution of Docker Service Deployment page.


πŸ— Architecture Overview

                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                  β”‚ Host / Docker Environment β”‚
                  β”‚                           β”‚
                  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
                  β”‚ β”‚ App Container 1       β”‚ β”‚
                  β”‚ β”‚ - Pinned Image        β”‚ β”‚
                  β”‚ β”‚ - Config & Backup     β”‚ β”‚
                  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
                  β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
                  β”‚ β”‚ App Container 2       β”‚ β”‚
                  β”‚ β”‚ - Pinned Image        β”‚ β”‚
                  β”‚ β”‚ - Config & Backup     β”‚ β”‚
                  β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
                  β”‚                           β”‚
                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                β”‚ Access
                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                  β”‚ Users / Clients           β”‚
                  β”‚ Web Browser / API         β”‚
                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–²β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                β”‚ Database or Shared Storage
                  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                  β”‚ External Services         β”‚
                  β”‚ - PostgreSQL              β”‚
                  β”‚ - NFS / Network Storage   β”‚
                  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Key Notes:


πŸ“ Architecture & Deployment Approach

Example Directory Layout:

/config/
   β”œβ”€β”€ app1/
   β”‚    β”œβ”€β”€ docker-compose.yml
   β”‚    └── app1.cfg
   └── app2/
        β”œβ”€β”€ docker-compose.yml
        └── app2.cfg
/nfs/backups/
   β”œβ”€β”€ app1/
   └── app2/

βš™οΈ Docker Deployment

1. Stop & remove existing container

docker stop <container>
docker rm <container>
docker network prune -f

2. Ensure persistent directories exist

mkdir -p /config/appname
mkdir -p /nfs/backups/appname
chown <user>:<group> /config/appname

3. Deploy templated configuration files

4. Prune unused Docker images (optional)

docker image prune -f

5. Pull pinned Docker image

docker-compose -f /config/appname/docker-compose.yml pull

6. Start container

docker-compose -f /config/appname/docker-compose.yml up -d

The Docker Deployment Example Commands vs Ansible Tasks page provides a side-by-side equivalence between manual Docker deployment commands and the automated Ansible tasks.


πŸ”’ Version Pinning & Best Practices

app_setup_version: "1.2.3"
app_setup_docker_image_name: "appname:{{ app_setup_version }}"

🌐 Integrating External Resources

app_setup_pg_host: "{{ global_ip_addresses[groups['pgdb'][0]] }}"
app_setup_pg_port: 5432

🎯 Key Features