Week 6 – Docker & Containers: Daily Practice Tasks - snir1551/DevOps-Linux GitHub Wiki
- Run Your First Container
docker run hello-world
-
List Containers and Images
- List running containers:
docker ps
- List all containers (including stopped)
docker ps -a
- List downloaded images
docker images
- List running containers:
-
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
- Stop a running container:
-
Remove Docker Images
- Remove a specific image:
docker rmi <image_id>
- Remove all unused images:
docker image prune
- Remove a specific image:
- Pull the nginx Image
docker pull nginx
- 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
- Verify the Web Server is Running
curl http://localhost:8080
- Use a Lightweight Image
docker pull nginx:alpine
docker run -d -p 8081:80 --name my-nginx-alpine nginx:alpine
Now verify it via:
curl http://localhost:8081
- Compare Image Sizes
docker image ls
The alpine version is significantly smaller and ideal for production environments
- Cleanup
docker stop my-nginx my-nginx-alpine
docker rm my-nginx my-nginx-alpine
docker rmi nginx nginx:alpine
-
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 .
- Run Your Custom App
docker run -d -p 3000:3000 --name docker_project hello-from-dockerfile
curl http://localhost:3000
- Explore Inside Container
docker exec -it docker_project bash
ls -la
exit
docker image ls
- Use .dockerignore to Optimize Image Size
before .dockerignore:
after .dockerignore:
-
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 .
- Create Custom Network
docker network create mynet
docker network ls
- Run MongoDB in the Network
docker run -d --name mongodb --network mynet -e MONGO_USERNAME=admin -e MONGO_PASSWORD=1234 mongo
- Access MongoDB CLI
docker exec -it mongodb mongosh -u admin -p 1234 --authenticationDatabase admin
use admin
db.system.users.find().pretty()
- Run Your Web App in the Network
docker run -d --name webapp --network mynet --env-file .env -p 3000:3000 docker-webapp
docker network inspect mynet
docker logs webapp
- Network Diagnostics
docker exec -it webapp bash
apt update && apt install -y iputils-ping
ping mongodb
-
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
- Check Everything
docker images
docker ps
docker volume ls
curl http://localhost:3000
docker network ls
docker network inspect 16eebe505976
- Test Inter-Container Communication
docker exec -it webapp bash
apt update && apt install -y iputils-ping
ping mongodb
CTRL + C
exit
docker logs webapp
- Logs and Inspection
docker logs webapp
docker inspect webapp | grep -A 20 "Health"
- Tag and Push to DockerHub
docker tag myapp:1.0.0 your_dockerhub_username/myapp:1.0.0
docker push your_dockerhub_username/myapp:1.0.0
2 created action
https://github.com/snir1551/DevOps-Linux/blob/main/.github/workflows/docker.yml
https://github.com/snir1551/DevOps-Linux/tree/main/week6_practice