Docker 网络代理配置及防火墙设置指南

Docker 网络代理配置及防火墙设置指南

背景

在某些环境中,服务器无法直接访问外网,需要通过网络代理进行连接。虽然我们通常会在 /etc/environment/etc/profile 等系统配置文件中直接配置代理,但 Docker 命令无法使用这些配置。例如,在使用 docker pull 命令从外网拉取镜像时,可能会遇到如下错误:

docker pull hello-world
Unable to find image 'hello-world:latest' locally
Pulling repository docker.io/library/hello-world
docker: Network timed out while trying to connect to https://index.docker.io/v1/repositories/library/hello-world/images. You may want to check your internet connection or if you are behind a proxy..
See 'docker run --help'.

解决方案

防火墙设置

在进行 Docker 代理配置之前,建议先检查防火墙设置,确保相关端口已开放。以下是在 CentOS 7 上查看、防火墙状态以及启用/停用防火墙的方法:

  1. 查看防火墙状态

    systemctl status firewalld
    

    示例输出:

  2. 关闭防火墙

    systemctl stop firewalld
    
  3. 开启防火墙

    systemctl start firewalld
    
  4. 禁用防火墙(防止开机自动启动):

    systemctl disable firewalld
    
  5. 启用防火墙(设置为开机自动启动):

    systemctl enable firewalld
    
  6. 检查已开放的端口

    firewall-cmd --list-ports
    

在进行 Docker 代理配置时,如果防火墙开启,确保相关代理端口(如 2375, 1230)已通过防火墙放行。

方案一:通过手动启动 Docker Daemon 设置代理

  1. 停止 Docker 服务:

    systemctl stop docker.service
    
  2. 手动启动 Docker Daemon,监听所有网络接口:

    nohup docker daemon -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock &
    

更多详情可参考 Docker Daemon Socket 选项

方案二:配置系统级代理(不推荐)

可以通过修改系统配置文件来设置代理,如 Ubuntu 的 /etc/default/docker 或 CentOS 的 /etc/sysconfig/docker 文件,但这种方法已不再推荐使用。具体配置如下:

bash 复制代码
HTTP_PROXY="http://[proxy-addr]:[proxy-port]/"
HTTPS_PROXY="https://[proxy-addr]:[proxy-port]/"
export HTTP_PROXY HTTPS_PROXY

方案三:持久化的 Docker 代理配置

这种方法将代理配置持久化,使其在 Docker 服务每次启动时生效。

  1. 创建 Docker 服务的 systemd 配置目录:

    mkdir -p /etc/systemd/system/docker.service.d
    
  2. 创建代理配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf 并添加以下内容:

    ini 复制代码
    [Service]
    Environment="HTTP_PROXY=http://[proxy-addr]:[proxy-port]/" "HTTPS_PROXY=https://[proxy-addr]:[proxy-port]/"
  3. 如果有不需要使用代理访问的内部 Docker 镜像仓库,可以配置 NO_PROXY 变量:

    ini 复制代码
    [Service]
    Environment="HTTP_PROXY=http://[proxy-addr]:[proxy-port]/" "HTTPS_PROXY=https://[proxy-addr]:[proxy-port]/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
  4. 重新加载配置:

    systemctl daemon-reload
    
  5. 重启 Docker 服务:

    systemctl restart docker
    

更多细节请参考 Docker systemd 配置指南

使用 SOCKS5 代理

要为 Docker 配置 SOCKS5 代理,可以按以下步骤操作:

  1. 编辑 Docker 服务文件 /usr/lib/systemd/system/docker.service

    ini 复制代码
    [Service]
    Environment="HTTP_PROXY=socks5://127.0.0.1:1230/"
    Environment="HTTPS_PROXY=socks5://127.0.0.1:1230/"
    Environment="NO_PROXY=localhost,127.0.0.1,m1empwb1.mirror.aliyuncs.com,docker.io,registry.cn-hangzhou.aliyuncs.com"
  2. 重新加载服务配置并重启 Docker:

    systemctl daemon-reload
    systemctl restart docker
    
  3. 验证代理配置:

    systemctl show --property=Environment docker
    

如果输出的内容中包含 127.0.0.1:1230 这样的地址,表示配置成功。

测试

可以通过 docker pull 命令测试代理配置是否生效:

docker pull gcr.io/kubernetes-helm/tiller:v2.2.2

使用 ss -antp |grep EST |egrep '1080|1230' 命令查看连接状态,确保代理配置已生效。

相关推荐
码哝小鱼4 分钟前
firewalld封禁IP或IP段
linux·网络
汀、人工智能22 分钟前
修改Docker默认存储路径,解决系统盘占用90%+问题(修改docker root dir)
docker·容器
sec0nd_29 分钟前
1网络安全的基本概念
网络·安全·web安全
吃面不喝汤661 小时前
如何配置和使用自己的私有 Docker Registry
运维·docker·容器
Leighteen1 小时前
Docker常用命令
docker·容器
青柠视频云1 小时前
青柠视频云——视频丢包(卡顿、花屏、绿屏)排查
服务器·网络·音视频
网安CILLE1 小时前
2024年某大厂HW蓝队面试题分享
网络·安全·web安全
丶21361 小时前
【Nginx】在 Docker 上安装 Nginx 的详细指南
运维·nginx·docker
沐风ya1 小时前
Reactor介绍,如何从简易版本的epoll修改成Reactor模型(demo版本代码+详细介绍)
网络
SUGERBOOM1 小时前
【网络安全】网络基础第一阶段——第一节:网络协议基础---- OSI与TCP/IP协议
网络·网络协议·web安全