mkdir html
echo "<h1>Hello from Docker Run</h1>" > html/index.html
docker run -d \
--name lab-nginx \
-p 8081:80 \
-v $(pwd)/html:/usr/share/nginx/html \
nginx:alpine
πΈ Screenshot β docker run command executing, container ID returned:

docker ps
πΈ Screenshot β docker ps showing lab-nginx running on port 8081:

version: '3.8'
services:
nginx:
image: nginx:alpine
container_name: lab-nginx
ports:
- "8081:80"
volumes:
- ./html:/usr/share/nginx/html
docker compose up -d
πΈ Screenshot β docker compose up creating network and starting container:

docker compose ps
πΈ Screenshot β docker compose ps showing lab-nginx running:

docker compose down
πΈ Screenshot β docker compose down removing container and network:

docker network create wp-net
docker run -d \
--name mysql \
--network wp-net \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=wordpress \
mysql:5.7
πΈ Screenshot β network created and MySQL container started:

docker run -d \
--name wordpress \
--network wp-net \
-p 8082:80 \
-e WORDPRESS_DB_HOST=mysql \
-e WORDPRESS_DB_PASSWORD=secret \
wordpress:latest
πΈ Screenshot β WordPress container started:

πΈ Screenshot β Browser at localhost:8082 (DB connection error while containers initialize):

version: '3.8'
services:
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: wordpress
volumes:
- mysql_data:/var/lib/mysql
wordpress:
image: wordpress:latest
ports:
- "8082:80"
environment:
WORDPRESS_DB_HOST: mysql
WORDPRESS_DB_PASSWORD: secret
depends_on:
- mysql
volumes:
mysql_data:
πΈ Screenshot β docker-compose.yml file in nano editor:

docker compose up -d
πΈ Screenshot β docker compose up starting MySQL and WordPress containers:

docker compose down -v
πΈ Screenshot β docker compose down -v removing containers, volumes and network:

Given Docker Run command:
docker run -d \
--name webapp \
-p 5000:5000 \
-e APP_ENV=production \
-e DEBUG=false \
--restart unless-stopped \
node:18-alpine
πΈ Screenshot β docker run webapp command executing:

Equivalent docker-compose.yml:
version: '3.8'
services:
webapp:
image: node:18-alpine
container_name: webapp
ports:
- "5000:5000"
environment:
APP_ENV: production
DEBUG: "false"
restart: unless-stopped
πΈ Screenshot β docker-compose.yml equivalent in nano editor:

docker compose up -d
docker compose ps
πΈ Screenshot β webapp compose up and ps output:

Given Docker Run commands:
docker network create app-net
docker run -d \
--name postgres-db \
--network app-net \
-e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=secret \
-v pgdata:/var/lib/postgresql/data \
postgres:15
docker run -d \
--name backend \
--network app-net \
-p 8000:8000 \
-e DB_HOST=postgres-db \
-e DB_USER=admin \
-e DB_PASS=secret \
python:3.11-slim
Equivalent docker-compose.yml:
version: '3.8'
services:
postgres-db:
image: postgres:15
container_name: postgres-db
environment:
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- app-net
backend:
image: python:3.11-slim
container_name: backend
ports:
- "8000:8000"
environment:
DB_HOST: postgres-db
DB_USER: admin
DB_PASS: secret
depends_on:
- postgres-db
networks:
- app-net
volumes:
pgdata:
networks:
app-net:
docker compose up -d
docker compose down -v
πΈ Screenshot β postgres-db and backend compose up, then down -v with volumes and network removed:

Given Docker Run command:
docker run -d \
--name limited-app \
-p 9000:9000 \
--memory="256m" \
--cpus="0.5" \
--restart always \
nginx:alpine
Equivalent docker-compose.yml:
version: '3.8'
services:
limited-app:
image: nginx:alpine
container_name: limited-app
ports:
- "9000:9000"
restart: always
deploy:
resources:
limits:
memory: 256M
cpus: "0.5"
πΈ Screenshot β resource limits docker-compose.yml in nano editor:

docker compose up -d
docker compose down
πΈ Screenshot β limited-app compose up and down:

Step 1: Create app.js
const http = require('http');
http.createServer((req, res) => {
res.end("Docker Compose Build Lab");
}).listen(3000);
πΈ Screenshot β app.js in nano editor:

Step 2: Create Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY app.js .
EXPOSE 3000
CMD ["node", "app.js"]
πΈ Screenshot β Dockerfile in nano editor:

Step 3: Create docker-compose.yml with build:
version: '3.8'
services:
nodeapp:
build:
context: .
dockerfile: Dockerfile
container_name: custom-node-app
ports:
- "3000:3000"
πΈ Screenshot β build-based docker-compose.yml in nano editor:

docker compose up --build -d
πΈ Screenshot β docker compose up βbuild, image built and container started:

πΈ Screenshot β browser at localhost:3000 showing βDocker Compose Build Labβ:

deploy.resources limits work only in Swarm mode; in standalone Compose they are accepted but not enforcedbuild: directive in Compose replaces image: to build from a local Dockerfile