【docker】Linux服务器上为yum 、java 和 docker设置HTTP代理

服务器访问外网需要走HTTP代理 http://proxy.example.com

curl 、wget 工具的使用要使用代理,如何在 /etc/profile 中配置?

要在 /etc/profile 中配置代理,使 curlwget 等命令通过指定的 HTTP 代理访问外网,请按以下步骤操作:

步骤 1:编辑 /etc/profile

使用 root 权限编辑文件:

sudo vi /etc/profile

步骤 2:添加代理配置

在文件末尾添加以下内容(替换实际用户名、密码和代理地址):

# 设置 HTTP 和 HTTPS 代理
export http_proxy="http://username:password@proxy.example.com"
export https_proxy="http://username:password@proxy.example.com"

# 可选:设置不经过代理的地址(如内网、本地)
export no_proxy="localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8"

# 同步大写变量(部分工具兼容大写)
export HTTP_PROXY="$http_proxy"
export HTTPS_PROXY="$https_proxy"
export NO_PROXY="$no_proxy"

关键说明:

  1. 变量作用

    • http_proxy / https_proxy:分别控制 HTTP 和 HTTPS 流量的代理。
    • no_proxy:排除代理的地址(逗号分隔),支持 IP 段(如 192.168.0.0/16)。
    • 注意wget 默认使用小写变量(http_proxy),而 curl 兼容大写和小写。
  2. 特殊字符处理

    • 如果密码包含特殊字符(如 @:%),需进行 URL 编码:
      • @%40
      • :%3A
      • 空格 → %20
      • 例如:密码 p@ss:w rd 应编码为 p%40ss%3Aw%20rd
  3. 端口指定

    • 如果代理使用非标准端口(如 8080),需显式声明:
      export http_proxy="http://username:password@proxy.example.com:8080"
      

步骤 3:应用配置

保存文件后,执行以下命令使配置立即生效(或重启终端):

source /etc/profile  # 对所有新终端会话生效

测试代理

  • 测试 curl

    curl -I http://example.com
    

    观察返回的 HTTP 状态码(如 200 OK)。

  • 测试 wget

    wget -O /dev/null http://example.com
    

    检查是否成功下载(无错误提示)。

常见问题排查

  1. 代理未生效

    • 确认已执行 source /etc/profile
    • 检查变量名拼写(大小写敏感)。
    • 使用 echo $http_proxy 验证变量值。
  2. 认证失败

    • 检查用户名/密码是否正确。
    • 确认特殊字符已正确编码。
    • 通过浏览器访问代理地址测试认证。
  3. 代理连接超时

    • 确保代理地址可访问:
      telnet proxy.example.com 80  # 测试代理端口连通性
      

安全建议

  • 限制权限:如果只需为当前用户设置代理,可改用 ~/.bashrc 代替 /etc/profile
  • 密码安全:避免在共享环境中明文存储密码,考虑使用代理的 IP 白名单或密钥认证。

通过以上配置,curlwget 及其他支持标准代理环境变量的工具(如 gitapt 等)均可自动使用代理。

如何给 yum 设置代理 ,安装 rpm包?

要为 yum 设置 HTTP 代理以访问外网安装 RPM 包,请按以下步骤操作:

方法 1:修改全局配置文件(推荐)

  1. 编辑 /etc/yum.conf 文件:

    sudo vi /etc/yum.conf
    
  2. 在文件末尾添加代理配置(根据代理类型选择一种):

    # HTTP/HTTPS 代理(无认证)
    proxy=http://proxy.example.com
    
    # 如果代理需要认证
    proxy=http://username:password@proxy.example.com
    
    # 指定端口(如 8080)
    proxy=http://proxy.example.com:8080
    
  3. 保存并退出(在 vi 中按 Esc 后输入 :wq)。

方法 2:临时设置环境变量

# 设置代理环境变量
export http_proxy=http://proxy.example.com
export https_proxy=http://proxy.example.com

# 运行 yum 命令(仅当前终端有效)
sudo yum install package-name

验证代理是否生效

sudo yum update  # 测试网络访问

注意事项

  1. 代理格式

    • 基础代理:http://proxy.example.com:端口
    • 带认证:http://用户:密码@proxy.example.com:端口
  2. 特殊配置

    • 排除内网地址(在 /etc/yum.conf 中添加):
      proxy_exclude=*.internal-domain.com,192.168.1.*
      
  3. 代理协议

    • 如果代理支持 HTTPS,建议使用 https:// 前缀提高安全性。

完成配置后,yum 将通过指定代理访问外网资源安装 RPM 包。如遇问题,可通过 yum -v debug 查看详细日志排查。

如何给 java工程启动设置http代理?

要为 Java 工程设置 HTTP 代理启动,可通过以下几种方式实现:

方式一:启动时添加 JVM 参数(推荐)

java -Dhttp.proxyHost=proxy.example.com \
     -Dhttp.proxyPort=80 \
     -Dhttps.proxyHost=proxy.example.com \
     -Dhttps.proxyPort=80 \
     -jar your-application.jar

方式二:设置环境变量(适用于所有 Java 应用)

# 临时设置(当前会话有效)
export JAVA_OPTS="-Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=80"
java $JAVA_OPTS -jar your-application.jar

# 永久设置(添加到 ~/.bashrc 或 /etc/profile)
echo "export JAVA_OPTS=\"-Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=80\"" >> ~/.bashrc
source ~/.bashrc

方式三:代码中设置(需修改源码)

public class Main {
    public static void main(String[] args) {
        // 设置代理
        System.setProperty("http.proxyHost", "proxy.example.com");
        System.setProperty("http.proxyPort", "80");
        
        // 如果需要认证
        System.setProperty("http.proxyUser", "username");
        System.setProperty("http.proxyPassword", "password");
        
        // 启动应用
        SpringApplication.run(Main.class, args);
    }
}

特殊场景处理

  1. 代理需要认证

    java -Dhttp.proxyHost=proxy.example.com \
         -Dhttp.proxyPort=80 \
         -Dhttp.proxyUser=your_username \
         -Dhttp.proxyPassword=your_password \
         -jar app.jar
    
  2. 排除内部地址不走代理

    java -Dhttp.nonProxyHosts="localhost|127.*|192.168.*|*.internal" \
         -Dhttp.proxyHost=proxy.example.com \
         -jar app.jar
    
  3. HTTPS 代理设置

    java -Dhttps.proxyHost=proxy.example.com \
         -Dhttps.proxyPort=443 \
         -jar secure-app.jar
    

验证代理是否生效

在代码中添加测试语句:

System.out.println("HTTP Proxy: " + System.getProperty("http.proxyHost"));
System.out.println("HTTPS Proxy: " + System.getProperty("https.proxyHost"));

注意事项

  1. 敏感信息安全:避免在命令行直接暴露密码,建议:

    • 使用配置文件读取凭证
    • 通过环境变量传递密码
    export PROXY_PASS=your_password
    java -Dhttp.proxyPassword=$PROXY_PASS ...
    
  2. 容器环境:若在 Docker 中运行,需在 Dockerfile 或启动命令中添加:

    ENV JAVA_TOOL_OPTIONS "-Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=80"
    
  3. Maven/Gradle:构建时也需要单独设置代理(与运行时无关)

推荐优先使用启动参数方式(方式一),既不需要改代码,又能保持环境干净。对于需要认证的代理,建议结合系统密钥库或配置中心管理凭证。

如何给运行在服务器上的docker设置代理?

要为运行在服务器上的 Docker 设置代理,使其能够通过 HTTP 代理 http://proxy.example.com 访问外网,需分两部分配置:Docker 守护进程(用于拉取镜像等操作)Docker 容器内部网络访问


一、配置 Docker 守护进程(Daemon)使用代理

此步骤让 Docker 引擎本身(如 docker pull)通过代理访问外网。

1. 创建代理配置文件

为 systemd 管理的 Docker 服务创建环境变量配置文件:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

2. 添加代理设置

在文件中写入以下内容(替换 http://proxy.example.com 为实际代理地址):

[Service]
Environment="HTTP_PROXY=http://proxy.example.com"
Environment="HTTPS_PROXY=http://proxy.example.com"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.internal"
  • NO_PROXY:指定不走代理的地址(如内网服务、私有镜像仓库等,按需修改)。

3. 应用配置并重启 Docker

sudo systemctl daemon-reload
sudo systemctl restart docker

4. 验证守护进程代理

systemctl show --property=Environment docker

若输出包含 HTTP_PROXYHTTPS_PROXY 则配置成功。


二、配置容器内部使用代理(容器内访问外网)

容器内部访问外网时需单独设置代理,有两种方法:

方法1:运行时传递环境变量(推荐)

docker run 命令中添加环境变量:

docker run \
  -e HTTP_PROXY=http://proxy.example.com \
  -e HTTPS_PROXY=http://proxy.example.com \
  -e NO_PROXY=localhost,127.0.0.1 \
  your_image

方法2:在 Dockerfile 中设置环境变量

在 Dockerfile 中固化代理配置(慎用,会限制镜像通用性):

ENV HTTP_PROXY="http://proxy.example.com"
ENV HTTPS_PROXY="http://proxy.example.com"
ENV NO_PROXY="localhost,127.0.0.1"

三、验证代理生效

  1. 守护进程代理验证
    运行以下命令测试 Docker Hub 访问:

    docker pull hello-world
    

    观察是否能正常拉取镜像。

  2. 容器内代理验证
    启动一个临时容器测试网络:

    docker run --rm -e HTTP_PROXY=http://proxy.example.com alpine wget -O- http://example.com
    

    若返回网页内容,则容器内代理生效。


注意事项

  1. 代理格式
    若代理需认证,使用 http://username:password@proxy.example.com 格式。

  2. NO_PROXY 的重要性
    避免本地服务(如数据库)的流量误走代理,务必在 NO_PROXY 中添加内网地址。

  3. DNS 解析问题
    若代理域名无法解析,在 /etc/hosts 中添加静态解析:

    x.x.x.x proxy.example.com
    
  4. Docker 版本兼容性
    以上方法适用于较新的 Docker 版本(≥ v17.07)。

通过以上步骤,Docker 守护进程及容器均可通过代理访问外网。

docker build 构建镜像,如何设置代理?

为 Docker Build 设置代理

在 Docker build 过程中设置代理有两种主要方法,确保构建过程中拉取基础镜像、下载依赖包等操作能通过代理访问外网:

方法 1:通过构建参数传递代理设置(推荐)

这是最灵活的方式,不会硬编码代理到 Dockerfile 中:

docker build \
  --build-arg http_proxy=http://proxy.example.com \
  --build-arg https_proxy=http://proxy.example.com \
  --build-arg no_proxy="localhost,127.0.0.1,internal.example.com" \
  -t your-image-name .

在 Dockerfile 中接收这些参数:

# 声明构建参数
ARG http_proxy
ARG https_proxy
ARG no_proxy

# 设置环境变量(所有后续RUN指令都会使用)
ENV http_proxy=$http_proxy
ENV https_proxy=$https_proxy
ENV no_proxy=$no_proxy

# 构建你的镜像
FROM ubuntu:latest
RUN apt-get update && apt-get install -y \
    curl \
    git

# ... 其他构建步骤 ...

# 可选:清除代理设置(避免代理信息保留在最终镜像中)
ENV http_proxy=
ENV https_proxy=
ENV no_proxy=

方法 2:直接在 Dockerfile 中设置代理(不推荐)

这种方法会将代理信息硬编码到 Dockerfile 中,降低了镜像的可移植性:

# 设置代理环境变量
ENV http_proxy=http://proxy.example.com
ENV https_proxy=http://proxy.example.com
ENV no_proxy=localhost,127.0.0.1

# 后续构建步骤
FROM alpine:latest
RUN apk add --no-cache curl git python3

方法 3:配置 Docker 守护进程全局代理(影响所有构建)

如果你希望所有构建操作都使用代理,可以配置 Docker 守护进程:

  1. 创建配置文件:
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf
  1. 添加代理设置:
[Service]
Environment="HTTP_PROXY=http://proxy.example.com"
Environment="HTTPS_PROXY=http://proxy.example.com"
Environment="NO_PROXY=localhost,127.0.0.1,docker-registry.example.com"
  1. 应用配置:
sudo systemctl daemon-reload
sudo systemctl restart docker

验证代理是否生效

在 Dockerfile 中添加测试步骤:

RUN echo "Testing proxy..." \
    && curl -v http://www.example.com \
    && curl -v https://www.google.com

构建时观察日志,确保请求通过代理:

docker build --no-cache -t proxy-test .

注意事项

  1. 代理格式

    • 需要认证的代理:http://username:password@proxy.example.com:port
    • 避免在 Dockerfile 中硬编码认证信息(有安全风险)
  2. NO_PROXY 设置

    --build-arg no_proxy="localhost,127.0.0.1,.example.com,192.168.0.0/16"
    
    • 包含所有不应通过代理访问的地址
    • 使用逗号分隔多个值
    • 支持域名后缀(.example.com)和 CIDR 表示法
  3. 区分大小写

    • Linux 系统通常使用小写(http_proxy
    • 某些工具可能需要大写(HTTP_PROXY
    • 最佳实践是同时设置:
      ENV http_proxy=$http_proxy HTTP_PROXY=$http_proxy
      
  4. 清除代理

    • 在构建结束前清除代理环境变量,防止泄漏到最终镜像:
      # 在构建完成前取消代理设置
      ENV http_proxy= https_proxy= no_proxy=
      

选择方法 1(构建参数)是最佳实践,它既保持了 Dockerfile 的可移植性,又能灵活应对不同构建环境的代理需求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。