Docker image là một tệp dùng để thực thi mã trong một container Docker. Nó hoạt động như một tập hợp các hướng dẫn để xây dựng một container Docker, tương tự như một mẫu. Nói cách khác, chúng tương đương với các snapshot trong một môi trường máy ảo.
Docker image chứa tất cả các thư viện, dependencies và tệp cần thiết để chạy một container, khiến nó trở thành một tệp thực thi độc lập cho container. Những hình ảnh này có thể được chia sẻ và triển khai ở nhiều vị trí khác nhau để chúng có tính di động cao.
Browserless của Nstbrowser là một dịch vụ headlesschrome trên nền tảng đám mây, cho phép vận hành các ứng dụng trực tuyến và tự động hóa các tập lệnh mà không cần giao diện đồ họa người dùng. Nó đặc biệt hữu ích cho các công việc như thu thập dữ liệu web và các hoạt động tự động khác.
Bạn có ý tưởng tuyệt vời nào và nghi ngờ gì về việc thu thập dữ liệu web và Browserless không?
Hãy xem những gì các nhà phát triển khác đang chia sẻ trên Discord và Telegram!
Sử dụng Puppeteer trong Docker có ít nhất 3 lợi ích sau:
Ngoài ra, bằng cách chạy Puppeteer trong một container Docker, bạn có thể đảm bảo các phiên bản hệ điều hành và trình duyệt nhất quán trên tất cả các môi trường phát triển, kiểm thử và sản xuất. Điều này cũng có thể đơn giản hóa quá trình cài đặt trình duyệt Chrome và các dependencies của nó, cũng như dễ dàng mở rộng các instance container để xử lý các tác vụ quy mô lớn.
Hơn nữa, các container Docker cung cấp một môi trường cách ly, giúp giảm thiểu rủi ro bảo mật tiềm ẩn.
Trước khi sử dụng Docker Image của Nstbrowser, bạn cần thực hiện các công việc chuẩn bị sau:

Sau khi bạn đã hoàn thành các công việc chuẩn bị trên, bạn có thể sử dụng lệnh sau để tải về Docker Image của Nstbrowser:
# Tải về hình ảnh Browserless
docker pull nstbrowser/browserless:0.0.1-beta
# Chạy hình ảnh Browserless
docker run -it -e TOKEN=xxx -e SERVER_PORT=8848 -p 8848:8848 --name nstbrowserless nstbrowser/browserless:0.0.1-beta
# Sau khi chạy, bạn có thể sử dụng lệnh docker ps để kiểm tra xem container có đang chạy đúng cách không
docker ps

Bây giờ, tôi sẽ hướng dẫn bạn cách sử dụng Puppeteer dựa trên Docker Image của Nstbrowser để thu thập dữ liệu các trang web động. Và cùng bạn thực hiện từng bước để hoàn thành một ví dụ đơn giản.
Việc đầu tiên chúng ta cần làm là xác định thông tin mà chúng ta muốn thu thập. Trong ví dụ này, chúng ta sẽ chọn thu thập tất cả nội dung thẻ H2 của một Semrush Blog và in nó ra console.

Tiếp theo, chúng ta cần viết một script Puppeteer để thu thập thông tin mục tiêu. Dưới đây là đoạn mã Puppeteer để truy cập trang mục tiêu và lấy nội dung thẻ H2:
const page = await browser.newPage();
// Truy cập trang mục tiêu
await page.goto('https://www.semrush.com/blog/seo-best-practices/');
// Lấy nội dung thẻ h2
const h2s = await page.evaluate(() => {
const h2s = Array.from(document.querySelectorAll('h2'));
return h2s.map(h2 => h2.textContent);
});
// In nội dung thẻ h2
console.log(h2s);
Trước khi thực hiện bước này, vui lòng chạy lệnh sau để khởi tạo một dự án mới:
cd ~
makedir puppeteer-docker
cd puppeteer-docker
Tuyệt vời! Tiếp theo, chúng ta cần làm gì? Hãy tạo 3 tệp sau với mã của chúng ta:
import puppeteer from 'puppeteer-core';
async function execPuppeteer(browserWSEndpoint) {
try {
const browser = await puppeteer.connect({
browserWSEndpoint: browserWSEndpoint,
defaultViewport: null,
});
const page = await browser.newPage();
// Điều hướng đến URL mục tiêu
await page.goto('https://www.semrush.com/blog/seo-best-practices/');
// Lấy nội dung thẻ h2
const h2s = await page.evaluate(() => {
const h2s = Array.from(document.querySelectorAll('h2'));
return h2s.map((h2) => h2.textContent);
});
// In nội dung thẻ h2
console.log(h2s);
// Đóng trình duyệt
await browser.close();
} catch (err) {
console.error('launch', err);
}
}
async function launchAndConnectToBrowser() {
const host = 'host.docker.internal:8848';
const config = {
once: true,
headless: true, // Thiết lập chế độ không hiển thị
autoClose: true,
args: { '--disable-gpu': '', '--no-sandbox': '' }, // Tham số trình duyệt phải là một dictionary
fingerprint: {
name: '',
platform: 'mac',
kernel: 'chromium',
kernelMilestone: 124,
hardwareConcurrency: 8,
deviceMemory: 8,
},
};
const browserWSEndpoint = `ws://${host}/ws/connect?${encodeURIComponent(
JSON.stringify(config)
)}`;
await execPuppeteer(browserWSEndpoint);
}
launchAndConnectToBrowser().then();
FROM node:18-alpine AS base
# Cài đặt các dependencies chỉ khi cần thiết
FROM base AS deps
RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
RUN apk add --no-cache libc6-compat
RUN npm config set registry https://registry.npmmirror.com/
RUN npm install -g pnpm
# Thiết lập thư mục làm việc
WORKDIR /app
# Sao chép package.json và cài đặt các dependencies
COPY package*.json pnpm-lock.yaml ./
RUN pnpm install
WORKDIR /app
COPY --link ./ .
FROM base AS runner
# Sao chép các dependencies
COPY --from=deps /app/node_modules ./node_modules
# Sao chép mã ứng dụng
COPY --from=deps /app .
# Lệnh khởi động mặc định
CMD ["node", "index.mjs"]
{
"name": "docker-puppeteer",
"version": "1.0.0",
"main": "index.mjs",
"dependencies": {
"puppeteer-core": "^23.1.0"
},
"scripts": {
"start": "node index.mjs"
}
}
Tuyệt vời! Chúng ta đã tạo xong ba tệp cần thiết! Chỉ còn một bước chuẩn bị cuối cùng: cài đặt các phụ thuộc của dự án.
pnpm install
Bạn đã sẵn sàng chưa? Chúng ta có thể cuối cùng xây dựng và thu thập dữ liệu từ hình ảnh Docker:
docker build -t puppeteer-docker .
Bạn đã xong chưa? Vui lòng thực hiện lệnh sau để chạy hình ảnh puppeteer-docker của chúng tôi. Nó sẽ tự động chạy kịch bản Puppeteer của chúng tôi để thực hiện thao tác thu thập dữ liệu:
docker run --rm --network="host" puppeteer-docker
Cuối cùng, bạn sẽ thấy kết quả sau. Kết quả là chúng tôi đã thu thập tất cả các tiêu đề H2 trên trang web mục tiêu:

Tối ưu hóa hiệu suất Puppeteer trong môi trường Docker bao gồm một số chiến lược chính để đảm bảo các nhiệm vụ tự động hóa trình duyệt hoạt động hiệu quả.
Chọn một hình ảnh cơ bản nhẹ, chẳng hạn như node:alpine hoặc node:slim, để giảm kích thước của hình ảnh.
Loại bỏ các phụ thuộc và tệp không cần thiết, và giữ cho hình ảnh đơn giản bằng cách sử dụng các tệp .dockerignore và chỉ bao gồm các tệp cần thiết.
Kích hoạt chế độ headless ({ headless: true }) của Puppeteer. Chế độ này sẽ chạy trình duyệt mà không có giao diện đồ họa, giúp giảm mức tiêu thụ tài nguyên và cải thiện hiệu suất.
Đảm bảo rằng container Docker nhận đủ tài nguyên CPU và bộ nhớ để hoàn thành nhiệm vụ tự động hóa trình duyệt một cách thành công.
Bạn có thể sử dụng các tính năng giới hạn tài nguyên của Docker (chẳng hạn như --cpus và --memory) để quản lý việc sử dụng tài nguyên của container và ngăn ngừa sự cạnh tranh tài nguyên trong môi trường nhiều container.
Giảm số lượng lớp trong Dockerfile và kết hợp nhiều lệnh thành một lệnh RUN để rút ngắn thời gian xây dựng hình ảnh.
Sử dụng các build nhiều giai đoạn để tách biệt các phụ thuộc giữa các giai đoạn xây dựng và chạy, và tạo ra một hình ảnh cuối cùng mượt mà hơn.
Cải thiện hiệu quả xây dựng và rút ngắn thời gian xây dựng sau này bằng cách sắp xếp các lệnh trong Dockerfile một cách hợp lý để tận dụng bộ nhớ cache của quá trình xây dựng.
Tùy chỉnh các tham số khởi động trình duyệt của Puppeteer, chẳng hạn như args, executablePath, và ignoreDefaultArgs, để tối ưu hóa hành vi của trình duyệt và việc sử dụng tài nguyên.
Điều chỉnh các cờ khởi động Chromium để vô hiệu hóa các tính năng không cần thiết hoặc kích hoạt các tùy chọn cải thiện hiệu suất, chẳng hạn như tắt tăng tốc GPU thông qua --disable-gpu.
Triển khai các ứng dụng Puppeteer trên các nền tảng quản lý container như Docker Swarm hoặc Kubernetes, và tận dụng các khả năng mở rộng tự động, cân bằng tải, và quản lý tài nguyên mà các nền tảng này cung cấp.
Đạt được mở rộng theo chiều ngang, phân phối tải đến nhiều container, và cải thiện hiệu suất dưới các điều kiện lưu lượng cao.
Sử dụng các công cụ giám sát của Docker (như Docker Stats, Docker Events, và Docker Healthchecks) để theo dõi việc sử dụng tài nguyên và tình trạng sức khỏe của container.
Triển khai một giải pháp giám sát hiệu suất ứng dụng (APM) (như Prometheus, Grafana, hoặc Datadog) để theo dõi và phân tích các chỉ số hiệu suất chính như thời gian phản hồi, thông lượng, và tỷ lệ lỗi để xác định và giải quyết các nút thắt hiệu suất.
Chạy Puppeteer trong môi trường Docker mang lại nhiều tiện lợi hơn cho các nhà phát triển! Nó cung cấp một giải pháp linh hoạt và có thể mở rộng cho các nhiệm vụ tự động hóa trình duyệt.
Trong blog này, chúng tôi đã thảo luận về:
Bắt đầu sử dụng Browserless để xây dựng hình ảnh Docker mạnh mẽ của riêng bạn và tận hưởng việc thu thập dữ liệu!