Dependency Management Revolution: First application requiring external dependencies fundamentally changes Docker workflow - dependencies must be installed during image build phase, not runtime
RUN vs CMD Command Distinction:
RUN executes commands during image building phase (install dependencies, setup environment)
CMD provides execution commands to containers after creation
Strategic Dependency Installation: Installing dependencies during image build ensures they become permanent part of the image, available to all containers created from it
Container Network Isolation: Container networks are completely isolated from host machine networks - port mapping (-p) bridges this gap by connecting container ports to host ports
EXPOSE Documentation: The EXPOSE instruction serves as documentation, informing developers which container ports need mapping - it doesn't actually expose ports
Staged File Copying Strategy: Copying requirements first, installing dependencies, then copying source code provides fine-grained control over image building process and better optimization
Environment Variables in Images: Dockerfiles can set environment variables using ENV instruction, eliminating need for runtime environment setup
Web Application Binding Challenges: Flask applications bind to localhost by default, requiring --host 0.0.0.0 flag to accept requests from outside the container
Network Interface Flexibility: Using 0.0.0.0 allows applications to accept requests from any available network interface, crucial for containerized web applications
Troubleshooting Growth Mindset: Bugs and errors in containerization are learning opportunities that develop deeper understanding of application networking and Docker behavior