Moving From Containers to Infrastructure
After setting up my Ubuntu Server VM, the next step was figuring out the best way to manage applications.
Instead of installing every service directly onto Linux, I decided to use Docker containers.
Docker makes it easier to deploy applications, keep them separated, and recreate them if something goes wrong.
Docker Structure
I organized my services into separate folders:
/data/docker/
├── portainer
├── immich
├── nginx-proxy-manager
└── website
Each service has its own Docker Compose configuration.
This keeps everything organized and makes it easier to move, backup, and rebuild services.
Using Portainer
Portainer provides a web interface for managing Docker.
It allows me to:
- View running containers
- Check logs
- Manage images
- Monitor resources
- Restart services
While the command line is still important, having a visual management tool makes everyday administration easier.
The Importance of Persistent Storage
One challenge I ran into was understanding Docker volumes.
Originally, application data was stored inside Docker-managed volumes. I moved important data into dedicated storage paths so that my services are easier to backup and migrate.
This taught me an important lesson:
A container can be replaced. The data cannot.
Lessons Learned
This project helped me understand:
- Docker Compose
- Container networking
- Persistent storage
- Service management
- Troubleshooting through logs
A lot of system administration comes down to knowing how to investigate problems instead of just reinstalling everything.