Ở 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 containerOPTIONS
: 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ạyTAG
: tag của image, mặc định làlatest
COMMAND
: lệnh sẽ chạy trong containerARG
: 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áydocker build [OPTIONS] PATH | URL | -
: tạo image từ Dockerfiledocker push IMAGE[:TAG]
: đẩy image lên registrydocker 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 filedocker-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.