ท่าบ้านๆทั่วไปที่เจอกัน (Nestjs)
FROM node:14-slim
WORKDIR /usr/src/app
COPY package*.json ./
# If you add a package-lock.json speed your build by switching to 'npm ci'.
RUN npm ci --only=production
RUN npm i -g @nestjs/cli
# Copy local code to the container image.
COPY . .
# Display directory structure
RUN ls -l
# Expose API port
EXPOSE 3000
# Run the web service on container startup.
CMD [ "npm", "start" ]
[Dockerfiles] -> build -> [Docker Image] -> run -> [Container]
Build
docker build -t {image-tag} {path}
Run
docker run -p {out_port}:{in_port} -v {out_path}:{in_path} {img_tag}
#example
docker run -p 8888:8888 -v pwd:/work docker-example
- -p คือการ map port จากข้างใน Container มาข้างนอก
- -v คือการ map work directory ข้างในกับข้างนอก เพื่อที่เวลาเราแก้ไขไฟล์ที่เครื่องของเรามันจะเซฟกลับเข้าไปที่ใน Container ด้วย
Options เพิ่มเติม
- - entrypoint= : กำหนด entrypoint เองแทนส่วนใน Dockerfiles
- - e : กำหนด environment variables ด้านใน container
- - d : สั่งรัน container แบบ detached หรือคือเป็น background process
อธิบายเพิ่ม
โดยปกติ ports ที่ถูกเปิดไว้ภายใน container นั้นจะไม่สามารถเข้าใช้งานบน
Docker Host ซึ่งการที่จะเข้าใช้งานได้นั้นต้องทำ publish port ที่ต้องการก่อน ตั้งแต่ขั้นตอนการสร้าง container ขึ้นมา
สรุปคำสั่งใน docker file
FROM เลือก base image (pull มาาจาก dockerhub)
RUN execute command
CMD execute command แต่มีได้แค่ครั้งบเดียวใน file ถ้ามีมากกว่าหนึ่งจะใช้อันสุดท้าย หรือใช้เป็น default parameter ให้ ENTRYPOINT
LABEL ใส่ metadata ให้ image
EXPOSE กำหนดให้ container รอรับ request ตาม port ที่กำหนด ใช้คู่กับ -p ตอนใช้ docker run
ENV กำหนดตัวแปร environment ให้ตอนทำ image และ container
ADD copy file เข้า image
COPY copy file เข้า imageต่างกับ ADD ตรงที่ไฟล์ต้นฉบับได้เฉพาะ local เป็น remote url ไม่ได้
ENTRYPOINT คำสั่งที่จะให้ run หลังจากstart container
VOLUME กำหนด mount point ให้ image
USER กำนหด user ที่จะใช้ run คำสั่ง RUN CMD ENTRYPOINT
WORKDIR กำหนด working directory สำหรับ RUN CMD ENTRYPOINT COPY ADD
ARG กำหนดตัวแปรไว้สำหรับตอน BUILD
ONBUILD ใช้สำหรับให้ run คำสั่งแต่ให้รอ trigger เพื่อทำงานต่อในกรณีที่ต้องรอให้ build ตัวอื่นก่อน
STOPSIGNAL สั่งให้หยุดโดยใช้ system call signal
SHELL เปลี่ยนไปใช้ shell ที่กำหนด
คำสั่งที่ใช้บ่อย ๆ
- docker rm : ใช้ลบ container
- docker rmi : ใช้ลบ image / image tag
- docker start : start container ที่ถูกสร้างมาแล้วแต่ไม่ได้อยู่ในสถานะ running
- docker stop : ใช้หยุดการทำงานของ container ที่ running อยู่
- docker ps : ดู container ทั้งหมดที่ running อยู่
- docker ps -a** : ดู container ทั้งหมดที่เคยถูกสร้างขึ้นมา
- docker exec -it ${CONTAINER_ID} bash : ใช้เพื่อเข้าไปใน Container ->
- docker rmi -f $(docker images -a -q) delete all the images,
- docker rm $(docker ps -a -q) delete all the contanier reference
DockerCompose
แก้ปัญหา build dockerfile หลาย ๆ file
คำสั่งที่ดูจะคล้ายกัน
docker-compose up to start or restart all the services defined in a docker-compose.yml
docker-compose run command is for running “one-off” or “adhoc” tasks. It requires the service name you want to run and only starts containers for services that the running service depends on
docker-compose start Starts existing containers for a service.
https://www.jittagornp.me/blog/install-docker-compose-on-ubuntu-18.40/
คำสั่งที่เรามักจะหลงกลไกการทำงานของมัน
- docker-compose up ไม่ได้ rebuild images แต่ start
- docker-compose up --build rebuild and start
- docker-compose build rebuild เฉย ๆ
เรื่องที่ผมเพิ่งเข้าใจ
แบบเข้าใจง่าย ๆ ก่อน
- CMD คือ run OS แล้วทำงานเลย
- entrypoint คือเหมือน shortterm คำสั่ง
ว่ากันด้วยเรื่อง Shell and Exec Form
เกี่ยวกับ CMD and entrypoint
เรื่องที่มักจะสับสน
PORT ใช้เพื่อ mapping host server and Docker container
example 8080:80
80 in the container to port 8080 on the Docker host
EXPOSE ใช้เฉพาะกำหนด port application running
ที่มาของปัญหา
- รูปแรกลงอะไรจะอยู่ใน OS ก้อนเดียว version จะชนกันยับๆ
ใช้ VM HYPERVISOR ตัวนี้จะเป็นตัวจำลองการทำให้ให้ VM provide hardware เข้าไปใน Guest OS ได้เพื่อเข้าไปลง OS ให้มันทำให้ เปลืองทรัพยากร เสียเสียเวลา แล้วถึงจะลง application ที่เราต้องการได้
container docker agent จะจัดการ users space แบ่งแต่ละกล่องออกมาอย่างชัดเจน เช่น permission โดยที่ไม่กระทบ root ตัวจริง
การ mapping network
Top comments (0)