Docker Fundamentals: A Complete Guide for Developers
Discover the essential Docker concepts, learn how to create and manage containers, and explore best practices for continuous integration and deployment.
InSkillCoach
Docker Fundamentals: A Complete Guide for Developers
Docker has revolutionized the way we develop, deploy, and run applications. This guide introduces the fundamental concepts of Docker and shows you how to use it effectively in your development workflow.
What Is Docker?
Docker is a containerization platform that lets you package an application and its dependencies into an isolated “container” that can run on any server. Unlike virtual machines, containers don’t require a hypervisor and run directly on the host machine’s kernel.
Benefits of Docker
- Environment consistency: “It works on my machine” becomes “It works everywhere”
- Isolation: Applications run in isolation without interfering with one another
- Resource efficiency: Lighter than traditional VMs
- Fast deployment: Containers start quickly
- Easy scaling: Simple container replication
Docker Architecture
The Docker architecture includes several key components:
- Docker Daemon (dockerd): The service that manages containers
- Docker Client: The command-line interface
- Docker Registry: The repository where images are stored (for example, Docker Hub)
- Docker Images: Read-only templates used to create containers
- Docker Containers: Running instances of images
Installing Docker
Windows
# Installer Docker Desktop pour Windows
# Télécharger depuis https://www.docker.com/products/docker-desktop
# Suivre les instructions d'installation
Linux (Ubuntu)
# Mettre à jour la liste des packages
sudo apt-get update
# Installer les prérequis
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
# Ajouter la clé GPG officielle Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# Configurer le repository stable
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# Installer Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
# Ajouter votre utilisateur au groupe docker
sudo usermod -aG docker $USER
macOS
# Installer Docker Desktop pour Mac
# Télécharger depuis https://www.docker.com/products/docker-desktop
# Suivre les instructions d'installation
Essential Docker Commands
Managing Images
# Télécharger une image
docker pull ubuntu:latest
# Lister les images
docker images
# Construire une image à partir d'un Dockerfile
docker build -t mon-app:1.0 .
# Supprimer une image
docker rmi ubuntu:latest
Managing Containers
# Créer et démarrer un conteneur
docker run -d -p 8080:80 --name mon-conteneur nginx
# Lister les conteneurs en cours d'exécution
docker ps
# Lister tous les conteneurs (y compris ceux arrêtés)
docker ps -a
# Arrêter un conteneur
docker stop mon-conteneur
# Démarrer un conteneur existant
docker start mon-conteneur
# Supprimer un conteneur
docker rm mon-conteneur
Interacting with Containers
# Exécuter une commande dans un conteneur en cours d'exécution
docker exec -it mon-conteneur bash
# Afficher les logs d'un conteneur
docker logs mon-conteneur
# Copier des fichiers vers/depuis un conteneur
docker cp mon-fichier.txt mon-conteneur:/chemin/destination
docker cp mon-conteneur:/chemin/source/fichier.txt .
Creating a Dockerfile
A Dockerfile is a text file that contains all the commands needed to assemble a Docker image.
# Utiliser une image de base
FROM node:14-alpine
# Définir le répertoire de travail
WORKDIR /app
# Copier les fichiers de dépendances
COPY package*.json ./
# Installer les dépendances
RUN npm install
# Copier le reste des fichiers
COPY . .
# Exposer un port
EXPOSE 3000
# Définir la commande à exécuter lors du démarrage du conteneur
CMD ["npm", "start"]
Dockerfile Best Practices
- Use lightweight base images such as Alpine Linux
- Combine RUN commands to reduce the number of layers
- Clean up caches after installing packages
- Use .dockerignore to exclude unnecessary files
- Pin specific versions for dependencies
- Use non-root users to run the application
Docker Compose
Docker Compose is a tool for defining and running multi-container applications.
Example docker-compose.yml
version: '3'
services:
web:
build: .
ports:
- "8000:8000"
volumes:
- ./app:/app
depends_on:
- db
environment:
- DATABASE_URL=postgres://postgres:password@db:5432/app
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=password
- POSTGRES_USER=postgres
- POSTGRES_DB=app
volumes:
postgres_data:
Docker Compose Commands
# Démarrer tous les services définis dans docker-compose.yml
docker-compose up -d
# Arrêter tous les services
docker-compose down
# Voir les logs de tous les services
docker-compose logs
# Reconstruire les images et démarrer
docker-compose up -d --build
Docker Networks
Docker creates several networks by default:
- bridge: The default network for containers
- host: Removes network isolation between the container and the host
- none: Disables networking
Creating and Managing Networks
# Créer un réseau
docker network create mon-reseau
# Lister les réseaux
docker network ls
# Connecter un conteneur à un réseau
docker network connect mon-reseau mon-conteneur
# Inspecter un réseau
docker network inspect mon-reseau
Docker Volumes
Volumes let you persist data outside of containers.
Types of Volumes
- Named volume: Managed by Docker
- Bind mount: Linked to a specific path on the host
- tmpfs mount: Stored in memory (non-persistent)
Volume Management Commands
# Créer un volume nommé
docker volume create mon-volume
# Lister les volumes
docker volume ls
# Utiliser un volume lors du démarrage d'un conteneur
docker run -d -v mon-volume:/data --name mon-conteneur ubuntu
# Associer un répertoire hôte à un conteneur
docker run -d -v /chemin/hote:/data --name mon-conteneur ubuntu
# Supprimer un volume
docker volume rm mon-volume
Docker Registry
A registry is a service for storing and distributing Docker images.
Working with Docker Hub
# Se connecter à Docker Hub
docker login
# Tagger une image
docker tag mon-app:1.0 utilisateur/mon-app:1.0
# Pousser une image vers Docker Hub
docker push utilisateur/mon-app:1.0
# Récupérer une image depuis Docker Hub
docker pull utilisateur/mon-app:1.0
Deploying a Private Registry
# Démarrer un registry local
docker run -d -p 5000:5000 --name registry registry:2
# Tagger une image pour le registry local
docker tag mon-app:1.0 localhost:5000/mon-app:1.0
# Pousser vers le registry local
docker push localhost:5000/mon-app:1.0
Docker Security
Best Practices
- Keep Docker up to date to benefit from security patches
- Scan images to detect vulnerabilities (with Docker Scout or Trivy)
- Limit container capabilities
- Use non-root users in containers
- Sign images with Docker Content Trust
- Restrict resources (CPU, memory) for containers
Secure Configuration
# Exécuter un conteneur avec des restrictions de ressources
docker run -d --name mon-conteneur --memory="512m" --cpus="0.5" nginx
# Exécuter un conteneur avec un utilisateur spécifique
docker run -d --user 1000:1000 --name mon-conteneur nginx
# Exécuter un conteneur en mode lecture seule
docker run -d --read-only --name mon-conteneur nginx
Common Use Cases
Web Applications
# Exécuter une application web Node.js
docker run -d -p 3000:3000 --name node-app node-app:1.0
# Exécuter un serveur Nginx comme proxy inverse
docker run -d -p 80:80 --name nginx -v ./nginx.conf:/etc/nginx/nginx.conf nginx
Databases
# Démarrer une base de données MySQL
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=password -v mysql_data:/var/lib/mysql mysql:8.0
# Démarrer une base de données PostgreSQL
docker run -d --name postgres -e POSTGRES_PASSWORD=password -v postgres_data:/var/lib/postgresql/data postgres:13
CI/CD
# Exécuter des tests dans un conteneur
docker run --rm -v $(pwd):/app -w /app node:14 npm test
# Construire une application dans un conteneur
docker run --rm -v $(pwd):/app -w /app maven:3.8-openjdk-11 mvn package
Integration with Kubernetes
Docker works very well with Kubernetes, the container orchestrator:
- Create Docker images for your application
- Push the images to an accessible registry
- Define Kubernetes manifests to deploy the containers
- Use kubectl to manage deployments
Conclusion
Docker has transformed software development by making applications more portable and easier to deploy and scale. Mastering Docker has become an essential skill for developers and DevOps professionals.
By following this guide, you have gained the fundamental knowledge to:
- Understand the key concepts of Docker
- Create and manage containers
- Work with images and volumes
- Use Docker Compose for multi-container applications
- Follow security best practices
To go further, explore container orchestration with Kubernetes, Docker-based CI/CD pipelines, and microservices architecture.
About InSkillCoach
Training and technology expert
Coach specializing in advanced technologies and AI, backed by GNeurone Inc.
Certifications:
- AWS Certified Solutions Architect – Professional
- Google Cloud certifications
- Microsoft Certified: DevOps Engineer Expert
- Certified Kubernetes Administrator (CKA)
- CompTIA Security+
Comments
Comments are powered by GitHub Discussions
Sign in with GitHub to join the discussion