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
  • Diễn biến mới nhất của vụ kiện cái tên JavaScript với Oracle:

    Deno v Oracle Update 3: Fighting the JavaScript Trademark

    Tóm tắt lại Oracle đã nộp đơn bác bỏ yêu cầu của nhóm Deno nhưng cuộc chiến vẫn sẽ tiếp tục để đòi lại công bằng cho cộng đồng những người yêu thích JavaScript và mong muốn phát triển nó.

    » Xem thêm
  • Vậy là mình đã chính thức phát hành trang Cửa hàng trên blog 2coffee.dev rồi đó mọi người 🥳

    Đây đơn giản là các sản phẩm mình đã mua và trải nghiệm thấy tốt, phù hợp với giá tiền, với nhu cầu sử dụng của mình và mong muốn chia sẻ đến các bạn đọc. Mọi người ghé qua xem cho vui nha. Ban đầu chưa có nhiều thời gian để chỉnh sửa nội dung. Mình sẽ cập nhật dần dần nha. Cảm ơn mọi người.

    » Xem thêm
  • Cuối tuần đang ngồi làm cái Cửa hàng cho thư giãn mọi người ạ. Trước mình đã làm một lần rồi cơ mà làm cho có, bán được hẳn 1 cuốn sách 😆

    Giờ làm lại, sẽ đa dạng sản phẩm hơn. Dự là đăng mấy sản phẩm đã mua và dùng rồi kèm theo vài dòng nhận xét cho mọi người tham khảo 🤓

    » 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...