Docker and containers in general are revolutionising the way we think about application development and operations. As a new packaging technology I think it perfectly defines the interface between an application and the host it will be running on. In order to better understand why this is so, I have looked at this interface and how it captures application dependencies and what it leaves out. Because many different packaging technologies have been used. Here’s a historic list of those that I have ever been using:
- C64 BASIC source code (actually it is byte code but can be seen as equivalent)
- C64 6502 machine code
- Atari ST executable plus RSC file
- Unix shell source code
- Unix executable plus libs plus conf
- NextStep application package in a tar
- Windows installer package with executables, registry, libs, files, services (a nightmare)
- Linux RPMs and other packaging formats
- Java JAR, EAR, WAR
- Virtual machine
- Docker containers
- Unikernels
By looking specifically at the dependencies that applications in these packaging formats need to consider I came up with this list:
- Hardware
- Hypervisor
- Operating system
- Runtime environment (interpreter, middleware, …)
- Libraries
- Filesystem structure, size and specific files
- Registry and other application configuration
- System services
- Networking
- Other application components
- Other enterprise services
- Internet / external services