Hướng Dẫn Sử Dụng
Hướng dẫn cấu hình Proxy cấp hệ thống cho Docker container để build image và fetch package mượt mà

Mục lục
Tầm quan trọng của việc cấu hình proxy cho môi trường Docker
Trong môi trường phát triển phần mềm doanh nghiệp, hệ thống mạng thường được bảo vệ nghiêm ngặt phía sau các máy chủ proxy hoặc tường lửa nội bộ. Điều này đảm bảo an ninh mạng nhưng lại tạo ra rào cản lớn cho các kỹ sư DevOps khi sử dụng Docker. Những thao tác cơ bản như tải base image từ Docker Hub, cập nhật package thông qua lệnh của hệ điều hành, hay cài đặt thư viện phụ thuộc đều có thể gặp lỗi timeout hoặc không thể phân giải máy chủ.
Việc hiểu rõ cách thức phân luồng kết nối và áp dụng đúng cấu hình proxy docker là điều kiện tiên quyết để quy trình tích hợp liên tục diễn ra thông suốt. Docker hoạt động theo kiến trúc client-server, do đó một cấu hình mạng đơn lẻ trên máy chủ lưu trữ không thể tự động áp dụng cho toàn bộ các thành phần của Docker. Bạn cần phân biệt rõ ba phạm vi độc lập: proxy cho Docker daemon, proxy cho docker build, và http proxy docker container khi đang chạy.
Phân biệt ba phạm vi proxy trong kiến trúc Docker
Ba phạm vi cấu hình proxy độc lập cần phân biệt trong kiến trúc Docker: daemon, build và runtime.
Nhiều kỹ sư thường gặp lỗi thiết lập không hoạt động do nhầm lẫn giữa các tầng mạng của Docker. Dưới đây là ba phạm vi độc lập cần được cấu hình chính xác:
- Docker Daemon (dockerd): Chịu trách nhiệm kéo image từ registry công khai hoặc nội bộ về máy host. Proxy ở tầng này được cấu hình thông qua dịch vụ hệ thống.
- Quá trình build image (docker build): Các chỉ thị trong Dockerfile như cài đặt package cần kết nối internet thông qua proxy được truyền vào qua tham số build hoặc cấu hình máy khách.
- Container lúc thực thi (docker run): Môi trường bên trong container hoạt động độc lập và cần các biến môi trường proxy riêng biệt để các ứng dụng chạy bên trong giao tiếp ra bên ngoài.
Cấu hình proxy cho Docker Daemon thông qua systemd
Khi thực hiện câu lệnh kéo image nhưng nhận thông báo lỗi không thể kết nối tới máy chủ từ xa, nguyên nhân chủ yếu là Docker daemon chưa nhận diện proxy. Do Docker daemon được quản lý bởi systemd trên phần lớn các bản phân phối Linux, bạn cần can thiệp vào tệp cấu hình dịch vụ.
Bước 1: Tạo thư mục cấu hình ghi đè
Tạo một thư mục cấu hình riêng cho dịch vụ Docker để tránh bị ghi đè khi cập nhật gói phần mềm của hệ điều hành:
sudo mkdir -p /etc/systemd/system/docker.service.d
Bước 2: Tạo tệp cấu hình http-proxy.conf
Tạo và mở tệp cấu hình mới bằng trình soạn thảo văn bản:
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
Thêm các khai báo biến môi trường đại diện cho proxy HTTP, HTTPS và danh sách loại trừ không qua proxy:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080"
Environment="HTTPS_PROXY=http://proxy.example.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.internal"
Lưu ý: Giá trị NO_PROXY rất quan trọng để đảm bảo daemon không gửi yêu cầu qua proxy khi truy cập vào các registry nội bộ hoặc các dịch vụ cùng mạng cục bộ.
Bước 3: Tải lại cấu hình và khởi động lại dịch vụ
Áp dụng các thay đổi bằng cách nạp lại cấu hình systemd và khởi động lại dịch vụ Docker daemon:
sudo systemctl daemon-reload
sudo systemctl restart docker
Kiểm tra xem các biến môi trường đã được ghi nhận hay chưa bằng lệnh hiển thị thông tin hệ thống của Docker và tìm kiếm mục HTTP Proxy.
Thiết lập cấu hình proxy cho quá trình Docker Build
Quá trình nạp gói thư viện từ internet thông qua máy chủ proxy trong giai đoạn Docker build.
Khi xây dựng image, các chỉ thị thực thi việc fetch package từ kho lưu trữ bên ngoài như kho phần mềm của hệ điều hành hay kho thư viện ngôn ngữ lập trình sẽ thất bại nếu không có kết nối ra internet. Có hai cách tiếp cận chính để xử lý vấn đề này.
Phương pháp 1: Sử dụng tham số Build Args
Đây là phương pháp linh hoạt, áp dụng cho từng lệnh build cụ thể mà không làm thay đổi cấu hình mặc định của hệ thống. Bạn truyền trực tiếp các đối số vào câu lệnh:
docker build --build-arg HTTP_PROXY=http://proxy.example.com:8080 --build-arg HTTPS_PROXY=http://proxy.example.com:8080 --build-arg NO_PROXY=localhost,127.0.0.1 -t my-app:latest .
Ưu điểm của phương pháp này là tính tường minh, tuy nhiên nhược điểm là các thông số proxy có thể vô tình bị lưu lại trong lịch sử metadata của image nếu không được quản lý cẩn thận.
Phương pháp 2: Cấu hình tệp config.json của Docker Client
Từ các phiên bản Docker hiện đại, bạn có thể thiết lập proxy mặc định cho cả tiến trình build và container runtime thông qua tệp cấu hình client trên máy host. Tệp này nằm tại đường dẫn ~/.docker/config.json.
Mở hoặc tạo mới tệp và bổ sung khối cấu hình proxies:
{
"proxies": {
"default": {
"httpProxy": "http://proxy.example.com:8080",
"httpsProxy": "http://proxy.example.com:8080",
"noProxy": "localhost,127.0.0.1"
}
}
}
Khi cấu hình tệp này, Docker client sẽ tự động chèn các biến môi trường proxy tương ứng vào mỗi lần thực hiện docker build hoặc khởi tạo container mới mà không cần thêm tham số thủ công.
Cấu hình HTTP proxy cho Docker container khi vận hành
Đối với các container đang hoạt động cần truy xuất dữ liệu từ các API công khai hoặc cơ sở dữ liệu bên ngoài qua cổng proxy, bạn có thể áp dụng một trong các giải pháp sau.
Truyền biến môi trường trực tiếp qua lệnh docker run
Sử dụng cờ -e để truyền các biến môi trường tiêu chuẩn cho container:
docker run -d -e HTTP_PROXY="http://proxy.example.com:8080" -e HTTPS_PROXY="http://proxy.example.com:8080" -e NO_PROXY="localhost,127.0.0.1" my-app:latest
Khai báo trong Docker Compose
Nếu bạn triển khai ứng dụng dạng đa container thông qua Docker Compose, việc duy trì cấu hình thông qua tệp định nghĩa là lựa chọn tối ưu nhằm đồng bộ hóa môi trường:
version: '3.8'
services:
app:
image: my-app:latest
environment:
- HTTP_PROXY=http://proxy.example.com:8080
- HTTPS_PROXY=http://proxy.example.com:8080
- NO_PROXY=localhost,127.0.0.1
Xử lý proxy cho các trình quản lý gói đặc thù bên trong container
Mặc dù các biến môi trường hệ thống chuẩn thường được tôn trọng bởi hầu hết ứng dụng, một số trình quản lý gói ngôn ngữ hoặc tiện ích hệ điều hành vẫn yêu cầu cấu hình tệp riêng biệt bên trong Dockerfile để hoạt động ổn định.
Cấu hình cho trình quản lý gói hệ điều hành
Một số bản phân phối Linux yêu cầu khai báo proxy trong tệp cấu hình nội bộ của trình quản lý gói. Ví dụ, đối với các bản phân phối dựa trên Debian hoặc Ubuntu, bạn có thể tạo tệp cấu hình tạm thời trước khi chạy lệnh cài đặt:
RUN echo 'Acquire::http::Proxy "http://proxy.example.com:8080/";' > /etc/apt/apt.conf.d/proxy.conf
Cấu hình cho các công cụ phát triển phần mềm
Các công cụ như Git, trình quản lý gói của Python, Node.js đôi khi bỏ qua biến môi trường hệ thống nếu gặp vấn đề về chứng chỉ SSL hoặc định dạng chuỗi proxy. Bạn nên đảm bảo thêm các thiết lập tương ứng vào quy trình thiết lập môi trường để quá trình fetch package diễn ra trơn tru.
Một số lưu ý quan trọng về bảo mật và vận hành
Kiểm soát an toàn chứng chỉ SSL và bảo mật thông tin đăng nhập khi chuyển hướng kết nối qua proxy.
Khi triển khai docker proxy trên diện rộng, các kỹ sư cần lưu ý các khía cạnh an toàn thông tin sau:
- Tránh mã hóa cứng thông tin đăng nhập trong image: Tuyệt đối không lưu tài khoản và mật khẩu của máy chủ proxy trực tiếp vào Dockerfile. Nếu proxy yêu cầu xác thực, hãy sử dụng cơ chế bảo mật như secret mount của BuildKit.
- Cấu hình NO_PROXY cẩn thận: Đảm bảo tất cả các dải mạng nội bộ, tên miền của Docker daemon network và các dịch vụ cluster liên kết đều nằm trong danh sách loại trừ để tránh làm chậm hoặc đứt gãy kết nối nội bộ.
- Kiểm soát chứng chỉ số (CA Certificates): Nếu máy chủ proxy thực hiện kiểm tra sâu luồng dữ liệu (SSL Inspection), các tiến trình bên trong container sẽ báo lỗi từ chối chứng chỉ. Khi đó, bạn cần sao chép chứng chỉ gốc nội bộ vào thư mục chứng chỉ tin cậy của container trước khi fetch package.
Kết luận
Thiết lập đúng cấu hình proxy docker là bước khởi đầu quan trọng giúp loại bỏ hoàn toàn các lỗi mạng phiền toái khi làm việc trong hệ thống mạng doanh nghiệp. Bằng cách phân tách rõ ràng giữa Docker daemon, quá trình build và container runtime, bạn sẽ dễ dàng kiểm soát luồng dữ liệu, nâng cao tính ổn định cho quy trình CI/CD và đảm bảo an toàn cho toàn bộ hệ sinh thái phần mềm.
Bài viết liên quan
Sẵn sàng dùng proxy thật, không chỉ đọc hướng dẫn?
Mua proxy Residential, ISP, Datacenter hoặc Mobile — có ngay trong vài phút.
Xem sản phẩm