my space

Docker Super Basic

docker

May 22, 2020

บันทึกการเริ่มใช้งาน docker (note มาจาก TechAgoda: Docker Zero to Hero)

  1. docker run สำหรับ run command บน container ด้วย docker image เช่นรัน node -v บน node:12-alpine (alpine เป็นชื่อ linux ตัวนึงที่เล็กมากๆ นิยมเอามาทำ docker image)
docker run node:12-alpine node -v
docker run node:12-alpine ls
  1. docker run -v {local directory}:{container directory} สำหรับการ link directory เรากับ container เช่นลอง link directory ปัจจุบันเป็น /app
(Mac)
docker run -v $(pwd):/app node:12-alpine ls /app
(Windows)
docker run -v %cd%:/app node:12-alpine ls /app
  1. docker ps สำหรับ List container ที่รันอยู่
  2. docker stop {id} Stop container ที่รันอยู่ (id ไม่ต้องใส่เต็ม ใส่ให้เป็นตัวที่น้อยและ unique ที่สุด)
  3. docker run -p {local port}:{container port} ทำการ map port จาก container ออกมาสู่ local เช่นเรารัน react app เราบน container (ปกติมันจะวิ่ง port 3000) ถ้าเราไม่ -p เพื่อ map port ออกมา แล้วเปิด localhost:3000 มันจะหาไม่เจอ (เพราะมันวิ่งอยู่ใน container)
$ docker run –p 4000:3000 –v $(pwd):/app –w /app node:12-alpine yarn
$ docker run –p 4000:3000 –v $(pwd):/app –w /app node:12-alpine yarn start

จากตัวอย่างข้างบน เราจะสามารถเข้าผ่านทาง localhost:4000 ได้ (command แรก yarn ลง dependencies แล้วก็ yarn start เพื่อ start project)

ทีนี้การที่ต้องมาพิมพ์​ command ยาวๆแบบนี้เรื่อยๆก็คงไม่ดี ซึ่ง Docker แก้ปัญหานี้ด้วยการให้เราสร้าง Docker image ขึ้นมาเองได้ โดย Docker image นั้นเรา customize มันได้ผ่านทาง Dockerfile

ตัวอย่าง Dockerfile ของ case ข้างบนคือ

FROM node:12-alpine
WORKDIR /app
COPY package.json /app
RUN yarn
COPY ./public /app/public
COPY ./src /app/src
CMD ["yarn", "start"]
  1. ทำการสร้าง Docker image จาก Dockerfile ข้างบนด้วย docker build
docker build -t my-todo .
  1. พอได้ Docker image แล้ว เราจะรันมันบน Container ด้วย docker run
docker run -p 4000:3000 my-todo

เหมือน basic จะจบ แต่ยังไม่จบแค่นี้เพราะ command มันก็ยาวอยู่ แถมรันได้แค่ 1 container ต่อการ execute อีก ถ้าอยากได้หลาย container ก็ต้องรัน docker run หลายๆที ไหนจะ build ไหนจะรัน นี้จึงเป็นที่มาของ docker-compose

version: "3.7"
services:
    todo:
        build: .
        image: my-todo
        ports: "4000:3000"

ถ้าจะรันหลายๆ container ก็

version: "3.7"
services:
    todo:
        build: .
        image: my-todo
        ports: "4000:3000"
    database:
        image: mysql:5
        environment:
            MYSQL_ROOT_PASSWORD: password

เวลาจะรันก็

$ docker-compose up

เวลาจะ stop ก็

$ docker-compose down

ไว้เขียนต่อคราวหน้าเรื่อง docker-compose และการคุยกันระหว่าง container


gie

Written by gie who lives and works in Bangkok. Build things by code.
my twitter | github