Series về Docker trong thực thành & sản xuất - Thành phần cơ bản của docker và một số khái niệm thường gặp

Series về Docker trong thực thành & sản xuất - Thành phần cơ bản của docker và một số khái niệm thường gặp

Những mẩu tin ngắn hàng ngày dành cho bạn
  • Tin tức sáng sớm, mọi người còn nhớ vụ kiện của Ryan Dahl - hay nói đúng hơn là của nhóm Deno với Oracle về cái tên JavaScript không?

    Oracle đã phản hồi rằng họ không từ bỏ cái tên JavaScript đâu 🫣

    https://x.com/deno_land/status/1876728474666217739

    » Xem thêm
  • Mọi người nghỉ tết sớm rồi hay sao á? Nhiên cái nguyên tuần nay traffic giảm hẳn luôn 😳. Một mình tuôi nói kể cũng buồn, ai đi ngang qua đọc được thì thả một "còm men" cho vui cửa vui nhà nha. Nói gì cũng được vì ẩn danh cả mà 😇🔥

    » Xem thêm
  • Có người hỏi mình là cập nhật tin tức ở đâu mà nhanh thế, hay là kiếm ra được mấy cái tools, mấy cái projects... ở đâu mà nhiều thế? Thì có một nguồn xa tận chân trời mà gần ngay trước mắt đó chính là trang Github Trending này đây.

    Trang này thống kê lại các kho lưu trữ đang có lượt "star" nhiều nhất theo ngày/tuần/tháng. Nó còn xem theo được ngôn ngữ cơ, mà mỗi ngôn ngữ lại kiểu như một chủ đề á. Ví dụ Python thì hót rần rần về AI, LLMs..., Rust thì bao tools siêu mạnh, còn Go thì... đồ chơi liên tục 😁. Trong khi JavaScript 🫣😑

    » Xem thêm

Container

Container là một tiến trình (process) được chạy độc lập với các tiến trình khác trên máy chủ cài docker. Nó sử dụng kernel namespaces and cgroups - những tính năng này đã có trong Linux từ lâu, docker chỉ làm cho nó dễ tiếp cận và sử dụng hơn.

Hay nói một cách cho dễ hình dung, mỗi ứng dụng bạn chạy sẽ được chứa trong một container và chúng là độc lập với nhau.

Cú pháp cơ bản để khởi tạo một container chạy ứng dụng nginx là:

docker run --name my-nginx nginx

Trong đó --name là cờ đặt tên cho container, nginx là tên của image cần sử dụng để chạy container.

Để xem danh sách container đang chạy, sử dụng:

docker ps

Image

Để khởi tạo một container thì chúng ta cần phải có một file gọi là image.

Image bao gồm cả hệ thống file của container nên nó phải chứa mọi thứ cần thiết để chạy một ứng dụng như các dependency, các cấu hình, file hệ thống…

Tưởng tượng một image để chạy một ứng dụng node.js của bạn thì bên trong nó chứa các file hệ thống của os (filesystem), node.js runtime được tích hợp sẵn và thư mục project của bạn.

Các image cũng chứa các cấu hình khác như biến môi trường, các câu lệnh mặc định khi khởi chạy image...

Để tạo ra một image ta dùng đến Dockerfile. Dockerfile là một file dạng text, bên trong chứa các lệnh giúp bạn có thể tạo ra một image chứa ứng dụng của mình.

Một số lệnh cơ bản để thao tác với image gồm có:

# xem danh sách image có trong máy

$ docker image ls

# pull một image

$ docker pull image_name:tag

# push một image

$ docker push image_name:tag

Image trong docker được đánh dấu phiên bản bằng các tag. Ví dụ với một image là nginx có rất nhiều thẻ như latest, 1, 1.19, 1.19.10..., các tag thường được đánh theo version của chúng. Mặc định các lệnh mà có thao tác với image, nếu không chỉ định tag của image nó sẽ tự lấy tag là latest.

Network

Bởi vì các container trong docker là độc lập nên nếu muốn chúng giao tiếp được với nhau qua mạng thì bạn phải cần đến network. Network trong docker hoạt động như một mạng internet kết nối chúng lại với nhau.

Mặc định docker cung cấp một số loại mạng cơ bản như bridge, host, overlay, macvlan, none và các plugin khác. Trong đó có 3 loại đáng lưu ý:
Bridge là mạng mặc định được container sử dung khi chạy ứng dụng nếu không chỉ định bất kì loại mạng nào khác. Mạng bridge cung cấp giải pháp cho các container giao tiếp với nhau nếu cùng nằm trong một mạng. Tuy nhiên nếu chỉ định container chạy với mạng bridge mà không expose port ra máy chủ thì sẽ không truy cập được vào cổng đó bằng ip của máy chủ.

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

docker run --name nginx nginx

Mặc định nginx image được chạy ở cổng 80. Giả sử IP của máy chủ là 1.2.3.4 thì khi đó bạn truy cập http://1.2.3.4:80 sẽ không nhận được phản hồi từ nginx nào vì đơn giản container đang chạy ở mạng bridge và nó không được expose port 80 ra máy chủ docker.

Bây giờ hãy thử sửa lại câu lệnh chạy nginx một chút:

docker run --name nginx --port 8080:80 nginx

--port 8080:80 là cú pháp để expose port 80 của nginx ra port 8080 của máy chủ, bây giờ bạn truy cập http://1.2.3.4:8080 sẽ thấy phản hồi từ nginx.

Sử dụng mạng host thì container dùng chung mạng với máy chủ docker. Tức là nếu container chạy image nginx ở cổng 80 thì nó cũng sẽ có sẵn ở cổng 80 của máy chủ. Ví dụ.

docker run --name nginx --network host nginx

Thì lập tức port 80 của nginx được expose ra port 80 của máy chủ, đơn giản bởi vì khi chỉ định container chạy với mạng host thì nó dùng chung mạng với máy chủ. Bây giờ bạn truy cập http://1.2.3.4:80 sẽ thấy phản hồi từ nginx.

Overlay là mạng cho phép các container giao tiếp với nhau khi triển khai ở chế độ swarm. Khi docker ở chế độ swarm (nhiều máy chủ docker kết nối với nhau) các container sẽ được phân tán trên các máy chủ, lúc này để kết nối chúng thì chúng ta cần đến mạng overlay.

Registry

Registry là một kho lưu trữ các image của docker, ngoài registry của docker cung cấp docker hub thì cũng có rất nhiều những registry của các nhà cung cấp khác, thậm chí bạn cũng có thể tự tạo một máy chủ registry cho riêng mình.

Sử dụng registry giúp bạn có thể lưu trữ & phân phối ứng dụng của mình đến cho người khác, hoặc đơn giản là phục vụ cho cá nhân, trong nội bộ…

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

Dockerfile

Dockerfile là một file text bên trong chứ những lệnh giúp chúng ta build một image.
Trong Dockerfile có một cơ số lệnh đễ hỗ trợ việc tạo một image, bạn có thể tham khảo tại đây.

Ví dụ đây là một Dockerfile để build một app viết bằng node.js.

FROM node:12
ENV NODE_ENV=production

WORKDIR /app

COPY ["package.json", "package-lock.json*", "./"]

RUN npm install --production

COPY . .  

CMD [ "node", "server.js" ]

Sau đó tại thư mục có chứa Dockerfile, build image với tên là my-node-app:

docker build -t my-node-app .  

docker-compose

docker-compose là một công cụ cho phép khởi chạy ứng dụng gồm nhiều container docker-compose được viết bằng một file .yaml. Sau đó chỉ bằng một lệnh bạn có thể khởi động tất cả các service được cấu hình trong file.

Tưởng tượng ứng dụng node.js của bạn phải cần cả một máy chủ mysql để hoạt động, thay vì khởi chạy lần lượt node.js server, mysql server thì giờ đây bạn có thể đưa hết vào file docker-compose.yaml để khởi động tất cả cùng lúc.

Ví dụ:

version: "3.9"
services:  
  node:  
    image: my-node-app
    ports:  
      - "3000:3000"
    depends_on:  
      - mysql
  mysql:  
    image: mysql
    environment:  
      - MYSQL_USER=hoaitx
      - MYSQL_PASSWORD=password

Sau đó tại thư mục chứa file docker-compose.yaml vừa tạo hãy chạy nó bằng docker-compose:

docker-compose up -d

Lưu ý: Để dùng được lệnh docker-compose thì bạn cần phải cài đặt đó vì mặc định file cài đặt docker không bao gồm nó. Tham khảo tại đây.

Đừng quá lo lắng nếu như bạn chưa thực sự hiểu những những gì ở trong file yaml kia. Các lệnh là nhiều nhưng bạn chỉ cần hiểu ý nghĩa của một số lệnh cơ bản là có thể sử dụng được rồi.

Cũng giống như Dockerfile, docker-compose cũng sở hữu cho mình khối câu lệnh khổng lồ. Bạn có thể tham khảo tại đây. Mình sẽ có một bài nói về docker-compose & giới thiệu một số lệnh hay dùng của nó.

docker swarm

Docker swarm là một chế độ cho phép nhiều máy chủ docker kết nối với nhau để tạo nên một môi trường có khả năng scale và chịu lỗi.

Trong docker swarm, một máy chủ (node) có thể làm manager hoặc là worker. Nhiệm vụ của manager là quản lý các worker node còn nhiệm vụ của các worker là chạy các container.

Docker swarm là cần thiết trong việc triển khai production vì nó tạo ra môi trường đáng tin cậy.

Tổng kết

Trên đây là một số thành phần cơ bản của docker mà một số thuật ngữ hay gặp khi sử dụng docker. Đừng lo lắng nếu bạn chưa thể hiểu hết những thứ trên vì tôi sẽ cùng bạn đi lần lượt từng khái niệm trong cái bài viết tiếp theo.

Cao cấp
Hello

Tôi & khao khát "chơi chữ"

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Bạn đã thử viết? Và rồi thất bại hoặc chưa ưng ý? Tại 2coffee.dev chúng tôi đã có quãng thời gian chật vật với công việc viết. Đừng nản chí, vì giờ đây chúng tôi đã có cách giúp bạn. Hãy bấm vào để trở thành hội viên ngay!

Xem tất cả

Đăng ký nhận thông báo bài viết mới

hoặc
* Bản tin tổng hợp được gửi mỗi 1-2 tuần, huỷ bất cứ lúc nào.

Bình luận (0)

Nội dung bình luận...
Bấm hoặc cuộn mạnh để sang bài mới