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

Tin ngắn hàng ngày dành cho bạn
  • Rust sinh ra để tái định nghĩa nhiều thứ. Trong đó chắc phải kể đến JavaScript. Từ đầu năm đến giờ các công cụ làm từ Rust mà để cho JavaScript dùng đếm sương sương cũng vài ba cái rồi. Mới đây nhất là Oxc.

    Oxc là một công cụ phân tích cú pháp (parser), kiểm tra lỗi (lint), định dạng (formatter), chuyển đổi (transformer), minifier... tất cả đều được viết bằng Rust, trong một công cụ duy nhất.

    Mặc dù vẫn đang trong quá trình xây dựng nhưng thử nhìn điểm hiệu năng của nó so với swc hoặc eslint mà xem 🫣

    » Xem thêm
  • Mấy hôm nay, à mà cũng không hẳn, do sự kiện WWDC vừa rồi nên Apple lại bị dân cư mạng mang ra bàn tán rằng rốt cục thì các tính năng AI của họ đang ở đâu? Trong khi các hãng khác đang lao mình vào việc mang AI lên thiết bị, phần mềm của họ thì Apple lại đang có vẻ... không quan tâm lắm.

    Thậm chí mới đây các nhà nghiên cứu của Apple cho rằng các mô hình LLM sẽ "sụp đổ hoàn toàn về độ chính xác" khi được đưa ra các vấn đề cực kỳ phức tạp. Chỉ ra rằng suy luận chỉ là huyễn hoặc thì ngay lập tức đã có nhiều bài phản bác nghiên cứu này. Một lần nữa cho thấy rằng Apple đang suy nghĩ điều gì với AI trên thiết bị của họ?

    Mình thì nghĩ đơn giản thôi, Apple có vẻ đang gặp khó khăn với việc tạo ra AI cho riêng họ. Tức là khó khăn ngay từ đoạn thu thập dữ liệu để đào tạo rồi. Họ luôn tỏ ra tôn trọng quyền riêng tư của người dùng nên chẳng lẽ lại lên mạng đi xào nấu dữ liệu ở khắp nơi, hoặc "chôm" dữ liệu dưới máy người dùng lên? Chắc chắn, họ cũng không muốn cung cấp thêm dữ liệu người dùng cho các bên thứ 3 như OpenAI.

    Nhưng nhờ những khó khăn này biết đâu họ lại tìm ra được hướng đi mới. Ai cũng chọn phần dễ thì gian khổ để phần cho ai 😁. À mình không phải là "fan" của Apple, chỉ là thấy cái nào phù hợp thì dùng thôi 🤓

    » Xem thêm
  • Người "nhạy cảm" với markdown đó là khi thấy một thư viện tạo khung soạn thảo mới là nhảy ngay vào xem nó có gì mới. Milkdown/milkdown là một ví dụ.

    Xem thử thì thấy ổn phết mọi người ạ. Vài nữa thử tích hợp vào opennotas xem sao. Mang tiếng là ứng dụng ghi chú hỗ trợ markdown cơ mà cái thư viện tiptap nó không chịu làm thêm phần hỗ trợ markdown 😩. Dùng thư viện ngoài thì vẫn chưa ngon cho lắm.

    » 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

5 bài học sâu sắc

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào ngay!

Mỗi sản phẩm đi kèm với những câu chuyện. Thành công của người khác là nguồn cảm hứng cho nhiều người theo sau. 5 bài học rút ra được đã thay đổi con người tôi mãi mãi. Còn bạn? Hãy bấm vào 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...