Vì sao lại cần docker?

Truyền thống khi deploy một application lên Host (folder hay được gọi là một máy chủ vật lý)Host này củng có thể share để deploy nhiều application khác nhau, dẫn đến khi có một ứng dụng bị lỗi thì có thể dẫn đến tất cả các applications còn lại trong Host đó cũng sẽ lỗi.

Cách giải quyết truyền thống

  • Tạo ra một máy chủ ảo (Virtual Machines) và một ứng dụng chạy trên một VM nên chúng có được sự độc lập giữa những ứng dụng.

Hạn chế khi host ứng dụng trên Virtual Machines

  • Tốn nhiều tài nguyên mỗi VM cần có một hệ điều hành đầy đủ và một lượng tài nguyên cố định (CPU, RAM, đĩa cứng), điều này làm tăng chi phí sử dụng tài nguyên và yêu cầu bộ nhớ và CPU cao.
  • Thời gian khởi động lâu
  • Khó di chuyển và tái sử dụng

image

=> và Docker đã ra đời để giải quyết những vấn đề trên.

Sử dụng Docker như thế nào?

image

Dockerfile

Khi chúng ta có một Image, thì chúng ta có thể sửa đỏi Image đó thông qua Docker commit, ví dụ : khi chúng ta có Image của NoSQL chúng ta muốn tạo 1 password cho nó thì chúng ta phải thông qua Docker commit. Bây giờ nếu chúng ta cần thay đổi rất nhiều thứ thì sao, lúc này chúng ta sẽ cần đến Dockerfile.

Dockerfile như là một cuốn sách hướng dẫn để tạo ra Image cuối của ứng dụng.

# Stage 1: Build Angular app using Node.js
FROM node:16 AS build

# Thiết lập thư mục làm việc trong container
WORKDIR /app

# Sao chép package.json và package-lock.json để cài đặt dependencies
COPY package*.json ./

# Cài đặt dependencies
RUN npm install
....
  • ở đây FROM node:16 AS build là kéo image Node.js phiên bản 16 từ Docker Hub. Nó sẽ giúp tạo môi trường khi build ứng dụng Angular nhưng nó sẽ không nằm trong Image cuối cùng.
  • Những cái Image chúng ra kéo về từ Docker Hub chỉ để tạo môi trường hoặc chúng ứng dụng trong giai đoạn build chứ nó không nằm ở Image cuối. Nói chung Image không nằm trong Image.

Docker image

  • Docker image là một file chứa các source code, libraries, dependencies, tools và các files khác cần thiết cho một ứng dụng để chạy. Nó như một file dist sau khi chúng ta build code (file tĩnh) và bây giờ chỉ cần chúng ta thực thi nữa là nó sẽ tạo một application (docker container).
  • Nó là template để taọ ra container.
  • Docker image có thể bao gồm nhiều layer xếp chồng lên nhau, mỗi layer khác nhau nhưng cũng có nguồn gốc từ layer trước. Khi nhìn

    Khi bạn tạo một image từ Dockerfile, mỗi lệnh trong Dockerfile sẽ tạo ra một layer mới.

    Ví dụ:

    FROM node:16         # Layer 1: Base image Node.js
    COPY . /app          # Layer 2: Sao chép mã nguồn vào container
    RUN npm install      # Layer 3: Cài đặt dependencies
    

    Trong ví dụ này, Docker image sẽ có 3 layer:

    • Layer 1: Dựa trên image Node.js.
    • Layer 2: Sao chép mã nguồn vào thư mục /app.
    • Layer 3: Cài đặt dependencies với lệnh npm install.

    Mỗi layer khác nhau nhưng cũng có nguồn gốc từ layer trước

    • Layer mới luôn dựa trên layer trước đó, nó chỉ thêm các thay đổi (delta) mới vào layer cũ.
    • Layer trước vẫn được giữ nguyên và không bị thay đổi, giúp việc tái sử dụng các layer trở nên hiệu quả.
    • Nếu một layer không thay đổi, Docker sẽ sử dụng lại layer đó từ cache, giúp tăng tốc độ build.

    Docker image được tạo từ Dockerfile

    • Dockerfile là một file chứa các lệnh hướng dẫn Docker cách xây dựng một image.
    • Khi bạn chạy lệnh docker build, Docker sẽ đọc Dockerfile và tạo image bằng cách tạo từng layer tương ứng với mỗi lệnh trong Dockerfile.
    • Kết quả cuối cùng là một image chứa tất cả các layer được xếp chồng lên nhau.

    Tại sao Docker sử dụng kiến trúc nhiều layer?

    1. Tái sử dụng layer:

      • Nếu bạn đã build một image trước đó và chỉ thay đổi một vài lệnh trong Dockerfile, Docker sẽ tái sử dụng các layer không thay đổi, giúp tiết kiệm thời gian và tài nguyên.
    2. Giảm kích thước image:

      • Mỗi layer chỉ chứa những thay đổi so với layer trước, do đó dung lượng của image cuối cùng được tối ưu hơn.
    3. Phân phối nhanh hơn:

      • Khi đẩy image lên Docker Hub hoặc tải về từ Docker Hub, Docker chỉ truyền các layer mới hoặc khác biệt, giúp quá trình phân phối nhanh hơn.

Docker container

  • Là một phiên bản đang chạy của Docker Image. Có thể có nhiều Container từ một Docker Image.
  • Docker Container hoạt động độc lập nên đảm bảo không ảnh hưởng đến Container khác, giúp tránh xung đột cho ứng dụng. Nó có thể dùng 1 máy, chia sẻ kernel và giả lập môi trường để chạy process độc lập. Điều này làm cho container cực kì nhẹ, không chiếm nhiều tài nguyên của máy.

image

  • Container là một đơn vị phần mềm tiêu chuẩn hóa (tương tự virtual machines), bao gồm tất cả các yếu tố cần thiết để chạy ứng dụng: mã nguồn, thư viện, các phần phụ thuộc, tệp cấu hình và bất kỳ tài nguyên cần thiết nào.

    Cách thức hoạt động:

    1. Khi container được khởi động:

      • Docker sẽ tạo và bắt đầu container theo cấu hình mà bạn đã chỉ định, bao gồm cả việc khởi chạy ứng dụng Angular bên trong container.
      • Nếu bạn sử dụng Docker để chạy ứng dụng Angular, thường bạn sẽ có một Dockerfile chứa các lệnh để buildchạy ứng dụng khi container được khởi tạo. Ví dụ, nếu bạn sử dụng ng serve, nó sẽ bắt đầu chạy ứng dụng Angular ngay khi container khởi động.
    2. Khi bạn trỏ đến port (ví dụ http://localhost:4200):

      • Trình duyệt của bạn sẽ gửi một yêu cầu đến port 4200 trên host.
      • Docker sẽ chuyển tiếp yêu cầu đó đến port 80 trong container, nơi ứng dụng Angular của bạn đang chạy.
      • Tuy nhiên, ứng dụng Angular đã chạy từ trước khi yêu cầu đến, tức là ứng dụng đã ở trong trạng thái runtime từ khi container bắt đầu.

    Quá trình thực tế:

    • Chạy ứng dụng trong Docker container:
      • Docker sử dụng một Docker image chứa ứng dụng Angular đã được build và được cấu hình để khởi chạy ứng dụng khi container khởi động.
      • Docker image có thể bao gồm lệnh như ng serve, hoặc một server HTTP như Nginx để phục vụ ứng dụng Angular. Ứng dụng này bắt đầu ngay khi container khởi động.
    • Truy cập ứng dụng qua port:
      • Khi bạn trỏ đến port (ví dụ http://localhost:4200), ứng dụng Angular đã được chạy trước đó. Docker chỉ chịu trách nhiệm chuyển tiếp yêu cầu đến ứng dụng đang chạy trong container.

Ứng dụng

  • Khi chúng ta muốn xây dựng một hệ thống Micro FE thì sẽ có nhiều Responsitory. Để đơn giải quá lại chúng ta có thể sử dụng docker. Để build chúng thành nhiều container, sau đó đẩy những container này lên VM là xong.
  • Vậy trường hợp nếu chúng ta cập nhật 1 container thì sao, nó sẽ sinh ra downtime và khi đó chúng ta cần đến nhạc trưởng kubernetes giải quyết vấn đền này.