在我的家中,為了確保網(wǎng)絡(luò)安全,所有的應(yīng)用默認(rèn)都只能訪問家庭內(nèi)網(wǎng),無法直接連接外網(wǎng)。同時為了讓家中設(shè)備能夠順暢地訪問外部網(wǎng)絡(luò)資源,我在局域網(wǎng)中配置了一臺代理服務(wù)器,通過 192.168.1.140:7890
這個地址可以實(shí)現(xiàn)外網(wǎng)訪問。因此,在使用 Docker 進(jìn)行容器化應(yīng)用的開發(fā)時,配置網(wǎng)絡(luò)代理是必不可少的一步,尤其是在拉取鏡像或運(yùn)行需要聯(lián)網(wǎng)的應(yīng)用時。
本文將介紹如何在不創(chuàng)建復(fù)雜網(wǎng)絡(luò)橋接的前提下,利用已有的 HTTP 和 SOCKS 代理為 Docker 配置網(wǎng)絡(luò),使得在這種受限網(wǎng)絡(luò)環(huán)境下依然能夠高效進(jìn)行開發(fā)。
適用場景
- 拉取鏡像時需要代理:某些公共鏡像倉庫在部分地區(qū)訪問緩慢,或因遭受網(wǎng)絡(luò)攻擊而難以直接連接,通過代理可以解決這些問題。
- 容器中訪問外部網(wǎng)絡(luò)資源:當(dāng)在容器中運(yùn)行的應(yīng)用需要訪問外部 API、下載數(shù)據(jù)或進(jìn)行其他網(wǎng)絡(luò)操作時,配置代理能夠保證這些操作的順暢進(jìn)行。
- 已有 HTTP 和 SOCKS 代理:如果你已經(jīng)在局域網(wǎng)或本地環(huán)境中配置了代理服務(wù)器,那么可以直接利用這些資源,而無需再進(jìn)行復(fù)雜的 Docker 網(wǎng)絡(luò)配置,如自定義網(wǎng)橋或額外的網(wǎng)絡(luò)插件。
一:配置 Docker 的全局代理
對于希望所有 Docker 操作都通過代理進(jìn)行的場景,最簡單的方式是修改 Docker 的配置文件 daemon.json
。此方法適用于需要全局代理的開發(fā)環(huán)境,比如經(jīng)常拉取公共鏡像的情況。
- 打開 Docker 配置文件:
sudo nano /etc/docker/daemon.json
- 添加以下內(nèi)容:
{ "proxies": { "httpProxy": "http://192.168.1.140:7890", "httpsProxy": "http://192.168.1.140:7890", "noProxy": "localhost,127.0.0.1" } }
在這段配置中:
httpProxy
和httpsProxy
分別指定了 HTTP 和 HTTPS 的代理地址,開發(fā)者可以根據(jù)自己的代理服務(wù)器進(jìn)行替換。noProxy
則用于指定哪些地址無需走代理,例如本地地址localhost
和127.0.0.1
,防止代理配置影響到本地開發(fā)。
配置完成后,保存并退出編輯器,然后重新加載和重啟 Docker 服務(wù)以使配置生效:
- 保存文件后,重啟 Docker 服務(wù):
sudo systemctl daemon-reload sudo systemctl restart docker
這樣,所有的 Docker 拉取和網(wǎng)絡(luò)訪問請求都會通過你設(shè)置的代理進(jìn)行。
二:在運(yùn)行容器時設(shè)置代理
在某些場景下,你可能并不希望為所有 Docker 操作都配置代理,而只希望特定的容器使用代理。例如,在開發(fā)或測試環(huán)境中,某些應(yīng)用需要訪問外部網(wǎng)絡(luò)資源,而本地網(wǎng)盤等應(yīng)用則不需要。在這種情況下,你可以在啟動容器時通過環(huán)境變量來設(shè)置代理,從而實(shí)現(xiàn)針對性配置,而無需修改全局 Docker 設(shè)置。
假如你有一個需要通過代理訪問外部網(wǎng)絡(luò)的容器,可以在啟動容器時通過 docker run
命令指定 HTTP 和 HTTPS 代理:
docker run -e HTTP_PROXY="http://192.168.1.140:7890" -e HTTPS_PROXY="http://192.168.1.140:7890" your_image_name
這會為該容器配置網(wǎng)絡(luò)代理,其他容器不會受到影響。
三:在 Docker Compose 中配置代理
對于使用 Docker Compose 管理多容器應(yīng)用的開發(fā)者來說,通過 docker-compose.yml
文件配置代理是更加高效和簡潔的方法。當(dāng)你的應(yīng)用由多個服務(wù)組成,并且這些服務(wù)都需要統(tǒng)一的代理配置時,這種方式可以大大簡化操作。
假設(shè)你有一個多服務(wù)應(yīng)用,并希望為其中的服務(wù)統(tǒng)一配置代理,你可以在 docker-compose.yml
文件中添加如下內(nèi)容:
version: '3' services: App: image: your_image_name environment: - HTTP_PROXY=http://192.168.1.140:7890 - HTTPS_PROXY=http://192.168.1.140:7890
在這里,environment
字段用于指定環(huán)境變量:
- 你可以為每個服務(wù)分別配置代理,這樣在啟動容器時,這些服務(wù)就會自動應(yīng)用代理設(shè)置。
- 這種方法在微服務(wù)架構(gòu)中尤為有效,特別是當(dāng)多個服務(wù)需要一致的網(wǎng)絡(luò)訪問策略時,通過
docker-compose.yml
文件集中管理可以減少重復(fù)配置的麻煩。
此外,如果你的 docker-compose.yml
文件中包含多個服務(wù),你可以為每個服務(wù)單獨(dú)配置代理,或者僅為需要的服務(wù)配置代理。例如:
version: '3' services: app1: image: image1 environment: - HTTP_PROXY=http://192.168.1.140:7890 - HTTPS_PROXY=http://192.168.1.140:7890 app2: image: image2 environment: # app2 沒有配置代理
此時,只有 app1
服務(wù)會通過代理訪問網(wǎng)絡(luò),而 app2
服務(wù)則不受代理影響。這種靈活性使得 Docker Compose 成為管理多容器應(yīng)用的得力工具。
作者聲明本文無利益相關(guān),歡迎值友理性交流,和諧討論~
,