Skip to main content
  1. Posts/

Dev Containers: Your Ideal Development Environment

5 mins·
Devcontainers Docker Vscode Development Tools
Table of Contents
Say goodbye to “It works on my machine” and embrace absolute consistency

How many times have you heard the phrase “It works on my machine”? If you’re a developer, probably more than you’d like to admit. Dev Containers have arrived to eliminate this problem once and for all, offering us completely reproducible and portable development environments.

A Dev Container is a Docker container specifically configured for development that includes everything needed to work on a project: tools, runtime, libraries, extensions, and configurations. It’s like having a perfectly packaged development environment that any developer can use, regardless of their operating system or local setup.

Why Dev Containers? The Problem They Solve
#

Imagine this situation: a new developer joins your team and needs to set up the development environment. Traditionally, this involves:

  • Installing the correct version of the runtime (Node.js, Python, Go, etc.)
  • Setting up local databases
  • Installing system-specific dependencies
  • Configuring development tools
  • Syncing editor extensions and configurations

This process can take hours or days, and even then, compatibility issues can arise. Dev Containers eliminate this friction completely.

Key Features of Dev Containers
#

Absolute Consistency
#

The entire team works in the same environment, eliminating differences between development, staging, and production machines.

Instant Onboarding
#

A new developer can be productive in minutes, not days. They just need to clone the repository and open the project.

Complete Isolation
#

Each project has its own isolated environment, avoiding conflicts between tool versions or dependencies.

Total Portability
#

The environment works the same on Windows, macOS, Linux, and even in the cloud with GitHub Codespaces.

“Batteries Included”
#

Dev Containers can include:

  • Specific runtime: Node.js, Python, Go, .NET, etc.
  • Databases: PostgreSQL, MySQL, MongoDB
  • Tools: Git, Docker, kubectl, terraform
  • VS Code extensions: Automatically configured
  • Custom configurations: Linting, formatting, debugging

Real-World Use Cases
#

Distributed Teams
#

Especially useful for remote teams where environment consistency is critical for effective collaboration.

Legacy Projects
#

Working with projects that require specific tool versions without contaminating the local system.

Microservices
#

Each service can have its own Dev Container with the specific tools it needs.

Workshops and Education
#

Eliminates setup issues in programming workshops or courses.

Open Source Contributions
#

Makes it easier for external contributors to start working on projects without technical barriers.

Practical Example: Setting up a Dev Container
#

Let’s create a Dev Container for a Node.js project with PostgreSQL. The process is surprisingly simple:

Step 1: Project Structure
#

my-project/
├── .devcontainer/
│   ├── devcontainer.json
│   └── docker-compose.yml
├── src/
│   └── app.js
└── package.json

Step 2: Dev Container Configuration
#

Create the .devcontainer/devcontainer.json file:

{
  "name": "Node.js & PostgreSQL",
  "dockerComposeFile": "docker-compose.yml",
  "service": "app",
  "workspaceFolder": "/workspace",
  "shutdownAction": "stopCompose",
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-vscode.vscode-typescript-next",
        "esbenp.prettier-vscode",
        "ms-vscode.vscode-json",
        "bradlc.vscode-tailwindcss"
      ],
      "settings": {
        "editor.formatOnSave": true,
        "editor.defaultFormatter": "esbenp.prettier-vscode"
      }
    }
  },
  "forwardPorts": [3000, 5432],
  "postCreateCommand": "npm install",
  "remoteUser": "node"
}

Step 3: Docker Compose
#

The .devcontainer/docker-compose.yml file:

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ../..:/workspace:cached
    command: sleep infinity
    depends_on:
      - db

  db:
    image: postgres:15
    restart: unless-stopped
    volumes:
      - postgres-data:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: devuser
      POSTGRES_PASSWORD: devpass
      POSTGRES_DB: devdb

volumes:
  postgres-data:

Step 4: Dockerfile
#

FROM node:18-bullseye-slim

# Install additional tools
RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
    && apt-get -y install --no-install-recommends \
       git \
       postgresql-client \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# Configure non-root user
ARG USERNAME=node
ARG USER_UID=1000
ARG USER_GID=$USER_UID

USER $USERNAME

Step 5: Ready to Use!
#

Once configured, any developer can:

  1. Clone the repository
  2. Open VS Code in the project directory
  3. Click “Reopen in Container” when the notification appears
  4. Wait a few minutes while the environment is built
  5. Start developing immediately!

Concrete Benefits
#

For Developers
#

  • Instant productivity: No more hours lost in setup
  • Clean environment: Your local machine doesn’t get contaminated with project tools
  • Safe experimentation: You can try new tools without risk

For Teams
#

  • Fast onboarding: New members productive in minutes
  • Consistent debugging: Everyone sees the same errors in the same environment
  • Effective collaboration: Eliminates local environment variables

For Organizations
#

  • Cost reduction: Less time lost in setup and debugging
  • Improved quality: Consistent environments lead to fewer bugs
  • Scalability: Easy to add new projects and developers

Integration with GitHub Codespaces
#

Dev Containers integrate perfectly with GitHub Codespaces, enabling completely cloud-based development. With a simple click, you can have a complete development environment running in the browser, perfect for:

  • Quick code review
  • Bug fixing from anywhere
  • Development on resource-limited devices
  • Real-time collaboration

Best Practices
#

Image Optimization
#

  • Use official base images and keep them updated
  • Implement multi-stage builds for smaller images
  • Cache dependencies correctly

Secret Management
#

  • Never include secrets in the Dev Container
  • Use environment variables for sensitive configuration
  • Implement secure credential management mechanisms

Performance
#

  • Use named volumes for persistent data
  • Configure bind mounts correctly
  • Optimize startup times with post-create commands

Complementary Tools
#

Dev Containers work excellently with:

  • VS Code: Native support and specialized extensions
  • Docker Compose: For multi-service environments
  • GitHub Actions: For consistent CI/CD
  • Kubernetes: For deployment with the same runtime

Limitations and Considerations
#

Performance Overhead
#

Containers can introduce some latency, especially in I/O intensive operations.

Learning Curve
#

Requires basic knowledge of Docker and containerization.

Resource Management
#

Containers consume system resources, especially with multiple projects.

Conclusion
#

Dev Containers represent a natural evolution in modern development. They eliminate setup friction, improve collaboration, and ensure consistency from development to production.

If you haven’t tried Dev Containers yet, I recommend starting with a simple project. Once you experience the instant productivity and absolute consistency, it will be hard to go back to traditional methods.

Dev Containers are not just another tool; they’re the answer to decades of development environment setup problems. In a world where speed and consistency are critical, adopting this technology is not just a competitive advantage, it’s a necessity.

Are you ready to say goodbye to “It works on my machine” forever?

Related

K3s: Lightweight Kubernetes
7 mins
K8s K3s Tools
Using GHCR from ArgoCD
3 mins
Github Oci Helm Chart Argocd
Using GHCR from ArgoCD
4 mins
Github Oci Helm Chart Argocd
Using Github Container Registry to host Helm Charts
3 mins
Github Oci Helm Chart
Generating multiple EKS contexts with AWS SSO
2 mins
K8s Aws Eks Sso Kubeconfig
Using AWS S3 as Persistent Volume in EKS
7 mins
K8s Aws S3 Csi Storage