Series Jenkins Docker Hub #1: Giải mã "Bản gốc" và Nghệ thuật chạy Jenkins không mất trí nhớ
Nếu bạn dạo quanh các diễn đàn công nghệ, bạn sẽ thấy hiện nay không mấy ai (hoặc rất ít) tải file cài đặt của Jenkins (.war hoặc file .exe) về cài trực tiếp lên hệ điều hành nữa. Tất cả đều chuyển sang dùng Docker. Tại sao vậy?
1. Tại sao lại "nhốt" bác quản gia vào Docker?
Việc chạy Jenkins bằng Docker Image chính thức từ Docker Hub (jenkins/jenkins) mang lại 3 đặc quyền vô giá cho người làm DevOps:
- Môi trường vô trùng: Server của bạn không bị "rác". Không cần cài đặt Java JRE/JDK lằng nhằng lên server gốc. Mọi thứ Jenkins cần đều nằm gọn trong một cái hộp (Container).
- Khả năng nhân bản nhanh: Cần chuyển Jenkins sang một server mới mạnh hơn? Chỉ cần bê file cấu hình Docker sang, gõ 1 lệnh là xong. Không phải cài đặt lại từ đầu.
- Kiểm soát phiên bản: Bạn có thể khóa cứng phiên bản Jenkins ở một tag cụ thể (ví dụ: 2.401.1-lts) để tránh hệ thống tự update gây lỗi các plugin đang chạy ngon lành.
2. Khám phá "Bản gốc" trên Docker Hub
Khi bạn truy cập vào Docker Hub và tìm từ khóa jenkins, bạn sẽ thấy rất nhiều kết quả. Tuy nhiên, hình ảnh (Image) chính thức và được khuyên dùng nhất hiện nay là: jenkins/jenkins.
(Lưu ý: Image cũ có tên là jenkins đã bị deprecate/bỏ hoang từ lâu, đừng bao giờ dùng nó).
Kho chứa này cung cấp nhiều "tag" (nhãn dán) khác nhau. Nhưng với kinh nghiệm triển khai các hệ thống thực tế, bạn chỉ nên dùng nhãn lts (Long-Term Support). Đây là những phiên bản đã được kiểm thử kỹ lưỡng nhất, chạy ổn định, ít lỗi vặt, cực kỳ phù hợp cho môi trường Production.
3. Thực hành: Khởi chạy và bài toán "Mất trí nhớ"
Hãy mở Terminal lên và thử gõ một lệnh chạy Jenkins đơn giản nhất:
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
Lệnh này sẽ kéo Image từ Docker Hub về, mở cổng 8080 cho giao diện Web và 50000 để kết nối với các Agent (Node). Bạn vào localhost:8080 và thấy Jenkins đã chạy. Quá tuyệt!
NHƯNG KHOAN ĐÃ! Đây là cái bẫy lớn nhất của Docker!
Đặc tính của Docker Container là "Vô thường" (Ephemeral). Nếu bạn chạy lệnh trên, bạn cài plugin, bạn tạo 10 cái Pipeline, bạn lưu lịch sử build. Đùng một cái, server khởi động lại hoặc bạn lỡ tay xóa cái container đó đi. Kết quả? Toàn bộ dữ liệu của Jenkins bay màu sạch sẽ. Bác quản gia bị "mất trí nhớ" hoàn toàn và quay về trạng thái mới đẻ.
4. Kỹ thuật "Khắc cốt ghi tâm" với Docker Volumes
Để bác quản gia nhớ được mọi thứ dù có bị "giết" đi sống lại bao nhiêu lần, chúng ta phải dùng kỹ thuật Volume Mapping (gắn ổ cứng ngoài cho container).
Bên trong container của image jenkins/jenkins, toàn bộ não bộ (chứa config, plugin, lịch sử build) đều được lưu ở một thư mục cố định là: /var/jenkins_home.
Nhiệm vụ của chúng ta là "nối" thư mục này ra một thư mục an toàn trên ổ cứng của server vật lý.
Hãy chạy Jenkins với câu lệnh hoàn chỉnh và chuẩn xác sau:
# 1. Tạo một thư mục trên máy thật để lưu dữ liệu
mkdir -p /home/user/jenkins_data
# 2. Cấp quyền cho thư mục đó (Vì user bên trong container Jenkins có ID là 1000)
sudo chown -R 1000:1000 /home/user/jenkins_data
# 3. Chạy Jenkins kèm theo Volume
docker run -d \
--name my-jenkins \
-p 8080:8080 \
-p 50000:50000 \
-v /home/user/jenkins_data:/var/jenkins_home \
--restart always \
jenkins/jenkins:lts
Bóc tách các vũ khí trong lệnh trên:
- -d: Cho phép container chạy ngầm (Detached mode), không bị tắt khi bạn đóng cửa sổ Terminal.
- --name my-jenkins: Đặt một cái tên tử tế cho dễ quản lý, thay vì để Docker tự đặt những cái tên ngẫu nhiên.
- -v /home/user/jenkins_data:/var/jenkins_home: Đây chính là cỗ máy lưu trữ trí nhớ! Mọi thay đổi bên trong /var/jenkins_home sẽ được ghi thẳng ra /home/user/jenkins_data trên máy thật. Container có cháy rụi thì dữ liệu vẫn còn nguyên ở đó. Lần tới chạy container mới, chỉ cần map lại đúng đường dẫn này, bác quản gia sẽ "tỉnh dậy" và làm việc tiếp như chưa hề có cuộc chia ly.
- --restart always: Ra lệnh cho Docker tự động bật lại Jenkins nếu server vật lý bị sập nguồn hay khởi động lại.
Bạn đã nắm được cách khởi chạy và bảo vệ dữ liệu cốt lõi cho một phiên bản Jenkins chuẩn Docker Hub. Khởi đầu luôn cần sự chắc chắn để tránh những hậu quả đau thương về sau.
Tuy nhiên, phiên bản gốc này hiện tại chỉ là một "ông già tay không tấc sắt". Nó chưa có các công cụ để build code hiện đại. Ở bài tiếp theo, chúng ta sẽ bắt tay vào việc "Độ" (Customize) lại Image này, nhúng thêm Docker CLI và thiết lập cấu hình Docker-out-of-Docker (DooD) để Jenkins có thể đóng gói mọi loại Microservices nhé!
All rights reserved