Ám ảnh mang tên “Dependency Hell”
Chắc hẳn bạn đã từng rơi vào cảnh dở khóc dở cười: dự án A yêu cầu Terraform 0.12, nhưng dự án B lại bắt dùng bản 1.5 mới nhất. Éo le hơn, Ansible có khi đòi Python 3.8, trong khi máy bạn đã lên Python 3.11 để làm AI. Mỗi lần nhảy dự án là một lần cài cắm, cấu hình lại PATH, rồi bỗng một ngày hệ điều hành của bạn trở thành một mớ hỗn độn không lối thoát.
Tôi nhớ có lần mất trắng 4 tiếng chỉ để gỡ sạch AWS CLI v1 cũ kỹ nhằm cài v2 cho tương thích với tính năng EKS mới. Lúc đó, tôi tự hỏi: “Tại sao mình phải biến cái máy làm việc thành bãi thử nghiệm cho đủ loại công cụ như vậy?”. Docker không chỉ dành cho server, nó chính là “vị cứu tinh” giúp bạn cô lập hoàn toàn các công cụ này.
Tại một hệ thống tôi từng vận hành với hơn 50 dự án khác nhau, việc áp dụng Docker CLI giúp giảm 90% các lỗi liên quan đến môi trường và tiết kiệm hàng chục GB dung lượng lưu trữ từ các bản binary thừa thãi.
Docker: Chiếc “hộp sạch” cho mọi công cụ CLI
Thay vì cài trực tiếp binary vào hệ thống, chúng ta sẽ nhốt chúng vào container. Điểm hay nhất là mỗi container là một môi trường riêng biệt. Cần Terraform bản nào? Chỉ cần gọi đúng tag image đó. Chạy xong, container tự hủy, máy host của bạn vẫn sạch bong như mới.
Nhiều bạn sẽ lo lắng: “Chạy trong Docker thì làm sao nó đọc được file code hay credentials ở máy thật?”. Chìa khóa chính là Volume Mounting (tham số -v). Chúng ta ánh xạ thư mục làm việc hiện tại vào trong container. Nhờ vậy, CLI vẫn xử lý file của bạn bình thường, nhưng bản thân phần mềm thì nằm gọn trong “cái hộp” Docker.
1. Chạy AWS CLI: Tạm biệt bộ cài rườm rà
Thông thường, bạn phải tải MSI hoặc chạy script install phức tạp. Với Docker, chỉ cần một dòng lệnh để liệt kê bucket S3:
docker run --rm -it \
-v ~/.aws:/root/.aws \
amazon/aws-cli s3 ls
Phân tích nhanh các tham số:
--rm: Xóa sạch dấu vết container ngay sau khi lệnh thực thi xong.-it: Cho phép tương tác với terminal, cực kỳ cần thiết khi cần nhập password hay xác thực MFA.-v ~/.aws:/root/.aws: Chia sẻ quyền truy cập từ máy host vào container để AWS CLI nhận diện được account của bạn.
2. Quản lý hạ tầng với Terraform Docker
Thay vì dùng tfenv hay asdf, tôi ưu tiên dùng image chính chủ từ HashiCorp. Giả sử bạn đang đứng ở thư mục chứa file main.tf:
docker run --rm -v $(pwd):/workspace -w /workspace hashicorp/terraform:1.5.0 init
docker run --rm -u $(id -u):$(id -g) -v $(pwd):/workspace -w /workspace hashicorp/terraform:1.5.0 plan
Lưu ý quan trọng:
-w /workspace: Chỉ định thư mục làm việc ngay bên trong container.-u $(id -u):$(id -g): Flag này giúp file tạo ra không bị dính quyềnroot, tránh lỗi permission phiền phức trên Linux/macOS.
Dự án khác dùng bản cũ? Chỉ cần sửa 1.5.0 thành 0.12.31 trong nháy mắt.
3. Ansible: Không còn nỗi lo hỏng thư viện Python
Ansible thường kéo theo hàng tá dependency. Cài trực tiếp rất dễ làm hỏng các script Python quan trọng khác trên máy. Hãy thử dùng bản Alpine siêu nhẹ:
docker run --rm -it \
-v $(pwd):/ansible \
-v ~/.ssh:/root/.ssh:ro \
williamyeh/ansible:alpine-2.9 \
ansible-playbook -i hosts site.yml
Mẹo nhỏ: Tham số :ro ở cuối volume SSH giúp Ansible dùng key của bạn để kết nối server nhưng tuyệt đối không thể sửa đổi hay xóa file key gốc.
Dùng Alias để gõ lệnh mượt như cài thật
Chẳng ai muốn gõ một câu lệnh dài dằng dặc mỗi khi chạy terraform plan. Hãy tận dụng alias trong file .bashrc hoặc .zshrc để rút ngắn trải nghiệm:
# Thêm vào cấu hình shell của bạn
alias terraform='docker run --rm -v "$(pwd)":/workspace -w /workspace hashicorp/terraform:latest'
alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v "$(pwd)":/aws amazon/aws-cli'
Sau khi lưu, bạn chỉ việc gõ terraform plan hay aws s3 ls. Cảm giác mượt mà y hệt như đã cài đặt vào máy, nhưng thực chất bên dưới Docker đang lo liệu mọi thứ.
Ba lưu ý sống còn để tránh rắc rối
Dù rất tiện, bạn vẫn cần nhớ vài điểm để không bị “hớ”:
- Ưu tiên đường dẫn tương đối: Vì app chạy trong container, đường dẫn tuyệt đối kiểu
/Users/name/projectsẽ không tồn tại. Hãy luôn dùng./file_name. - Độ trễ khởi động: Docker mất khoảng 0.5 – 1 giây để khởi tạo container. Với lệnh CLI thông thường thì không sao, nhưng nếu bạn chạy script lặp lệnh hàng nghìn lần, hãy cân nhắc.
- Giao tiếp Network: Nếu container cần chọc vào
localhostcủa máy host, đừng quên thêm flag--network="host".
Kết luận
Chuyển sang dùng Docker cho CLI không chỉ là “đu trend” công nghệ. Đây là tư duy làm việc chuyên nghiệp để bảo vệ môi trường phát triển của bạn luôn ổn định. Bạn sẽ không còn lo sợ mỗi khi update OS hay đổi máy mới. Thử ngay với AWS CLI hoặc Terraform hôm nay, bạn sẽ thấy việc quản lý công cụ chưa bao giờ nhẹ nhàng đến thế.

