Week 6 – Docker & Containers: Daily Practice Tasks - snir1551/DevOps-Linux GitHub Wiki

Task 1 – Introduction to Docker CLI

  1. Run Your First Container
docker run hello-world

image

  1. List Containers and Images

    • List running containers:
      docker ps
      
    • List all containers (including stopped)
      docker ps -a
      
    • List downloaded images
      docker images
      

image

  1. Stop and Remove Containers

    • Stop a running container:
      docker stop <container_id>
      
    • Remove a stopped container:
      docker rm <container_id>
      
    • Remove all stopped containers:
      docker container prune
      

image

  1. Remove Docker Images

    • Remove a specific image:
      docker rmi <image_id>
      
    • Remove all unused images:
      docker image prune
      

image


Task 2 – Working with Docker Images

  1. Pull the nginx Image
docker pull nginx

image

image

  1. Run the Web Server
docker run -d -p 8080:80 --name my-nginx nginx

Explanation:

  • -d: Run in detached mode (in the background)

  • -p 8080:80: Map port 8080 on your machine (host) to port 80 inside the container (where nginx listens)

  • --name my-nginx: Assigns a name to the container

image

image

  1. Verify the Web Server is Running
curl http://localhost:8080

image

image

  1. Use a Lightweight Image
docker pull nginx:alpine
docker run -d -p 8081:80 --name my-nginx-alpine nginx:alpine

image

Now verify it via:

curl http://localhost:8081

image

  1. Compare Image Sizes
docker image ls

image

The alpine version is significantly smaller and ideal for production environments

  1. Cleanup
docker stop my-nginx my-nginx-alpine
docker rm my-nginx my-nginx-alpine

image

docker rmi nginx nginx:alpine

image


Task 3 – Dockerfile Basics

  1. Build from Dockerfile

    index.js:
    
    import express from 'express';
    import dotenv from 'dotenv';
    
    app.get('/', (req, res) => {
      res.send('Hello from Docker\n');
    });
    
    app.listen(port, () => {
      console.log(`App is running at http://localhost:${port}`);
    });
    
    Dockerfile:
    
    FROM node:18-alpine
    
    WORKDIR /app
    
    COPY package*.json ./
    
    RUN apk add --no-cache curl && rm -rf /var/cache/apk/*
    
    RUN npm install
    
    COPY . .
    
    EXPOSE 3000
    
    HEALTHCHECK --interval=30s --timeout=5s --start-period=5s --retries=3 CMD curl -f http://localhost:3000/ || exit 1
    
    CMD ["npm", "start"]
    
docker build -t hello-from-dockerfile .

image

  1. Run Your Custom App
docker run -d -p 3000:3000 --name docker_project hello-from-dockerfile

image

curl http://localhost:3000

image

  1. Explore Inside Container
docker exec -it docker_project bash
ls -la
exit
docker image ls
  1. Use .dockerignore to Optimize Image Size

before .dockerignore:

image

after .dockerignore:

image


Task 4 – Custom Networking and Multi-container Setup

  1. Build App

    update index.js:
    
    import express from 'express';
    import dotenv from 'dotenv';
    import mongoose from 'mongoose';
    
    const host = process.env.MONGO_HOST;
    const username = process.env.MONGO_INITDB_ROOT_USERNAME;
    const password = process.env.MONGO_INITDB_ROOT_PASSWORD;
    const uri = `mongodb://${username}:${password}@${host}:27017/?authSource=admin`;
    
    mongoose.connect(uri)
     .then(() => console.log('Connected to MongoDB via Mongoose'))
     .catch(err => console.error('Connection failed:', err));
    
    app.get('/', (req, res) => {
      res.send('Hello from Docker + Mongoose\n');
    });
    
    app.listen(port, () => {
      console.log(`App is running at http://localhost:${port}`);
    });
    
docker build -t docker-webapp .

image

  1. Create Custom Network
docker network create mynet

image

docker network ls

image

  1. Run MongoDB in the Network
docker run -d --name mongodb --network mynet -e MONGO_USERNAME=admin -e MONGO_PASSWORD=1234 mongo

image

  1. Access MongoDB CLI
docker exec -it mongodb mongosh -u admin -p 1234 --authenticationDatabase admin
use admin
db.system.users.find().pretty()

image

  1. Run Your Web App in the Network
docker run -d --name webapp --network mynet --env-file .env -p 3000:3000 docker-webapp

image

docker network inspect mynet

image

docker logs webapp

image

  1. Network Diagnostics
docker exec -it webapp bash
apt update && apt install -y iputils-ping
ping mongodb

image


Task 5 – Docker Compose Intro

  1. Compose Up

    docker-compose.yml:
    
    version: '3.8'
    
    services:
      mongodb:
        image: mongo:8.0.10
        container_name: mongodb
        restart: always
        env_file: 
          - .env
        environment:
        MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
        MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
        volumes:
          - mongo-data:/data/db
        networks:
          - mynet
    
      webapp:
        build:
          context: .
        dockerfile: Dockerfile
        image: myapp:1.0.0
        container_name: webapp
        restart: always
        env_file:
          - .env
        environment:
          PORT: ${PORT}
          MONGO_HOST: mongodb
        ports:
          - "3000:3000"
        depends_on:
          - mongodb
        networks:
          - mynet
    
    volumes:
      mongo-data:
    
    networks:
      mynet:
        driver: bridge
    
docker-compose up -d --build

image

  1. Check Everything
docker images
docker ps
docker volume ls

image

curl http://localhost:3000
docker network ls

image

docker network inspect 16eebe505976

image

  1. Test Inter-Container Communication
docker exec -it webapp bash
apt update && apt install -y iputils-ping
ping mongodb
CTRL + C
exit

image

docker logs webapp

image

Task 6 – Monitoring & Logging Basics

  1. Logs and Inspection
docker logs webapp

image

docker inspect webapp | grep -A 20 "Health"

image

Task 7 – Advanced Docker Features

  1. Tag and Push to DockerHub
docker tag myapp:1.0.0 your_dockerhub_username/myapp:1.0.0

image

docker push your_dockerhub_username/myapp:1.0.0

image

image

2 created action

https://github.com/snir1551/DevOps-Linux/blob/main/.github/workflows/docker.yml

The final solution:

https://github.com/snir1551/DevOps-Linux/tree/main/week6_practice

⚠️ **GitHub.com Fallback** ⚠️