Tue. Jan 28th, 2025

Docker là gì ?

By admin Feb 27, 2024
download 3

Docker là một nền tảng mở dành cho các lập trình viên, quản trị hệ thống dùng để xây dựng, vận chuyển và chạy các ứng dụng phân tán. Docker giúp đóng gói phần mềm vào các đơn vị tiêu chuẩn hóa và được gọi là container. Ban đầu viết bằng Python, hiện tại đã chuyển sang Golang.

Docker là gì

1. Cách thức hoạt động của Docker

  • Docker hoạt động bằng cách cung cấp phương thức tiêu chuẩn để chạy code.
  • Docker là hệ điều hành dành cho container. Cũng tương tự như cách VM (loại bỏ nhu cầu quản lý trực tiếp) phần cứng máy chủ, các container sẽ ảo hóa hệ điều hành của máy chủ. Docker được cài đặt trên từng máy chủ và cung cấp các lệnh đơn giản sao cho có thể sử dụng để dựng, khởi động hoặc dừng container.

2. Docker và VM

Lý do docker ra đời :

Trước khi docker ra đời thì để có thể dựng nhiều môi trường trên cùng 1 resource hiện có thì VM(Virutal Machine) là phương pháp được sử dụng rất phổ biến. Tuy nhiên phương pháp này cũng tồn tại nhiều bất tiện như khi muốn kiểm tra từ môi trường dev => stagging => production thì rất khó khăn. Do các VM này chạy độc lập với nhau và các service cũng riêng biệt hẳn nên đôi khi khó làm cho các môi trường set up tương thích với nhau.

Ví dụ :

Để chạy 1 web bình thường đối với một VM cần cài đặt :

  • mysql server => mariadb, mysql, MSSQL,……
  • Web server => apache, nginx, lite speed, IIS…..
  • Các thư viện hay các ngôn ngữ.

Đối với phương thức này việc đồng bộ tương thích giữa 3 môi trường là rất khó bởi vì không phải bất kì service nào cũng có thể tương thích với tất cả các môi trường, ví dụ VM ở môi trường dev có thể cài được php56 nhưng môi trường stagging lại không thể cài được hay tương tự môi trường prodution.

Và việc cài đặt đúng service và đúng version sẽ rất khó, hoặc môi trường dev cần chuyển đổi lên php7.4 từ php5.6 thì trên môi trường stagging và produtin cần phải tiến hành cài lại php rất phức tạp chưa kể trogn quá trình cài có thể phát sinh lỗi gây ra mất đồng bộ.

Nếu chỉ dừng lại ở 3 VM thì có thể miễn cưỡng nhưng đối với một môi trường có khoảng 100 hay 1000 VM chạy thì điều này sẽ là một vấn đề cực kì đâu đầu.

Giải pháp được đặt ra là làm sao để các môi trường này có thể khớp và gần như giống nhau để có thể tiến hành chuyển đổi môi trường làm việc được trơn tru ??

=> Một trong các giải pháp đó là Docker với Docker Engine.

3. Docker container

Như đã đề cập ở ví dụ trên, việc chia sẽ với nhau giữa các môi trường khá phức tạp. Ví dụ như làm sao cài đúng service, cài đúng version…. là rất khó đối với 1 hệ thống lớn.
Giải pháp vấn đề này là Docker và Docker Engnine.
Về cơ bản docker cũng sẽ như việc ảo hóa VM sẽ chi nhỏ phần cứng ra nhiều phần với Docker engine. Nhưng Docker Engine lại chi nhỏ thành các Container thay vì VM.

  • Container là một hình thức ảo hóa hệ điều hành, bên trong là các packages, một số dependencies. Dùng để giải quyết vấn đề chuyển giao phần mềm một cách đáng tin cậy giữa các môi trường khác nhau. Docker container image là một gói phần mềm nhẹ, chạy độc lập và có thể thực thi bao gồm mọi thứ để chạy ứng dụng như: code, runtime, system tools, system libraries và settings mà không bị các yếu tố môi trường hệ thống làm ảnh hưởng và ngược lại.
  • Container images sẽ trở thành containers trong khi chạy. Và nếu đó là Docker containers – images trở thành container khi chúng chạy trên Docker. Có thể chạy trên cả Linux và Windows, Containerized Software sẽ luôn chạy giống nhau, bất kể hạ tầng nào. Chúng tách biệt với môi trường của nó và đảm bảo chúng sẽ hoạt động đồng nhất mặc dù trong quá trình phát triển hay staging.

Hiểu đơn giản thì như thế này:

  • Đối với VM thì các service sẽ chạy riêng lẻ và phải cài đặt từng cái một. Khi đưa lên một VM hay một môi trường khác thì sẽ phải cài lại toàn bộ các service đó và phải cài đúng phiên bản của nó.

  • Đối với Container thì các service kia sẽ được đóng thành một gói bao gồm bên trong là các packages, hình dung cho đơn giản là container là một cái hộp bên trong sẽ để vào đó cả một hệ thống hay nói cách khác là tất cả các gói/service/phiên bản làm sao cho cái hệ thống đó hoạt động. Sau đó đóng gói và gửi đi, đến bên mới chỉ cẩn mở hộp và lấy lần lượt các package ra để chạy trên đó.

Để hiểu thêm về container thì sẽ có thêm một bài viết về Docker container ở đó sẽ nói thêm về đặc điểm và lợi ích….

4. Phân biệt dockerfile, Image và container

 

 

4.1 Docker image

  • Docker image là một ảnh của một môi trường phát triển (có thể hiểu là snapshot). Nói ngắn gọn là chúng ta có thể gói các cài đặt môi trường (OS, package, phần mềm của chúng ta đã viết, …) lại thành 1 cục duy nhất, đó chính là docker image. Khi đã có docker image, ta có thể khởi tạo các docker container từ docker image.

  • Nếu liên tưởng đến OOP, thì có thể xem docker image là class, còn docker container là object / instance của class đó!

  • Vì vậy nếu có 1 docker image trên máy, có thể tạo một hoặc nhiều container có môi trường bên trong chúng giống hệt nhau.

  • Ok, vậy làm sao để tạo ra 1 docker image? Câu trả lời đó chính là viết Dockerfile. Ta build Dockerfile để tạo ra docker image (docker image thường có dung lượng nhỏ từ vài MB đến lớn vài GB)

4.2 Dockerfile

Dockerfile là file chứa các đặc tả về môi trường thực thi phần mềm. Dễ hiểu nó chỉ là file text thôi, và có các câu lệnh cài đặt quen thuộc. Dĩ nhiên cũng sẽ có 1 số câu lệnh hỗ trợ bởi docker.
Cú pháp của một Dockerfile
Cú pháp chung của một Dockerfile có dạng:
INSTRUCTION arguments

  • INSTRUCTION là tên các chỉ thị có trong Dockerfile, mỗi chỉ thị thực hiện một nhiệm vụ nhất định, được Docker quy định. Khi khai báo các chỉ thị này phải được viết bằng chữ IN HOA.
  • Một Dockerfile bắt buộc phải bắt đầu bằng chỉ thị FROM để khai báo đâu là image sẽ được sử dụng làm nền để xây dựng nên image của bạn.
  • aguments là phần nội dung của các chỉ thị, quyết định chỉ thị sẽ làm gì.
    Ví dụ :
FROM python:alpine3.7

RUN apk add git \
            wget \
            nano

COPY ./main.py /home

CMD ["python" "/home/main.py"]
  • FROM: môi trường của mình sẽ được dựng trên môi trường đặc tả sau lệnh FROM, ở đây mình dùng môi trường python 3.7, hệ điều hành alpine 3.7 (link docker image ở đây). Có rất nhiều môi trường có thể bắt đầu như ubuntu, centos, …
  • python:alpine3.7: tên của 1 docker image có cấu trúc như sau: tên_image:version. Cho cùng 1 image python, ta có thể có nhiều phiên bản khác nhau.
  • Các câu lệnh tiếp theo trong file lần lượt mô tả các package sẽ được cài đặt vào môi trường (hệ điều hành alpine, ta phải dùng lệnh “apk” thay vì “apt” như trên Ubuntu), copy source code file main.py từ máy thật vào trong image có đường dẫn /home.
  • Cuối cùng là câu lệnh thực thi khi container được dựng lệnh / khởi động.

4.3 Container

Docker container là máy ảo chứa môi trường phần mềm.

Ví dụ, 1 container có thể chứa môi trường:

  • OS: Ubuntu 16.04
  • Đã cài sẵn 1 số package như: git, curl, wget, nano, … (hoặc package nào mong muốn tùy nhu cầu mà chọn image hoặc viết Dockerfile tương ứng)
  • Đã cài web app
  • Web app đang chạy ở port 8080 trên môi trường ảo đó

Vì môi trường ảo trong container là cô lập, nên có 2 thành phần sau thường mapping môi trường ảo với máy thật để dễ access và kiểm soát tài nguyên:

  • cổng kết nối: port. Ví dụ web bên trong container chạy ở port 8080, nhưng mong muốn có thể access web của tại port 9090 trên máy thật chẳng hạn. Nếu bằng cách nào đó quên mapping port lúc start container lên thì sẽ không access được web app đó.

  • đường dẫn thư mục: volume. Quá trình container chạy có thể sản sinh ra 1 số file (ví dụ: file log chương trình), nếu không “mount” volume giữa thư mục máy thật và đường dẫn thư mục bên trong container (nơi sẽ chứa file sẽ được sản sinh) thì các file được sinh ra trong quá trình chạy ứng dụng của sẽ nằm bên trong container mà không thấy / xem được trên máy thật. Sau khi mount volume đường dẫn thành công thì các file sẽ được ghi ra đường dẫn máy thật đã đặc tả.

Để theo dõi thêm nhiều bài viết cùng chủ đề các bạn có thể theo dõi thêm tại đây.

By admin

Related Post

Leave a Reply

Your email address will not be published. Required fields are marked *

error: Content is protected !!
Don`t copy text!