This document provides an introduction to dependency injection containers (DIC). It begins by explaining dependency injection and its benefits over direct instantiation, such as easier testing and replacing dependencies. It then introduces the concept of a dependency injection container, which manages object instantiation and wiring of dependencies. Using a container allows configuring services differently for production versus development and avoids deeply nested instantiation code. The document demonstrates implementing a simple DI container and using it to resolve object graphs in place of direct construction.