Quay lại danh sáchNhu cầu

Docker Proxy Là Gì? Hướng Dẫn Cấu Hình Proxy Cho Cả Daemon Và Container

Hướng dẫn chi tiết cách cấu hình HTTP/HTTPS Proxy cho Docker Daemon và Docker Container nhằm vượt tường lửa, sửa lỗi timeout khi pull image trong mạng nội bộ.

Do Ky Anh
Do Ky Anh
12/09/2026
8 phút đọc
Nhu cầu#docker#docker proxy#devops#systemd#networking
Docker Proxy Là Gì? Hướng Dẫn Cấu Hình Proxy Cho Cả Daemon Và Container

Trong môi trường phát triển và vận hành thực tế tại các doanh nghiệp, việc bảo mật an ninh mạng luôn là ưu tiên hàng đầu. Nhiều hệ thống nội bộ được thiết lập phía sau tường lửa (firewall) nghiêm ngặt và chỉ có thể kết nối ra ngoài thông qua máy chủ proxy. Khi làm việc với Docker trong môi trường này, bạn chắc chắn sẽ gặp phải các lỗi kết nối hoặc timeout khi tải image từ internet. Bài viết này sẽ giúp bạn hiểu rõ bản chất của docker proxy, phân biệt các loại proxy và hướng dẫn từng bước cấu hình chi tiết cho cả Docker Daemon lẫn Container. 🚀

Docker Proxy là gì và tại sao doanh nghiệp cần sử dụng?

Docker là một nền tảng mã nguồn mở giúp bạn xây dựng, triển khai và vận hành ứng dụng dễ dàng hơn bằng cách sử dụng các container. Được phát triển hoàn toàn bằng ngôn ngữ lập trình Go (Golang) ngay từ những phiên bản đầu tiên, Docker cung cấp hiệu năng vượt trội và khả năng tối ưu hóa tài nguyên cực tốt cho các kỹ sư DevOps và SysAdmin trên toàn thế giới.

Tuy nhiên, trong một hạ tầng mạng nội bộ bảo mật của doanh nghiệp, máy chủ chạy Docker thường không được phép truy cập trực tiếp ra internet. Lúc này, mọi kết nối mạng ra bên ngoài đều phải đi qua một cổng trung gian được kiểm soát gọi là Proxy Server.

Docker daemon kết nối tới Docker Hub hoặc registry khác khi chạy docker pull, đồng thời giao tiếp với các node trong Docker Swarm. Nếu không cấu hình proxy chính xác cho Docker daemon, các lệnh cơ bản như docker pull hoặc docker push sẽ thất bại hoàn toàn do không thể kết nối tới registry.

Hơn thế nữa, các chính sách phân phối tài nguyên của Docker Hub cũng ngày càng nghiêm ngặt. Hiện tại, Docker Hub giới hạn số lượng yêu cầu pull cho người dùng ẩn danh là 100 pull trong vòng 6 giờ. Việc cấu hình hệ thống proxy hoặc cache nội bộ không chỉ giúp bảo mật mà còn là giải pháp tối ưu để vượt qua các giới hạn băng thông này của doanh nghiệp.

Phân biệt cấu hình Proxy cho Docker Daemon và Docker Container

Trước khi bắt tay vào thiết lập, bạn cần phân biệt rõ hai loại cấu hình proxy hoàn toàn khác nhau trong hệ sinh thái Docker:

  1. Cấu hình Proxy cho Docker Daemon: Đây là thiết lập dành cho tiến trình chạy ngầm của Docker (Docker background service). Cấu hình này giúp Docker Daemon có thể vượt qua tường lửa để tải các container image từ Docker Hub hoặc các external registry khác về máy chủ.

  2. Cấu hình Proxy cho Docker Container: Đây là thiết lập truyền các biến môi trường proxy vào bên trong container khi khởi chạy. Nhờ đó, các ứng dụng chạy bên trong container (như ứng dụng web, script tải dữ liệu) mới có thể kết nối ra ngoài internet thông qua proxy.

Hiểu rõ sự phân biệt này sẽ giúp bạn tránh được những lỗi cấu hình sai vị trí dẫn đến việc container vẫn bị mất kết nối mạng dù bạn đã khai báo proxy.

Hướng dẫn cấu hình HTTP/HTTPS Proxy cho Docker Daemon

Để thiết lập proxy cho Docker Daemon, bạn có hai phương pháp phổ biến dưới đây tùy thuộc vào phiên bản hệ điều hành và cách quản lý dịch vụ của bạn.

Cách 1: Sử dụng file cấu hình daemon.json

Đây là cách cấu hình proxy cho Docker daemon trực tiếp bằng daemon.json. Bạn hãy mở hoặc tạo mới file /etc/docker/daemon.json và thêm cấu hình sau:

{

"proxies": {

"http-proxy": "http://username:password@proxy-host:3128",

"https-proxy": "http://username:password@proxy-host:3128",

"no-proxy": "localhost,127.0.0.1,.example.internal"

}

}

Cách 2: Cấu hình thông qua Systemd (Khuyên dùng cho Linux)

Đối với các hệ thống sử dụng systemd để quản lý dịch vụ, bạn có thể cấu hình proxy cho Docker daemon thông qua systemd bằng cách tạo drop-in file http-proxy.conf.

Trước hết, hãy tạo thư mục drop-in cho dịch vụ Docker:

mkdir -p /etc/systemd/system/docker.service.d

Tiếp theo, tạo file /etc/systemd/system/docker.service.d/http-proxy.conf và điền nội dung sau:

[Service]

Environment="HTTP_PROXY=http://username:password@proxy-host:3128"

Environment="HTTPS_PROXY=http://username:password@proxy-host:3128"

Environment="NO_PROXY=localhost,127.0.0.1,.example.internal"

Sau khi lưu file, bạn cần nạp lại cấu hình systemd và khởi động lại dịch vụ Docker để thay đổi có hiệu lực.

Sơ đồ mô phỏng kiến trúc Docker Proxy kết nối ra môi trường ngoài

Cấu hình Proxy cho Docker Container và Docker Client

Khi Docker Daemon đã có thể kéo image về máy, nhiệm vụ tiếp theo là giúp cho chính các container hoặc các lệnh build ứng dụng truy cập được internet thông qua proxy. ⚡

Cách 1: Thiết lập proxy mặc định cho Docker Client

Để cấu hình proxy tự động áp dụng cho mọi container được tạo ra bởi một user cụ thể, bạn có thể thiết lập proxy cho Docker client trong tệp ~/.docker/config.json như sau:

{

 "proxies": {

   "default": {

    "httpProxy": "http://username:password@proxy-host:port",

    "httpsProxy": "http://username:password@proxy-host:port",

    "noProxy": "localhost,127.0.0.1,::1"

   }

 }

}

Cách 2: Truyền tham số Build Argument khi build Image

Nếu bạn chỉ cần kết nối internet thông qua proxy trong quá trình xây dựng image (ví dụ để chạy lệnh npm install hoặc pip install), hãy sử dụng lệnh truyền các cấu hình proxy dưới dạng build argument khi build Docker image:

docker build \

--build-arg HTTP_PROXY=http://username:password@proxy-host:3128 \

--build-arg HTTPS_PROXY=http://username:password@proxy-host:3128 \

--build-arg NO_PROXY=localhost,127.0.0.1,.example.internal \

-t my-app:latest .

Cách 3: Cấu hình trực tiếp trong mã nguồn ứng dụng của Container

Trong một số trường hợp, nhà phát triển muốn ứng dụng bên trong container tự quản lý việc kết nối qua proxy thay vì phụ thuộc vào cấu hình hệ thống. Dưới đây là ví dụ mã nguồn Node.js sử dụng Axios và HttpsProxyAgent để thực hiện gọi API qua Squid Proxy:

const axios = require('axios');

const HttpsProxyAgent = require('https-proxy-agent');

const proxy = process.env.HTTPS_PROXY || 'http://squid:3128';

const agent = new HttpsProxyAgent(proxy);

axios.get('https://jsonplaceholder.typicode.com/todos/1', {

httpsAgent: agent,

proxy: false // Vô hiệu hóa cấu hình proxy mặc định của Axios

})

.then(res => console.log(res.data))

.catch(err => console.error(err));

Cách cấu hình biến môi trường NO_PROXY để tránh bypass dịch vụ nội bộ

Biến môi trường NO_PROXY đóng vai trò cực kỳ quan trọng trong việc tối ưu kết nối. Nó định nghĩa danh sách các địa chỉ IP, dải mạng hoặc tên miền mà hệ thống nên kết nối trực tiếp, hoàn toàn bỏ qua máy chủ proxy.

Nếu bạn không cấu hình đúng NO_PROXY, mọi yêu cầu kết nối tới các dịch vụ nội bộ hoặc cơ sở dữ liệu local nằm chung mạng LAN cũng sẽ bị gửi nhầm lên Proxy Server. Điều này không chỉ làm giảm hiệu năng hệ thống mà còn có thể gây ra lỗi rò rỉ dữ liệu hoặc lỗi kết nối không mong muốn.

Khi cấu hình NO_PROXY, hãy đảm bảo bạn đã thêm: Địa chỉ loopback: localhost, 127.0.0.1. Địa chỉ IP của các máy chủ nội bộ hoặc dải mạng LAN (ví dụ: 10.0.0.0/8, 192.168.0.0/16). * Tên miền nội bộ (ví dụ: .example.internal, .local).

Tận dụng Reverse Proxy và Mạng riêng trong Docker

Bên cạnh việc thiết lập Forward Proxy để đi ra ngoài internet, các kỹ sư DevOps cũng thường xuyên phải giải quyết bài toán định tuyến ngược để bảo vệ các microservices nội bộ.

Bạn có thể tận dụng tính năng mạng riêng của Docker để tạo Reverse Proxy cho dịch vụ mà không cần phải mở port kết nối ra bên ngoài. Bằng cách thiết lập một container Reverse Proxy (chẳng hạn như Nginx hoặc Traefik) nằm chung một mạng nội bộ ảo (Docker private network) với các ứng dụng khác, bạn chỉ cần mở cổng công khai duy nhất tại container proxy này. Toàn bộ các luồng giao tiếp phía sau sẽ được định tuyến an toàn tuyệt đối bên trong mạng riêng của Docker.

Câu hỏi thường gặp (FAQ)

Tại sao tôi đã cấu hình proxy trong daemon.json nhưng docker pull vẫn bị timeout?

Hiện tượng này thường xảy ra do xung đột cấu hình hệ thống. Nếu hệ điều hành của bạn sử dụng Systemd để quản lý dịch vụ và đã tồn tại file drop-in http-proxy.conf, các cấu hình trong systemd sẽ có độ ưu tiên cao hơn và ghi đè lên các giá trị khai báo trong daemon.json. Để khắc phục lỗi này, bạn nên tập trung cấu hình proxy tại một nơi duy nhất (khuyên dùng file cấu hình của systemd trên các hệ điều hành Linux hiện đại) và luôn nhớ reload lại daemon cùng với khởi động lại dịch vụ Docker bằng lệnh:

sudo systemctl daemon-reload && sudo systemctl restart docker


Bài viết liên quan

Blog - kaproxy.cloud