(Docker P.2) Các thành phần cơ bản của Docker

5 min read

Ở phần trước, tôi đã giới thiệu về Docker, một công cụ giúp chúng ta tạo ra các container chứa các ứng dụng một cách dễ dàng. Trong bài viết này, tôi sẽ giới thiệu về các thành phần cơ bản của Docker và cách chúng hoạt động với nhau.

Container

Container là một tiến trình chạy độc lập, nó sử dụng kernel namespace và cgroups để cô lập tài nguyên hệ thống, giúp container không ảnh hưởng đến các tiến trình khác trên hệ thống. Container chứa tất cả các thứ cần thiết để chạy ứng dụng, bao gồm các thư viện, biến môi trường, file cấu hình, và mã nguồn của ứng dụng.

Cú pháp cơ bản để tạo một container:

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]

Trong đó:

  • docker run: lệnh tạo và chạy container
  • OPTIONS: các tùy chọn khi tạo container, ví dụ: -d để chạy container ở chế độ daemon, -p để map port, -v để mount volume, …
  • IMAGE: tên của image mà container sẽ dựa vào để chạy
  • TAG: tag của image, mặc định là latest
  • COMMAND: lệnh sẽ chạy trong container
  • ARG: các tham số cho lệnh

Ví dụ:

docker run -d -p 8080:80 nginx

Lệnh trên sẽ tạo một container chạy nginx ở chế độ daemon, map port 8080 của host vào port 80 của container.

Image

Image là một bản snapshot của container, nó chứa tất cả các thứ cần thiết để chạy container, bao gồm các thư viện, biến môi trường, file cấu hình, và mã nguồn của ứng dụng. Image được tạo ra từ Dockerfile, một file chứa các hướng dẫn để tạo image.

Một số lệnh cơ bản với image:

  • docker pull IMAGE[:TAG|@DIGEST]: tải image từ registry về máy
  • docker build [OPTIONS] PATH | URL | -: tạo image từ Dockerfile
  • docker push IMAGE[:TAG]: đẩy image lên registry
  • docker images ls: liệt kê các image trên máy

Network

Các container là độc lập với nhau, nếu muốn chúng giao tiếp với nhau, chúng ta cần tạo ra một network để kết nối chúng với nhau. Docker hỗ trợ nhiều loại network, nhưng trong đó chúng ta cần lưu ý 3 loại phổ biến: bridge, host, overley

Bridge

Đây là loại network mặc định của Docker, nó cho phép các container trên cùng một host giao tiếp với nhau. Tuy nhiên, nếu container chạy với mạng bridg, chúng ta phải expose port ra ngoài để có thể truy cập vào container từ bên ngoài.

Ví dụ: Chạy một ứng dụng nginx bằng lệnh:

docker run --name my-web-app nginx

Mặc định, container này sẽ chạy ở port 80. Giả sử IP của host 127.0.0.1, khi truy cập vào http://1.2.3.5:80, bạn sẽ không thể truy cập được vào container. Để truy cập vào container, bạn cần expose port ra ngoài bằng cách:

docker run --name my-web-app -p 8080:80 nginx

-p 8080:80 có nghĩa là map port 8080 của host với port 80 của container. Bây giờ, bạn có thể truy cập vào container thông qua http://1.2.3.5:8080.

Host

Khi chạy container với network là host, container sẽ sử dụng network của host, không cần expose port ra ngoài. Điều này giúp container có thể truy cập vào các service chạy trên host mà không cần expose port ra ngoài.

Ví dụ: Chạy một ứng dụng nginx bằng lệnh:

docker run --name my-web-app --network host nginx

Khi đó, port 80 của container sẽ được expose ra ngoài mà không cần expose port ra ngoài. Bây giờ, bạn có thể nhận phản hồi từ http://1.2.3.5:80.

Overlay

Đây là loại network cho phép các container trên các host khác nhau giao tiếp với nhau. Chế độ này thường được sử dụng khi triển khai ở chế độ swarm.

Registry

Registry là nơi lưu trữ các image. Docker Hub là một registry phổ biến nhất, nơi chứa hàng ngàn image được chia sẻ từ cộng đồng. Bạn cũng có thể tạo ra một registry riêng để lưu trữ các image của mình.
Việc sử dụng registry giúp chúng ta dễ dàng lưu trữ và chia sẻ các image với người khác, hay đơn giản là lưu trữ các image của mình để sử dụng sau này.

Một số thành phần khác

Dockerfile

Dockerfile là một file text chứa các lệnh để build một image. Nó làm cho việc build image trở nên dễ dàng hơn, giúp chúng ta tạo ra các image một cách tự động và dễ dàng tái sử dụng. Dưới đây là một ví dụ về Dockerfile:

# Specify the base image
FROM node:14-alpine

#Update packages
RUN apk update && apk upgrade

# Set the working directory
WORKDIR /usr/src/app

# Copy the application files
COPY . .

# Install dependencies
RUN npm install

# Expose a port if your application listens on a specific port
EXPOSE 80

# Specify the command to run your application
CMD [ "npm", "start" ]

Saum đó, chúng ta có thể build image từ Dockerfile bằng lệnh:

docker build -t my-node-app .

Docker Compose

Docker Compose là một công cụ giúp chúng ta quản lý các container một cách dễ dàng. Nó cho phép chúng ta định nghĩa và chạy nhiều container cùng một lúc, cũng như cấu hình các network, volume, service,.. một cách dễ dàng. Cấu trúc của một file docker-compose.yml như sau:

version: '3'
services:
  service1:
    image: image1
    ports:
      - "8080:80"
  service2:
    image: image2
    ports:
      - "8081:80"
networks:
  my-network:
    driver: bridge
volume:
  my-volume:

Để làm viêc với Docker Compose, chúng ta có một số lệnh cơ bản sau:

  • docker-compose up: Chạy các container theo cấu hình trong file docker-compose.yml.
  • docker-compose down: Dừng và xóa các container đã chạy.
  • docker-compose ps: Hiển thị trạng thái của các container.
  • docker-compose logs: Hiển thị log của các container.

Docker Swarm

Docker Swarm là một công cụ giúp chúng ta quản lý nhiều container trên nhiều host. Nó cho phép chúng ta triển khai, quản lý và mở rộng các container một cách dễ dàng.

Trong Docker Swarm, các host được gọi là node, và chúng được chia thành 2 loại:

  • Manager node: Là node chịu trách nhiệm quản lý các container, cấu hình,.. trong cluster.
  • Worker node: Là node chịu trách nhiệm chạy các container.

Docker Swarm là một công cụ mạnh mẽ giúp chúng ta triển khai ứng dụng một cách dễ dàng, linh hoạt và mở rộng.

Kết luận

Trong bài viết này, tôi đã giới thiệu về các thành phần cơ bản của Docker và cách chúng hoạt động với nhau. Hi vọng bài viết sẽ giúp bạn hiểu rõ hơn về Docker và cách sử dụng nó trong công việc hàng ngày.

Tài liệu tham khảo

Avatar photo

Leave a Reply

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