Cấu hình Docker sử dụng HTTP Proxy Server – Cuongquach.com | Khi dịch vụ Docker của bạn được chạy trong một hệ thống mạng nội bộ, ngăn biệt với hệ thống public internet thì khá là khó khăn để có thể ‘pull‘ những Docker Image từ bên ngoài như Docker Hub, kết nối public từ Docker Container đang chạy. Vậy thì thường các hệ thống đó sẽ có một máy chủ proxy đi public như Squid và các máy chủ nội bộ sẽ đi thông qua máy chủ này để đảm bảo vấn đề bảo mật nhưng vẫn kết nối Internet public được.
Nhu cầu chúng ta trong bài này, đó là cấu hình dịch vụ Docker sử dụng thông tin HTTP Proxy Server để kết nối Internet Public cho phép tải các Docker Image về sử dụng hoặc cho Docker Container đi public internet qua Proxy Server. Nếu không thì bạn sẽ hay gặp các trường hợp lỗi như sau .
Creating network "nginx_default" with the default driver Pulling nginx (nginx:latest)... ERROR: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Vậy bài viết sẽ giúp bạn xử lý 3 trường hợp:
- Pull image từ Docker public khi dùng lệnh ‘docker pull‘.
- Pull image base khi build Docker Image.
- Kết nối internet public từ Docker Container
1. Pull docker image
Đây là mô hình đầu tiên đó là cấu hình thông tin HTTP Proxy Server để dịch vụ Docker có thể kết nối ra Internet Public. Docker client sẽ tạo các truy vấn REST đến dịch vụ Docker, từ đó dịch vụ Docker sẽ đảm nhận các phần việc còn lại.
Tạo một file chứa thông tin biến môi trường về Proxy Server dành cho Docker sử dụng.
+ CentOS 6
# vi /etc/sysconfig/docker http_proxy="http://10.13.92.251:3128" https_proxy="http://10.13.92.251:3128" no_proxy="127.0.0.1, localhost"
+ CentOS 7
# vi /etc/sysconfig/docker http_proxy="http://10.13.92.251:3128" https_proxy="http://10.13.92.251:3128" no_proxy="127.0.0.1, localhost"
Xác định file khởi động của dịch vụ Docker.
+ systemd (CentOS 7+ / Ubuntu 16.04+)
# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled) ...
Yeah, file khởi động dịch vụ Docker trên hệ thống systemd đây : /usr/lib/systemd/system/docker.service
Giờ thêm dòng cấu hình sau vào file này dưới section [Service] , để khi dịch vụ Docker khởi động lại sẽ load các biến môi trường từ file ‘/etc/sysconfig/docker‘ mà bạn quy định.
# vi /usr/lib/systemd/system/docker.service .. [Service] EnvironmentFile=/etc/sysconfig/docker ..
Khởi động lại dịch vụ Docker để load thông tin biến môi trường.
# systemctl daemon-reload # systemctl restart docker
Thử pull lại Docker Image nào.
# docker pull nginx Using default tag: latest latest: Pulling from library/nginx 6ae821421a7d: Pull complete da4474e5966c: Pull complete eb2aec2b9c9f: Pull complete ..
+ init (CentOS 6- / Ubuntu 14.04-)
Tạo file môi trường thông tin proxy server cho docker.
# vi /etc/default/docker export http_proxy="http://10.13.92.251:3128" export https_proxy="http://10.13.92.251:3128" export no_proxy="127.0.0.1, localhost"
Với CentOS 6 thì nếu file /etc/default/docker
không work, thì bạn cho nội dung proxy vào file /etc/sysconfig/docker
thử rồi restart như dưới.
Khởi động lại dịch vụ Docker.
# service docker restart
2. Build docker image
Khi mà bạn build một Docker Image thì dịch vụ Docker sẽ khởi tạo một Container từ Base Image để build cũng như hoạt động khác là Docker Container được khởi chạy từ Image, thì các Container này cũng có nhu cầu truy xuất Internet Public qua HTTP Proxy Server.
Khi build docker image thì bạn cần truyền các biến môi trường riêng về thông tin Proxy Server cho quá trình build hoạt động xử lý tải dữ liệu từ bên ngoài public như cài đặt chương trình, cập nhật chương trình,…
# docker build \ --build-arg http_proxy=http://10.13.92.251:3128 \ --build-arg https_proxy=http://10.13.92.251:3128 \ -t yourimage .
3. Docker Container sử dụng Proxy
Bạn cần truyền biến môi trường về Proxy Server vào trong Container khi chạy một Docker Container từ Image . Lúc này Container sẽ có thông tin về HTTP Proxy Server để có thể thực hiện các kết nối public khi có nhu cầu.
# docker run \ --env http_proxy=http://10.13.92.251:3128 \ --env https_proxy=http://10.13.92.251:3128 \ myimage
Khá là đơn giản để xử lý tình huống sử dụng Docker trong hệ thống nội bộ cần kết nối Proxy Server để có thể kết nối Internet public. Chúc các bạn thành công.
Nguồn: https://cuongquach.com/