Docker гэж юу вэ?

2B | +1% better 2day | dev.001

--

Хөгжүүлэгч нарын хэлэх хамгийн дуртай үг. 🤣

TL;DR

  • Docker != Virtual Machine
  • Same ENVIRONMENT everywhere
  • Less resource, Faster execution, Ease of use etc…

Хэдийгээр Docker нь VM-г бүрэн орлохгүй ч нилээн олон давуу талтай болохоор хаа сайгүй моодонд ороод байгаа байх. Анх үүссэн түүхийг нь уншмаар байвал энд дараарай.

Project Manager : It is NOT working!
Developer : It WORKS on my machine.
Project Manager : Then we will ship YOUR MACHINE.

гэдэг үгнээс гаралтай гэсэн яриа явдаг юм билээ. Худлаа л байх л даа. Гэхдээ гол санаа нь бол зөв байгаа биз? (яг адилхан байлгах гэсэн оролдлого)

Container (Docker) != Virtual Machines (VM)

Virtual Machine нь өөр дээрээ бүтэн үйлдлийн систем болон package суулган ажиллах бөгөөд Host-нхоо resource-г хувааж ашигладаг.

Host : total 4 CPU & 8 GiB RAM
— VM #1 : 2 CPU & 4 GiB RAM хуваарилах юм бол
— Host : хувьд хэрэглэж боломжтой 2 CPU & 4 GiB RAM-тай үлдэнэ

Docker нь тухайн компьютерыг ажиллуулж буй үйлдлийн системийн kernel-ийг хуваах замаар ажиллах тул байнгын их хэмжээний resource хэрэглэхгүй.

Host : total 4 CPU & 8 GiB RAM
— Host : 4 CPU & 8 GiB RAM-тай хэвээрээ
— Docker #1 : хэрэгцээгээрээ CPU болон RAM ашиглана

Docker is NOT virtual machines.

Install : Docker-н албан ёсны сайтаас суулгах зааварчилгаа харах — link

Lifecycle : #1 Dockerfile -> #2 Image -> #3 Container

Бүх зүйл л нэг цэгээс эхлэлтэй байдаг. Docker-н хувьд тэр цэг нь Dockerfile буюу Docker Image-ээ үүсгэх зааварчилгаанууд бүхий файл.

Dockerfile : is a set of instructions which are used to construct and build a docker image. Those instructions are called directives.

  1. FROM : Эхлэлийн эхлэл үндсэн суурь image-г зааж өгнө.
    - Үндсэн суурь (FROM ubuntu:18.04)
  2. ENV : Dockerfile болон container дотор хэрэглэж болох орчны хувьсагч.
    - Өөрт хэрэгтэй хувьсагчийг хадгалах (ENV SOME_VAR="/my_env_var")
  3. RUN : Өмнөх давхарга дээр шинэ давхарга үүсгэх команд.
    - Хэрэгтэй package-уудыг суулгах (RUN apt-get install -y nginx)
  4. COPY || ADD : Шинэ файл оруулах (багахаан ялгаатай 2 команд)
    - Ихэвчлэн апп source code-оруулахад хэрэглэдэг (COPY . /app)
  5. ENTRYPOINT : Docker container асах үед ажиллах команд
    - Nginx асаах (ENTRYPOINT ["/usr/bin/nginx", "-g", "daemon off;"])
  6. EXPOSE : Docker container доторх портыг гадагш нь зөвшөөрөх
    - Nginx 80 порт руу хандах боломжтой болгох (EXPOSE 80)
Example `Dockerfile`

Энд байгаа нэг мөр команд болгон 1 давхарга болж дээр дээрээсээ нэмэгдэж байдаг. (Layer #1 + Layer #2 + … + Layer #N = Docker Image)

Base Image Layer -> other Layers -> Container Layer (writable last layer)

Бусад : USER, WORKDIR, ARG, MAINTAINER, CMD, LABEL, VOLUME гэж байдаг ч бүгдийг нь дурдаад яахав. Хэрэгтэй үедээ л…

Docker Image нь өмнөх Dockerfile-г build хийсний үр дүнд гарч ирсэн зүйл. Өөрийн чинь бичсэн аппликэйшн ажиллахад хэрэгтэй бүх л зүйлс нь бэлэн орчин гэж хэлж болно. Давхарга бүр нь immutable (read only) буюу өөрчлөх боломжгүй image layer байдаг.

Docker Image : is a file containing the code and components needed to run software in a container.

# Dockerfile байгаа газар луу очин build хийх
cd $DIRECTORY_DOCKERFILE_IS_IN
docker build -t <image_name> .
# Docker image-үүдийг жагсаах
docker images
Dockerfile : (build) -> Docker Image

Image Layers : Docker Image-н олон давхаргатай үүсдэг нь хэд хэдэн давуу талтай байдаг.
1. Зай хэмнэх (small storage footprint)
2. Татаж авахад хурдан (faster download)
3. Image үүсгэхэд илүү хурдан (faster image build)

За одоо хамгийн ГОЛ хэсэг нь буюу Docker Container ажиллуулна. Энэ нь нэг ёсондоо хамгийн сүүлийн read & write боломжтой давхаргыг нэмж байгаа гэсэн үг.

Docker Container : is a standard unit of software that packages up code and all its dependencies so the application runs quickly and reliably from one computing environment to another.

# Docker Image нэрийг өгөн ажиллуулна (+бусад тохиргоо)
docker run --name <container_name> -d -p 8080:80 -ti <image_name>
# Docker Container-үүдийг жагсаах
docker ps

Docker Image ашиглан container run хийх үед бас тохиргоонууд өгөх боломжтой. Хамгийн түгээмэл хэрэглэдэг нь --name, -d, -p, гэх мэт.

Docker Image : (run) -> Docker Container
Хэрвээ Nginx команд зогсвол Docker Container гарах болно (exit)

За ингээд л болоо шүү дээ. Таны компьютер дээр Docker л байхад бүх зүйл байгаа гэсэн үг. Заавал ямар 1 юм суулгаад тохируулаад, дахин өөр хувилбар суулгаж чадахгүй болоод гэх мэт маш олон асуудлуудыг Docker шийдэж өгнө.

Өнөөдрийн хувьд гэхдээ ердөө илээд л өнгөрлөө. Цаашид мэдэх хэрэгтэй Docker Compose, Swarm, Stacks, Storage Driver & Logging Driver гэх мэт нилээн хэдэн зүйл байгаа. Дараачийнх дээрээ Docker Compose ашиглан хамгийн түгээмэл хэрэглэгддэг Node.js (Express) вэб апп + MySQL өгөгдлийн сантай бэлтгэх талаар оруулна аа.

Docker Compose { Node.js + MySQL }

--

--

Билигүн.Б (Програмч аав)
2B +1% better 2day

I am who I am... || өөрийнхөөрөө байхаас ичихгүй