如何在docker-compose中使用本地代理设置

27
我正在为我们的Redmine安装设置一台新服务器,因为旧的安装是手动完成的,这使得更新所有内容变得困难。我决定使用Docker镜像,但由于错误消息的原因,启动docker容器时遇到问题。主机在代理服务器后面运行,我认为这可能导致问题出现,因为其他所有东西,如wget、curl等,都正常工作。
错误消息:
Pulling redmine (redmine:)...
ERROR: Get https://registry-1.docker.io/v2/: dial tcp 34.206.236.31:443: connect: connection refused

我在谷歌上搜索有关在代理服务器下使用Docker/Docker-Compose的内容,发现了一些网站上有相同问题的人,但这些网站并没有真正帮助我解决我的问题。

我查阅了Docker文档,并找到了一个指南,但这似乎对我不起作用:https://docs.docker.com/network/proxy/

我还在StackOverflow上找到了一个已回答的问题:Using proxy on docker-compose in server,这可能是我需要的解决方案,但我不确定具体要把解决方案放在哪里。我猜这个人是指docker-compose.yml文件,但我可能错了。

这是我的docker-compose.yml文件的样子:

version: '3.1'

services:

redmine:
 image: redmine
 restart: always
 ports:
   - 80:3000
 environment:
   REDMINE_DB_MYSQL: db
   REDMINE_DB_PASSWORD: SECRET_PASSWORD

db:
image: mysql:5.7
restart: always
environment:
  MYSQL_ROOT_PASSWORD: SECRET_PASSWORD
  MYSQL_DATABASE: redmine

我希望能够无上述错误信息地运行以下命令

docker-compose -f docker-compose.yml up -d
2个回答

52
我做了更多的研究,似乎使用了更好的关键词,因为我现在找到了解决方案。我想与大家分享这个解决方案,以防其他人以后可能会需要。
  • 创建一个文件夹来配置通过systemd运行Docker服务

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

  • /etc/systemd/system/docker.service.d/http-proxy.conf中创建一个服务配置文件,并将以下内容放入新创建的文件中

[Service]
 # NO_PROXY is optional and can be removed if not needed
 # Change proxy_url to your proxy IP or FQDN and proxy_port to your proxy port
 # For Proxy servers that require username and password authentication, just add the proper username and password to the URL. (see example below)

 # Example without authentication
 Environment="HTTP_PROXY=http://proxy_url:proxy_port" "NO_PROXY=localhost,127.0.0.0/8"

 # Example with authentication
 Environment="HTTP_PROXY=http://username:password@proxy_url:proxy_port" "NO_PROXY=localhost,127.0.0.0/8"

 # Example for SOCKS5

Environment="HTTP_PROXY=socks5://proxy_url:proxy_port" "NO_PROXY=localhost,127.0.0.0/8"

重新加载systemctl以读取新的设置 sudo systemctl daemon-reload
验证docker服务的环境设置是否正确 sudo systemctl show docker --property Environment
重新启动docker服务以使用更新的环境设置 sudo systemctl restart docker 现在您可以在您的机器上执行docker-compose命令,而不会收到任何"connection refused"错误消息。

1
我该如何输入代理密码? - Prasanth Ganesan
1
@PrasanthGanesan 根据您使用的协议,您可以使用以下其中一个URL:http://username:password@proxy_url:proxy_port https://username:password@proxy_url:proxy_port - C.Felix
2
感谢@PrasanthGanesan提出用户名/密码身份验证的问题。我编辑了原帖并在http-proxy.conf中添加了这种身份验证的示例。 - C.Felix
1
SOCKS5也可以使用:HTTP_PROXY=socks5://proxy_url:proxy_port - Mattias Wallin
1
请注意,代理设置需要在末尾添加斜杠!@see https://dev59.com/blIH5IYBdhLWcg3wKqTW#71666466 - Mel_T

10

对于需要用户名和密码进行身份验证的代理服务器:除了按照答案中建议的在/etc/systemd/system/docker.service.d/http-proxy.conf中添加凭据外,我还需要将其添加到Dockerfile中。以下是Dockerfile中的代码片段。

FROM ubuntu:16.04

ENV http_proxy http://username:password@proxy_url:proxy_port
ENV https_proxy http://username:password@proxy_url:proxy_port

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y \
    build-essential \
    bla bla bla ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接