Docker allows codebases to be shipped inside lightweight containers as an alternative to virtual machines. Containers provide isolated access to system resources and allow applications to be easily deployed through images. Images describe all dependencies and configuration for an application, while containers are running instances of images. Docker is widely adopted by companies and becoming an industry standard due to its portability and ease of deployment compared to virtual machines.