Screenshot from the article

Introduction

Docker has revolutionized the way we develop, package, and deploy applications. While basic Docker usage covers building and running containers, advanced techniques unlock better performance, security, and scalability.

In this blog, we will explore advanced Docker concepts with real-world examples, best practices, troubleshooting tips, and FAQs.

1. Multi-Stage Builds for Optimized Images

Problem: Large Docker Images

Many applications suffer from large image sizes because unnecessary dependencies are included.

Solution: Multi-Stage Builds

Multi-stage builds help in creating lightweight images by using temporary builder containers.

Example:

# Stage 1: Build
FROM golang:1.19 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# Stage 2: Deploy lightweight container
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]

This reduces the final image size significantly.

2. Advanced Networking in Docker

Problem: Containers Need Secure and Isolated Networks

Containers communicate over networks, but using default bridge networking can cause security risks.

Solution: Use User-Defined Networks

# Create a custom bridge network
$ docker network create my_custom_network
# Run containers inside the network
$ docker run -d --network=my_custom_network --name app1 nginx
$ docker run -d --network=my_custom_network --name app2 alpine sleep 3600

With a custom network, DNS-based service discovery works automatically inside Docker.

3. Using Docker Compose for Multi-Container Applications

Problem: Running Multiple Containers Manually is Cumbersome

Handling microservices manually can be complex.

Solution: Docker Compose

Docker Compose simplifies multi-container applications using YAML configuration.

Example:

version: '3.8'
services:
  app:
    image: node:16
    ports:
      - "3000:3000"
    volumes:
      - ./app:/app
    depends_on:
      - db
  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password

Start everything with a single command:

$ docker-compose up -d

4. Optimizing Performance with Caching and Layering

Problem: Slow Docker Builds

Frequent builds can be slow due to redundant steps.

Solution: Leverage Docker Layer Caching

# Order matters! Place static dependencies before dynamic code changes
FROM node:16
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
CMD ["node", "index.js"]

By copying dependencies first, Docker caches installed packages, reducing build times.

5. Securing Docker Containers

Problem: Containers Run with Excessive Privileges

By default, containers run as root, which increases security risks.

Solution: Run as a Non-Root User

FROM ubuntu
RUN useradd -m appuser
USER appuser
CMD ["/bin/bash"]

This prevents privilege escalation inside the container.

6. Logging and Monitoring with Docker

Problem: Debugging Containerized Applications

Containers generate logs, but they are ephemeral.

Solution: Use Docker Logging Drivers

$ docker run --log-driver json-file nginx
$ docker logs <container_id>

For production, use ELK (Elasticsearch, Logstash, Kibana) or Loki with Prometheus for logging.

FAQs

Q1: How do I reduce Docker image sizes?

  • Use multi-stage builds
  • Base your image on alpine:latest
  • Remove unnecessary dependencies

Q2: How do I persist data across container restarts?

  • Use volumes (docker volume create mydata)
  • Bind mount host directories (-v /host/path:/container/path)

Q3: How can I update a running container without downtime?

  • Use Rolling Updates in Docker Swarm or Kubernetes
  • Use Blue-Green Deployments

Q4: How can I debug a running container?

  • Use docker exec -it <container_id> /bin/bash
  • Check logs with docker logs <container_id>

Conclusion

Docker is a powerful tool, and mastering advanced concepts can greatly improve efficiency, security, and performance. By leveraging multi-stage builds, networking, security best practices, and logging, you can ensure scalable and resilient containerized applications.

Let me know your thoughts and share your Docker experiences in the comments!

📢 Have questions or feedback? Drop a comment below or connect with me on Twitter/X@spysood!

Originally published on Medium.