LESSON 24 ยท DOCKER

Docker ๐Ÿณ
แ‰ฆแ‰ณ แ‰ฆแ‰ณ แ‹ญแˆฐแˆซแˆƒแˆ!

"แŠฎแˆแ’แ‹ฉแ‰ฐแˆฌ แˆ‹แ‹ญ แ‹ญแˆฐแˆซ แАแ‰ แˆญ!" แ‰ฅแˆˆแˆ… แ‰ฐแ‰ธแŒแˆจแˆ… แ‰ณแ‹แ‰ƒแˆˆแˆ…? Docker แ‹ซ แ‰ฝแŒแˆญ แˆแŒฝแˆž แ‹ซแˆตแ‹ˆแŒฃแˆƒแˆ!

โœ๏ธ แ‹จแˆฐแˆซแ‹: @AppMinds_ET ยท EthioCode SoftSelect
01
Docker แˆแŠ•แ‹ตแŠ• แАแ‹?

Docker โ€” App แŠ• แˆแˆ‰แˆ dependencies แŒ‹แˆญ แŠ แ‹‹แˆ…แ‹ถ Container แ‹แˆตแŒฅ แ‹ซแˆฝแŒ‹แˆแข แ‹ซ Container แˆ›แŠ•แŠ›แ‹แˆ แŠฎแˆแ’แ‹ฉแ‰ฐแˆญ แ‹ˆแ‹ญแˆ server แˆ‹แ‹ญ แ‰ฐแˆ˜แˆณแˆณแ‹ญ แˆ†แŠ– แ‹ญแˆฐแˆซแˆƒแˆ!

แ‹‹แŠ“แ‹ แŒฅแ‰…แˆ™: "แŠฎแˆแ’แ‹ฉแ‰ฐแˆฌ แˆ‹แ‹ญ แ‹ญแˆฐแˆซ แАแ‰ แˆญ โ€” server แˆ‹แ‹ญ แŠ แ‹ญแˆฐแˆซแˆ!" แ‹จแˆšแ‰ฃแˆˆแ‹ แ‰ฝแŒแˆญ แˆˆแ‹˜แˆˆแ‹“แˆˆแˆ แ‹ญแŒ แ‹แˆƒแˆ!

๐Ÿ’ก แˆแˆณแˆŒ แ‰ฐแŒ แ‰…แˆž แˆˆแˆ˜แˆจแ‹ณแ‰ต โ€” แ‹จแˆปแŠ•แŒฃ แˆแˆณแˆŒ
Docker แˆณแ‹ญแŠ–แˆญ
๐Ÿงณ แˆแ‰ฅแˆต แ‰ฅแ‰ป
แ‰คแ‰ตแˆ… แ‰ตแˆ„แ‹ณแˆˆแˆ… โ€” แˆŒแˆ‹ แ‰คแ‰ต แˆŒแˆ‹ แˆแ‰ฅแˆต แ‹ซแˆตแˆแˆแŒ‹แˆƒแˆ!
โ†’
Docker แŠจแŠ–แˆจ
๐Ÿ“ฆ แˆแˆ‰แˆ แ‹ซแˆˆแ‰ แ‰ต แˆปแŠ•แŒฃ
แˆปแŠ•แŒฃ แ‹ญแ‹˜แˆ… แ‰ตแˆ„แ‹ณแˆˆแˆ… โ€” แˆแˆ‰แˆ แ‹ซแˆตแˆแˆแŒ แАแŒˆแˆญ แŠ แ‰ฅแˆฎ แˆตแˆˆแˆ†แА แ‹ซ แˆปแŠ•แŒฃ แˆแˆ‰แˆ แ‰ฆแ‰ณ แ‹ญแˆฐแˆซแˆƒแˆ!
App แˆณแ‹ญ Docker
๐Ÿ˜ฐ "แ‹จแŠ” PC แ‰ฅแ‰ป!"
Node 18, MongoDB 6 install แ‰ฃแˆˆ แŠฎแˆแ’แ‹ฉแ‰ฐแˆญ แ‰ฅแ‰ป แ‹ญแˆฐแˆซแˆƒแˆ
โ†’
App + Docker
๐Ÿ˜Ž แˆแˆ‰แˆ แ‰ฆแ‰ณ!
Container แˆแˆ‰แˆ แ‹ซแˆตแˆแˆแŒ software แŠ แ‰ฅแˆฎ แˆฐแ‰€แˆˆ โ€” แˆ›แŠ•แŠ›แ‹แˆ แ‰ฆแ‰ณ แ‹ญแˆฐแˆซแˆƒแˆ!
โŒ Docker แˆณแ‹ญแŠ–แˆญ โ€” แ‰ฝแŒแˆฎแ‰ฝ
โ€ข "แŠฎแˆแ’แ‹ฉแ‰ฐแˆฌ แˆ‹แ‹ญ แ‹ญแˆฐแˆซ แАแ‰ แˆญ!"
โ€ข Developer PC โ‰  Server
โ€ข Node version แ‹ญแˆˆแ‹ซแ‹ซแˆ‰
โ€ข DB version แ‹ญแˆˆแ‹ซแ‹ซแˆ‰
โ€ข Setup แˆˆแˆแˆ‰แˆ แˆฐแ‹ แ‹ซแˆตแ‰ธแŒแˆซแˆƒแˆ
โ€ข "แˆŒแˆŽแ‰น PC แˆ‹แ‹ญ install แŠ แ‹ตแˆญแŒ‹แ‰ธแ‹"
โœ… Docker แŠจแŠ–แˆจ โ€” แแ‰ฑ!
โ€ข Container แˆแˆ‰แˆ แ‰ฆแ‰ณ แŠ แŠ•แ‹ต แАแ‹
โ€ข Dev = Staging = Production
โ€ข Node version แŠ แ‰ฅแˆฎ แАแ‹
โ€ข DB version แŠ แ‰ฅแˆฎ แАแ‹
โ€ข docker run แ‰ฅแ‰ป แ‹ญแ‰ แ‰ƒแˆƒแˆ
โ€ข Team แˆแˆ‰ docker pull แ‰ฅแ‰ป!
02
Docker แ‹‹แŠ“ Concepts โ€” 4 แ‰แˆแ แ‰ƒแˆ‹แ‰ต

Docker แŠ• แˆˆแˆ˜แˆจแ‹ณแ‰ต แ‹‹แŠ“แ‹Žแ‰น 4 แ‰ƒแˆ‹แ‰ต แŠ“แ‰ธแ‹ โ€” Image, Container, Dockerfile, Docker Hubแข แŠฅแАแ‹šแˆ…แŠ• แŠซแ‹ˆแ‰…แˆ… Docker แˆ™แˆ‰ แˆˆแˆ™แˆ‰ แ‹ซแ‹แˆ…!

๐Ÿ“„
Image
App แŠ• แ‹จแˆšแ‹ซแˆฐแˆซ "แ‰…แ‹ณ"! Container แŠ• แˆˆแˆ˜แแŒ แˆญ แ‹ญแŒ แ‰…แˆ›แˆƒแˆแข Dockerfile แŠ• แˆฒ build แ‹ซแ‹ฐแˆญแŒ‰ Image แ‹ญแˆแŒ แˆซแˆแข
๐Ÿ“ฆ
Container
Image แˆฒ run แˆฒแˆ†แŠ• Container แ‹ญแˆ†แŠ“แˆƒแˆ! App แŠ• แˆฒ run แ‹ซแ‹ฐแˆญแŒ‹แˆƒแˆแข แ‰ฅแ‹™ Containers แŠ แ‰ฅแˆฎ แˆŠแˆฐแˆฉ แ‹ญแ‰ฝแˆ‹แˆ‰!
๐Ÿ—’๏ธ
Dockerfile
Image แŠ• แŠฅแŠ•แ‹ดแ‰ต แˆฐแˆซ? แ‹จแˆšแˆˆแ‹ แ‹แˆญแ‹แˆญ แŒนแˆ‘แ แАแ‹! Step-by-step instructions โ€” Node install, code copy, run!
๐Ÿช
Docker Hub
Images แŠ• แ‹จแˆšแ‰€แˆแŒฅ online แ‰ฆแ‰ณ! GitHub แŠ• แ‹ซแˆตแ‰ณแ‹แˆฐแ‹‹แˆ โ€” แŒแŠ• Code แ‹แŠ•แ‰ณ Images แ‹ญแ‰€แˆแŒฃแˆƒแˆ!

Image vs Container โ€” แ‰€แˆ‹แˆ‰ แˆแˆณแˆŒ:

๐Ÿ• Image = แ‹จแ’แ‹› Recipe (แˆ›แ‹˜แŒ‹แŒƒ แ‹ฐแ‰ฅแ‰ฐแˆญ) โ€” แ’แ‹› แˆแŠ• ingredients แŠ แˆˆแ‹? แŠฅแŠ•แ‹ดแ‰ต แ‹ญแˆฐแˆซแˆƒแˆ?
๐Ÿ• Container = แ‹ซ Recipe แˆฒ run แˆฒแˆ†แŠ• แ‹จแˆšแ‹ˆแŒฃแ‹ แ’แ‹›! แ‰ฅแ‹™ แŒŠแ‹œ แˆฐแˆญแ‰ถ แ‰ฅแ‹™ แ’แ‹› แˆ›แ‹แŒฃแ‰ต แ‹ญแ‰ปแˆ‹แˆƒแˆ!

โœ… แŠ แŠ•แ‹ต Image โ†’ แ‰ฅแ‹™ Containers!

03
Dockerfile โ€” Image แŠ• แŠฅแŠ•แ‹ดแ‰ต แˆฐแˆซ?

Dockerfile โ€” Image แŠ• แˆˆแˆ˜แˆตแˆซแ‰ต step-by-step instructions แ‹ซแˆˆแ‰ แ‰ต แ‹แ‹ญแˆ แАแ‹! Chef แŠ• Recipe แˆฒแŒฝแ แŠฅแŠ•แ‹ฐ แ‹“แ‹ญแАแ‰ฑ! Node.js App แŠ• แˆˆ Docker แˆˆแˆ›แ‹˜แŒ‹แŒ€แ‰ต แ‹ญแŒปแ‹แˆƒแˆแข

Dockerfile โ€” Node.js App แˆแˆณแˆŒ
# Step 1: Base image แˆแˆจแŒฅ (Node.js แ‹ซแˆˆแ‰ แ‰ต)
FROM node:18-alpine
# alpine = แ‰€แˆˆแˆ แ‹ซแˆˆ Linux version

# Step 2: Working directory แ‹ˆแˆตแŠ•
WORKDIR /app
# Container แ‹แˆตแŒฅ /app folder แ‹แˆตแŒฅ แˆแˆ‰ แ‹ญแ‰€แˆ˜แŒฃแˆƒแˆ

# Step 3: package.json copy แŠ แ‹ตแˆญแŒ (dependencies แˆˆ install)
COPY package*.json ./

# Step 4: Dependencies install
RUN npm install
# RUN = Image แˆต build แŒŠแ‹œ แ‹ญแˆฐแˆซแˆƒแˆ

# Step 5: แˆแˆ‰แˆ code copy แŠ แ‹ตแˆญแŒ
COPY . .

# Step 6: แˆแŠ• port แ‹ญแŒ แ‰€แˆ›แˆƒแˆ?
EXPOSE 3000

# Step 7: App แŠ• แŠฅแŠ•แ‹ดแ‰ต แŒ€แˆแˆญ?
CMD ["node", "server.js"]
# CMD = Container แˆฒ start แˆฒแˆ†แŠ• แ‹ญแˆฐแˆซแˆƒแˆ

Dockerfile แ‰แˆแ keywords โ€” แˆแŠ• แ‹ซแ‹ฐแˆญแŒ‹แˆ‰?

FROM
Base image แˆแˆจแŒฅ โ€” node:18, python:3, ubuntu... Docker Hub แŠจ แ‹ซแ‹ˆแˆญแ‹ณแˆƒแˆ
WORKDIR
Container แ‹แˆตแŒฅ working folder โ€” /app, /usr/src/app
COPY
PC แˆ‹แ‹ญ แ‹ซแˆˆ file แŠ• Container แ‹แˆตแŒฅ แ‰…แ‹ณ
RUN
Build แŒŠแ‹œ command แˆฐแˆซ โ€” npm install, apt-get...
EXPOSE
Container แˆแŠ• port แ‹ญแŒ แ‰€แˆ›แˆƒแˆ โ€” documentation แАแ‹
CMD
Container start แˆฒแˆ†แŠ• แŠ แˆตแˆฎแŒฅ โ€” ["node","server.js"]
04
แ‹‹แŠ“ Docker Commands
Terminal โ€” Docker Commands
# โ”€โ”€ IMAGE COMMANDS โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

$ docker build -t myapp:1.0 .
Image แˆฐแˆซ! -t = tag/แˆตแˆ, . = Dockerfile แ‰ฆแ‰ณ

$ docker images
แˆแˆ‰แˆ images แ‹แˆญแ‹แˆญ แŠ แˆณแ‹ญ

$ docker pull node:18
Docker Hub แŠจ image แŠ แ‹แˆญแ‹ต

# โ”€โ”€ CONTAINER COMMANDS โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

$ docker run -p 3000:3000 myapp:1.0
Container แŒ€แˆแˆญ! -p = port map (PC:Container)

$ docker run -d -p 3000:3000 --name myapp myapp:1.0
-d = background, --name = แˆตแˆ แˆฐแŒฅ

$ docker ps
Running containers แˆแˆ‰ แŠ แˆณแ‹ญ

$ docker ps -a
แˆแˆ‰แˆ containers (stopped แŒญแˆแˆญ)

$ docker stop myapp
Container แŠ แ‰แˆ

$ docker start myapp
Container แŒ€แˆแˆญ (stopped แŠจแˆ†แА)

$ docker rm myapp
Container แˆฐแˆญแ‹ (stop แŠซแ‹ฐแˆจแŒ‰)

$ docker logs myapp
Container แˆแŠ• log แˆฒแŒฝแ แАแ‰ แˆญ?

# โ”€โ”€ DOCKER COMPOSE โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€

$ docker compose up
แˆแˆ‰แˆ services แŠ แ‰ฅแˆฎ แŒ€แˆแˆญ

$ docker compose down
แˆแˆ‰แˆ แŠ แ‰แˆแŠ“ แˆฐแˆญแ‹
05
Docker Compose โ€” แ‰ฅแ‹™ Services แŠ แ‰ฅแˆฎ

MERN app แˆตแ‰ตแˆฐแˆซ 3 แАแŒˆแˆฎแ‰ฝ แ‹ซแˆตแˆแˆแŒ‹แˆƒแˆ โ€” React (frontend), Node.js (backend), MongoDB (database)แข Docker Compose แˆแˆ‰แŠ•แˆ แŠ แ‰ฅแˆฎ แ‰  แŠ แŠ•แ‹ต command แ‹ซแˆตแŒ€แˆแˆญแˆƒแˆ! docker compose up แ‰ฅแ‰ป!

docker-compose.yml โ€” MERN App
version: '3.8'

services:

  # โ”€โ”€ Frontend โ€” React โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  frontend:
    build: ./client
    ports:
      - "3000:3000"
    depends_on:
      - backend
      # backend แŠจแŒ€แˆ˜แˆจ แ‰ แŠ‹แˆ‹ แ‰ฅแ‰ป แŒ€แˆแˆญ

  # โ”€โ”€ Backend โ€” Node.js/Express โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  backend:
    build: ./server
    ports:
      - "5000:5000"
    environment:
      - DATABASE_URL=mongodb://mongo:27017/ethiocode
      - JWT_SECRET=mysecretkey
    depends_on:
      - mongo

  # โ”€โ”€ Database โ€” MongoDB โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  mongo:
    image: mongo:6
      # Docker Hub แŠจ MongoDB image แ‹ญแ‹ˆแˆญแ‹ณแˆƒแˆ
    ports:
      - "27017:27017"
    volumes:
      - mongo_data:/data/db
      # data แ‰‹แˆš แ‹ญแ‰€แˆ˜แŒฃแˆƒแˆ โ€” container แ‰ขแ‰†แˆแˆ!

volumes:
  mongo_data:
06
Live Docker Simulator

Docker Simulator! Containers แˆแˆ‰ แ‹ญแ‰ณแ‹ซแˆƒแˆ‰ โ€” แŒ€แˆแˆญ/แŠ แ‰แˆ/แˆฐแˆญแ‹! Commands แˆžแŠญแˆญ!

๐Ÿณ Docker Desktop Simulator
3 containers
๐Ÿ“ฆ Containers
โ–ถ Run
๐Ÿ”ง Compose
NAME STATUS IMAGE PORT ACTION

docker run command simulate แ‹ซแ‹ฐแˆญแŒ‹แˆƒแˆ! Image แˆแˆจแŒฅแฃ port แŒปแ โ†’ Container แ‹ญแˆฐแˆซแˆƒแˆ!

โ† Run แ‰แˆแ แŒซแŠ•

docker compose up โ€” แˆแˆ‰แˆ MERN services แŠ แ‰ฅแˆฎ แŒ€แˆแˆญ!
แŠ แŠ•แ‹ต command โ€” frontend, backend, database แˆแˆ‰ แ‹ญแˆฐแˆซแˆƒแˆ‰!

โ† compose up แŒซแŠ• โ†’ แˆแˆ‰แˆ services แ‹ญแŒ€แˆแˆซแˆ‰
07
แ‹‹แŠ“ แ‹‹แŠ“ แАแŒฅแ‰ฆแ‰ฝ
1
๐Ÿณ Docker = App + แˆแˆ‰แˆ Dependencies แŠ แ‰ฅแˆฎ แˆฝแŒ‹แŒฃ!

"แŠฎแˆแ’แ‹ฉแ‰ฐแˆฌ แˆ‹แ‹ญ แ‰ฅแ‰ป แ‹ญแˆฐแˆซแˆƒแˆ!" แˆˆแ‹˜แˆˆแ‹“แˆˆแˆ แ‹ญแŒ แ‹แˆƒแˆ! Container แˆแˆ‰แˆ แ‰ฆแ‰ณ แŠ แŠ•แ‹ต แˆ†แŠ– แ‹ญแˆฐแˆซแˆƒแˆ!

2
๐Ÿ“„ Image = Recipe, ๐Ÿ“ฆ Container = แ’แ‹›!

Dockerfile แŠ• แŒปแ โ†’ docker build โ†’ Image แ‰ฐแˆฐแˆซ โ†’ docker run โ†’ Container แ‹ญแˆฐแˆซแˆƒแˆ!

3
๐Ÿ—’๏ธ Dockerfile โ€” FROM โ†’ WORKDIR โ†’ COPY โ†’ RUN โ†’ CMD

แ‰…แ‹ฐแˆ แ‰ฐแŠจแ‰ฐแˆ‰ แ‹ญแˆ… แАแ‹! FROM=base image, RUN=install, CMD=app แŠ• แŒ€แˆแˆญ!

4
๐Ÿ”ง Docker Compose โ€” แ‰ฅแ‹™ Services แŠ แ‰ฅแˆฎ!

MERN app แŠ• docker compose up แŠ แŠ•แ‹ต command แ‰ฅแ‰ป โ€” frontend, backend, DB แˆแˆ‰ แ‹ญแŒ€แˆแˆซแˆ‰!

5
๐Ÿš€ Dev = Staging = Production = แŠ แŠ•แ‹ต!

Docker แˆˆ CI/CD pipeline แˆแˆญแŒฅ แАแ‹! GitHub Actions แŒ‹แˆญ แˆฐแˆญแ‰ฐแˆ… auto-deploy แˆ›แ‹ตแˆจแŒ แ‹ญแ‰ปแˆƒแˆƒแˆ!

08
Quiz
โ“ Dockerfile แ‹แˆตแŒฅ CMD แˆแŠ• แŒŠแ‹œ แ‹ญแˆฐแˆซแˆƒแˆ?
When does the CMD instruction in a Dockerfile execute?
Adocker build แˆฒแˆฐแˆซ
BContainer แˆฒ start แˆฒแˆ†แŠ• โœ…
Cdocker pull แˆฒแˆฐแˆซ
DDockerfile แˆฒ save แˆฒแˆ†แŠ•