Docker voorbeelden: installatie, Dockerfile, compose.yaml, volumes, netwerken #
Hello World Image ★☆☆ #
Uitleg:
Dit is het meest eenvoudige Docker-voorbeeld. Het downloadt en start de hello-world-image van Docker Hub. Deze image toont simpelweg de melding “Hello from Docker!” en stopt vervolgens. Het laat het basisproces zien van het downloaden en uitvoeren van een Docker-image.
Nginx-webserver ★☆☆ #
docker run -d -p 80:80 nginxUitleg:
Dit voorbeeld downloadt en start de officiële Nginx-webserver-image.
-d: Start de container in ‘detached’-modus (op de achtergrond).-p 80:80: Koppelt poort 80 op de hostmachine aan poort 80 in de container, waardoor de webserver toegankelijk is via de browser van de host.
Aangepaste image met Dockerfile: Eenvoudige Node.js-app ★★☆ #
Dockerfile:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]Bouwen en uitvoeren:
docker build -t my-node-app .
docker run -d -p 3000:3000 my-node-appUitleg: Dit voorbeeld laat zien hoe je een aangepaste Docker-image bouwt met behulp van een Dockerfile voor een eenvoudige Node.js-applicatie.
- Dockerfile:
FROM node:14: Gebruikt de officiële Node.js 14-image als basis.WORKDIR /app: Stelt de werkmap in de container in op/app.COPY package*.json ./: Kopieertpackage.jsonenpackage-lock.json(indien aanwezig) naar de container.RUN npm install: Installeert de Node.js-dependencies.COPY . .: Kopieert de rest van de applicatiecode naar de container. -EXPOSE 3000: Geeft aan dat de container zal luisteren op poort 3000.CMD ["npm", "start"]: Definieert het commando dat wordt uitgevoerd wanneer de container start (start de Node.js-app).- Build:
docker build -t my-node-app .bouwt de image en voorziet deze van de tagmy-node-app. - Run:
docker run -d -p 3000:3000 my-node-appstart de container in ‘detached’-modus en koppelt poort 3000 op de host aan poort 3000 in de container.
Docker Compose: Web-app met database ★★☆ #
docker-compose.yaml:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: mydb
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:nginx.conf:
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
location /phpmyadmin {
proxy_pass http://db:80;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}Uitvoeren:
docker-compose up -dUitleg:
Dit voorbeeld laat zien hoe je Docker Compose gebruikt om een applicatie met meerdere containers te definiëren en uit te voeren, bestaande uit een webserver (Nginx) en een database (MySQL).
- docker-compose.yaml:
version: "3.8": Specificeert de versie van het Docker Compose-bestandsformaat.services:: Definieert de services (containers) in de applicatie.web:: De webserverservice.image: nginx:latest: Gebruikt de officiële Nginx-image.ports: - "80:80": Koppelt poort 80 op de host aan poort 80 in de container.volumes::- Koppelt de map
./htmlop de host aan/usr/share/nginx/htmlin de container, zodat je statische bestanden vanaf je lokale machine kunt serveren. - Koppelt het bestand
./nginx.confaan/etc/nginx/conf.d/default.confom Nginx te configureren. depends_on: - db: Zorgt ervoor dat dedb-service start vóór deweb-service.db:: De databaseservice.image: mysql:5.7: Gebruikt de officiële MySQL 5.7-image.environment:: Stelt omgevingsvariabelen in voor de MySQL-container (root-wachtwoord en databasenaam).volumes: - db_data:/var/lib/mysql: Koppelt het benoemde volumedb_dataaan/var/lib/mysqlom de databasegegevens te behouden (persistentie).volumes: - db_data:: Definieert een benoemd volume genaamddb_data.- Uitvoeren:
docker-compose up -dstart de applicatie in ‘detached’-modus (op de achtergrond). ### #Named volume voor datapersistentie ★★☆
Dockerfile:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y apache2
VOLUME /var/www/html
CMD ["apache2ctl", "-D", "FOREGROUND"]Bouwen en uitvoeren:
docker build -t my-apache-app .
docker run -d -p 80:80 --name my-apache-container -v my-data:/var/www/html my-apache-appToelichting:
Dit voorbeeld laat zien hoe een ’named volume’ (benoemd volume) wordt gebruikt om gegevens te behouden in een Docker-container die een Apache-webserver draait.
- Dockerfile:
VOLUME /var/www/html: Declareert/var/www/html(waar Apache websitebestanden opslaat) als een volume.- Uitvoeren:
-v my-data:/var/www/html: Koppelt de named volumemy-dataaan/var/www/htmlin de container. Wijzigingen aan bestanden in/var/www/htmlblijven behouden in demy-data-volume, zelfs als de container wordt gestopt of verwijderd.
Bind Mount voor ontwikkeling ★★☆ #
docker run -d -p 80:80 -v $(pwd):/usr/share/nginx/html nginxUitleg:
Dit voorbeeld gebruikt een bind mount om de huidige werkmap ($(pwd)) op de hostmachine te koppelen aan /usr/share/nginx/html in de Nginx-container. Dit is handig voor ontwikkeling, omdat wijzigingen die je aanbrengt in bestanden in je lokale map direct zichtbaar zijn in de container.
Door de gebruiker gedefinieerd netwerk voor communicatie tussen containers ★★★ #
docker-compose.yaml:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
networks:
- my-network
app:
image: my-node-app
networks:
- my-network
networks:
my-network:Uitleg:
Dit voorbeeld laat zien hoe je een door de gebruiker gedefinieerd netwerk aanmaakt en daar twee services (containers) aan koppelt.
- docker-compose.yaml:
networks:: Definieert een netwerk met de naammy-network.services::- Zowel de
web- als deapp-service zijn gekoppeld aan hetmy-network-netwerk. - Containers die met hetzelfde door de gebruiker gedefinieerde netwerk zijn verbonden, kunnen met elkaar communiceren via hun servicenamen als hostnames. De
app-container kan bijvoorbeeld deweb-container bereiken via de hostnameweb. ### Multi-stage build voor een geoptimaliseerde image ★★★
Dockerfile:
# Fase 1: De applicatie bouwen
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# Fase 2: Een compacte productie-image maken
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]Toelichting:
Dit voorbeeld laat een multi-stage build zien om een kleinere, meer geoptimaliseerde productie-image voor een Node.js-applicatie te maken.
- Fase 1: Bouwt de applicatie in een Node.js-omgeving.
- Fase 2: Kopieert alleen de gebouwde bestanden (uit
/app/dist) naar een compacte Nginx Alpine-image, waarbij de onnodige build-tools en dependencies uit de eerste fase worden weggelaten.
Docker Compose met omgevingsvariabelen ★★☆ #
docker-compose.yaml:
version: "3.8"
services:
web:
image: my-node-app
ports:
- "80:3000"
environment:
NODE_ENV: production
API_KEY: ${API_KEY}Toelichting:
Dit voorbeeld laat zien hoe je omgevingsvariabelen gebruikt in een Docker Compose-bestand.
environment:: Definieert omgevingsvariabelen voor deweb-service.NODE_ENV: production: Zet de omgevingsvariabeleNODE_ENVopproduction.API_KEY: ${API_KEY}: Leest de waarde vanAPI_KEYuit een omgevingsvariabele op de hostmachine. Zorg ervoor dat je de omgevingsvariabeleAPI_KEYop je host instelt voordat jedocker-compose upuitvoert. ### #Dockerfile met Healthcheck ★★☆
Dockerfile:
FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/
HEALTHCHECK --interval=5s --timeout=3s \
CMD curl -f http://localhost/ || exit 1Uitleg:
Dit voorbeeld laat zien hoe je een healthcheck aan een Dockerfile toevoegt.
HEALTHCHECK: Definieert een healthcheck-commando dat door Docker wordt uitgevoerd om te controleren of de container gezond (healthy) is.--interval=5s: Geeft aan dat de healthcheck elke 5 seconden moet worden uitgevoerd.--timeout=3s: Geeft aan dat de healthcheck na 3 seconden een time-out moet geven.CMD curl -f http://localhost/ || exit 1: Het healthcheck-commando zelf. Het gebruiktcurlom te controleren of de webserver reageert op poort 80. Als het verzoek mislukt, eindigt het commando met een code die niet nul is, wat aangeeft dat de container ongezond (unhealthy) is.
Docker Compose met meerdere netwerken ★★★ #
docker-compose.yaml:
version: "3.8"
services:
frontend:
image: my-frontend-app
networks:
- frontend-network
- backend-network
backend:
image: my-backend-app
networks:
- backend-network
database:
image: mysql:5.7
networks:
- backend-network
networks:
frontend-network:
backend-network:Uitleg:
Dit voorbeeld laat zien hoe je meerdere netwerken definieert en gebruikt in een Docker Compose-bestand.
networks:: Definieert twee netwerken:frontend-networkenbackend-network. -services::frontend: Is verbonden met zowelfrontend-networkalsbackend-network, waardoor communicatie met zowel de backend als de buitenwereld mogelijk is.backend: Is verbonden metbackend-network, waardoor communicatie met de database mogelijk is.database: Is verbonden metbackend-network, waardoor communicatie met de backend mogelijk is.
Docker Compose met build-argumenten ★★☆ #
docker-compose.yaml:
version: "3.8"
services:Docker Compose met build-argumenten ★★☆ #
docker-compose.yaml:
version: "3.8"
services:
my-app:
build:
context: .
args:
VERSION: 1.0Dockerfile:
FROM alpine:latest
ARG VERSION
RUN echo "Building version: $VERSION"Uitleg:
Dit voorbeeld laat zien hoe je build-argumenten gebruikt in een Docker Compose-bestand.
build::args:: Definieert een build-argument genaamdVERSION.- Het
VERSION-argument wordt vervolgens in de Dockerfile gebruikt om het build-proces aan te passen.
Dockerfile met Entrypoint-script ★★★ #
Dockerfile:
FROM ubuntu:latest
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["my-app"]entrypoint.sh:
#!/bin/bash
echo "Starting my-app..."
exec "$@"Uitleg:
Dit voorbeeld laat zien hoe je een entrypoint-script gebruikt in een Dockerfile.
ENTRYPOINT ["/entrypoint.sh"]: Geeft aan dat/entrypoint.shmoet worden uitgevoerd als het entrypoint voor de container.CMD ["my-app"]: Specificeert het standaardcommando dat door het entrypoint-script moet worden uitgevoerd.
Het entrypoint-script kan worden gebruikt om voorbereidende taken uit te voeren voordat de hoofdapplicatie start. In dit voorbeeld wordt simpelweg een bericht getoond, waarna het commando uit CMD wordt uitgevoerd.
Docker Compose met schalen ★★☆ #
docker-compose.yaml:
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
deploy:
replicas: 3Uitleg:
Dit voorbeeld laat zien hoe je een service schaalt in een Docker Compose-bestand.
deploy::replicas: 3: Geeft aan dat er 3 instanties van deweb-service moeten draaien. ### #Dockerfile met ONBUILD-instructie ★★★
Dockerfile (basis-image):
FROM node:14
WORKDIR /app
ONBUILD COPY package*.json ./
ONBUILD RUN npm install
ONBUILD COPY . .Dockerfile (applicatie-image):
FROM my-base-image
CMD ["npm", "start"]Uitleg:
Dit voorbeeld laat zien hoe de ONBUILD-instructie in een Dockerfile wordt gebruikt.
ONBUILD: Specificeert instructies die worden uitgevoerd wanneer de image als basis-image voor een andere image wordt gebruikt.- In dit voorbeeld definieert de image
my-base-imageONBUILD-instructies om bestanden te kopiëren en afhankelijkheden te installeren. Wanneer deapplicatie-imagewordt gebouwd, worden deze instructies automatisch uitgevoerd.
Docker Compose met profielen ★★★ #
docker-compose.yaml:
version: "3.8"
services:
web:
image: my-web-app
profiles: ["frontend"]
api:
image: my-api-app
profiles: ["backend"]
db:
image: mysql:5.7
profiles: ["backend"]
profiles:
frontend:
backend:Uitleg:
Dit voorbeeld laat zien hoe profielen in een Docker Compose-bestand worden gebruikt.
profiles: Hiermee kun je groepen services definiëren die gezamenlijk kunnen worden in- of uitgeschakeld.- In dit voorbeeld maakt de
web-service deel uit van hetfrontend-profiel, terwijl deapi- endb-services deel uitmaken van hetbackend-profiel. - Om alleen de frontend-services te starten, voer je uit:
docker-compose up -d --profile frontend. - Om alleen de backend-services te starten, voer je uit:
docker-compose up -d --profile backend. - Om alle services te starten, voer je uit:
docker-compose up -d. ### #Dockerfile met .dockerignore ★★☆
.dockerignore:
node_modules
.gitDockerfile:
FROM node:14
WORKDIR /app
COPY . .
RUN npm install
CMD ["npm", "start"]Uitleg:
Dit voorbeeld laat zien hoe je een .dockerignore-bestand gebruikt om bestanden en mappen uit te sluiten van het kopiëren naar de Docker-image.
- Het
.dockerignore-bestand bevat patronen die overeenkomen met de bestanden en mappen die moeten worden uitgesloten. In dit voorbeeld worden de mappennode_modulesen.gituitgesloten.
#Docker Compose met override-bestand ★★★ #
docker-compose.yaml:
version: "3.8"
services:
web:
image: my-web-app
ports:
- "80:80"docker-compose.override.yaml:
version: "3.8"
services:
web:
environment:
DEBUG: "true"Uitleg:
Dit voorbeeld laat zien hoe je een override-bestand gebruikt om de configuratie van services in een Docker Compose-bestand aan te passen.
- Het bestand
docker-compose.override.yamlbevat configuratie die de configuratie in het bestanddocker-compose.yamloverschrijft. - In dit voorbeeld wordt de omgevingsvariabele
DEBUGingesteld voor deweb-service in het override-bestand. ### #Docker Compose met depends_on en healthcheck ★★★
docker-compose.yaml:
version: "3.8"
services:
db:
image: mysql:5.7
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
web:
image: my-web-app
ports:
- "80:80"
depends_on:
db:
condition: service_healthyToelichting:
Dit voorbeeld combineert depends_on en healthcheck in een Docker Compose-bestand om services in een specifieke volgorde te starten, op basis van de gezondheidsstatus van hun afhankelijkheden.
db-service:- Heeft een
healthcheck