Docker 代理配置

由于公司 Lab 服务器无法正常访问公网,想要下载一些外部依赖包需要配置公司的内部代理。Docker 也是同理,想要访问公网需要配置一定的代理。

Docker 代理分为两种,一种是为运行的 Container 配置代理,用于下载一些依赖包以及访问公网。另一种是为 Docker Daemon 配置代理,用于支持 docker 相关的命令。

为容器配置代理

配置容器代理一般分为两种,一种是全局配置,另一种是仅为某个容器配置。

全局配置

首先说明,此修改方法仅支持 17.07 或者更高版本。

修改或创建 ~/.docker/config.json

# 如果有的话,先备份一下
cp ~/.docker/config.json ~/.docker/config.json.bk # 修改内容如下
cat ~/.docker/config.json
{
"auths": {},
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.2 (linux)"
}, "proxies":
{
"default":
{
"httpProxy": "http://173.39.112.117:80",
"httpsProxy": "http://173.39.112.117:80"
}
}
}

为了确保生效,重启下 docker :systemctl restart docker

此时宿主机并没配置代理,查询下 IP:

[root@localhost ~]# curl cip.cc
IP : 64.104.xxx.xx
地址 : 中国 香港 cisco.com 数据二 : 香港 | 特别行政区 数据三 : 中国香港 URL : http://www.cip.cc/64.104.xxx.xx

基于之前使用 Docker file 打包镜像的文章,直接使用打包好带有 systemd 功能的镜像。

# 创建 container
[root@localhost home] docker run --privileged=true -ti \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-p 80:80 -d local/c7-systemd # 进入 container
[root@localhost home] docker exec -it 3eaa1cc71706 /bin/bash # 查询 IP
[root@3eaa1cc71706 /]# curl cip.cc
IP : 173.39.112.xxx
地址 : 新加坡 新加坡 数据二 : 新加坡 数据三 : 新加坡 URL : http://www.cip.cc/173.39.112.xxx

可以看到容器内已经成功配置了代理,可以正常下载依赖了。

局部修改

方法1-在 docker run 命令添加参数

# 创建 container
docker run --privileged=true -ti \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--env HTTP_PROXY="http://173.39.112.117:80 \
--env HTTPS_PROXY="http://173.39.112.117:80 \
--env http_proxy="http://173.39.112.117:80 \
--env https_proxy="http://173.39.112.117:80 \
-p 80:80 -d local/c7-systemd # 进入 container
[root@localhost home]# docker exec -it 3607976e8f2d /bin/bash # 查询 IP
[root@3607976e8f2d /]# curl cip.cc
IP : 173.39.112.xxx
地址 : 新加坡 新加坡 数据二 : 新加坡 数据三 : 新加坡 URL : http://www.cip.cc/173.39.112.xxx

方法2-在 Docker-file 添加

这里以打包一个 httpd 的 docker file 为例子:

FROM local/c7-systemd

ENV MY_PROXY_URL="http://173.39.112.117:80"
ENV HTTP_PROXY=$MY_PROXY_URL \
HTTPS_PROXY=$MY_PROXY_URL \
FTP_PROXY=$MY_PROXY_URL \
http_proxy=$MY_PROXY_URL \
https_proxy=$MY_PROXY_URL \
ftp_proxy=$MY_PROXY_URL RUN yum -y install httpd; yum clean all; systemctl enable httpd.service EXPOSE 80 CMD ["/usr/sbin/init"]

结果是相同的,这里就不演示了。有时添加代理是域名的话,就需要额外的操作。

添加代理是域名的处理

如果添加的代理是域名的话,如 proxy.esl.cisco.com:80, 需要再做一步额外的处理。

方法1-通过 docker run 参数添加

# 创建 container
[root@localhost home]#docker run --privileged=true -ti \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
--env HTTP_PROXY="http://proxy.esl.cisco.com:80 \
--env HTTPS_PROXY="http://proxy.esl.cisco.com:80 \
--env http_proxy="http://proxy.esl.cisco.com:80 \
--env https_proxy="http://proxy.esl.cisco.com:80 \
--dns=64.104.123.245 \
-p 80:80 -d local/c7-systemd # 进入 container
[root@localhost home]# docker exec -it 992dc27de1cc /bin/bash # 查看 IP
[root@992dc27de1cc /]# curl cip.cc
IP : 173.39.xxx.xxx
地址 : 新加坡 新加坡 数据二 : 新加坡 数据三 : 新加坡 URL : http://www.cip.cc/173.39.xxx.xxx

方法2-通过修改 docker daemon 配置添加

在每个 container 运行前,会继承 Docker daemon 的配置,在 /etc/docker/daemon.json 文件下.

# 为 docker daemon 添加 dns,在运行时会为每个 container 添加上
cat /etc/docker/daemon.json
{
"dns" : [
"8.8.4.4",
"8.8.8.8",
"Your_DNS_SERVER"
], "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}

效果一样这里就不演示了。

为 Docker Daemon 添加代理

和 container 的情况一样,如果不为 Docker Daemon 配置代理的话,是无法使用 search, pull, push 等命令的。

配置如下:

# STEP1-创建文件夹
[root@localhost home]# sudo mkdir -p /etc/systemd/system/docker.service.d # STEP2-创建代理文件 http 和 https
[root@localhost home]# cat /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://proxy.esl.cisco.com:80/" [root@localhost home]# cat /etc/systemd/system/docker.service.d/https-proxy.conf
[Service]
Environment="HTTPS_PROXY=http://proxy.esl.cisco.com:80/" # 如果希望访问某些 Docker registries 不是用代理,可以在上面的配置文件后追加
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.example.com,.corp" # STEP3-刷新变更
[root@localhost home]# sudo systemctl daemon-reload # STEP4-重启 Docker
[root@localhost home]# sudo systemctl restart docker # STEP5-验证代理是否生效
[root@localhost home]# systemctl show --property=Environment docker
Environment=HTTP_PROXY=http://proxy.esl.cisco.com/ HTTPS_PROXY=http://proxy.esl.cisco.com:80/

参考

docker-container-proxy

docker-dns

docker-daemon-proxy

Docker 代理脱坑指南的更多相关文章

  1. 大数据 SQL Boy 脱坑指南

    不可否认的是 SQL 是一个伟大的发明,它让增删改查的操作更加地便捷化,而且 SQL 的学习成本相对其他编程语言来说较低,被逼到会写 SQL 的运营和产品我都见过不少... 大数据行业跟 SQL 更是 ...

  2. EF6(CodeFirst)+MySql开发脱坑指南

    废话 话说当年,在一个春光明媚的晌午,邂逅了迷人的丁香姑娘,从此拜倒在了她的石榴裙下,至今不能自拔,这位丁香姑娘就是ORM思想. 所谓ORM思想,我的理解就是根据一定的规则,把程序中的对象和数据库中的 ...

  3. 两百条微信小程序跳坑指南(不定时更新)

    微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合跳坑<二百一十三> background-image无法获取本地资源图片....跳 ...

  4. Kubernetes Fluentd+Elasticsearch+Kibana统一日志管理平台搭建的填坑指南

    在初步完成Kubernetes集群架构的建立后,通过搭建一些监控组件,我们已经能够实现 图形化的监控每个node,pod的状态信息和资源情况 通过scale进行replicateSet的扩展和伸缩 通 ...

  5. Spring WebSocket踩坑指南

    Spring WebSocket踩坑指南 本次公司项目中需要在后台与安卓App间建立一个长连接,这里采用了Spring的WebSocket,协议为Stomp. 关于Stomp协议这里就不多介绍了,网上 ...

  6. C# -- HttpWebRequest 和 HttpWebResponse 的使用 C#编写扫雷游戏 使用IIS调试ASP.NET网站程序 WCF入门教程 ASP.Net Core开发(踩坑)指南 ASP.Net Core Razor+AdminLTE 小试牛刀 webservice创建、部署和调用 .net接收post请求并把数据转为字典格式

    C# -- HttpWebRequest 和 HttpWebResponse 的使用 C# -- HttpWebRequest 和 HttpWebResponse 的使用 结合使用HttpWebReq ...

  7. CEF避坑指南(一)——下载并编译第一个示例

    CEF即Chromium Embedded Framework,Chrome浏览器嵌入式框架.它提供了接口供程序员们把Chrome放到自己的程序中.许多大型公司,如网易.腾讯都开始使用CEF进行前端开 ...

  8. [转帖]Kubernetes - nginx-ingress 配置跳坑指南

    Kubernetes - nginx-ingress 配置跳坑指南 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https:// ...

  9. Nuxt.js的踩坑指南(常见问题汇总)

    本文会不定期更新在nuxt.js中遇到的问题进行汇总.转发请注明出处,尊重作者,谢谢! 强烈推荐作者文档版踩坑指南,点击跳转踩坑指南 在Nuxt的官方文档中,中文文档和英文文档都存在着不小的差异. 1 ...

随机推荐

  1. 关于面试题:[1, 2, 3].map(parseInt)问题的剖析

    一.前言 最近有小伙伴在公号中咨询了胡哥这道面试题,窃以为是比较有意思的一道面试题,于此分享给各位小伙伴.先把答案给了各位,和你理解的一样吗?! [1, 2, 3].map(parseInt) // ...

  2. background,position,绝对定位中位置属性的定位规则,cursor

    backgorund背景 background-color:red; 背景颜色 background-image:url(路径);背景图片 background-repeat:no-repeat;不重 ...

  3. git命令的基本使用流程

    git命令的基本使用流程 前提:已经基本熟悉git的常用命令 1.提交项目 首先,在对项目进行完善后,如果想要将项目更新到github或是阿里code上去,先要使用 git add -A 这一命令的作 ...

  4. Cannot access org.springframework.context.ConfigurableApplicationContext

    Cannot access org.springframework.context.ConfigurableApplicationContext 需要将有问题的模块  删除 后重新导入 即可 IDEA ...

  5. 基于Arduino的按键控制LED实验

    I/O 口的意思即为INPUT 接口和OUTPUT 接口,到目前为止我们设计的小灯实验都还只是应用到Arduino 的I/O 口的输出功能,这个实验我们来尝试一下使用Arduino的I/O 口的输入功 ...

  6. 【Java基础总结】IO流

    字节流 1. InputStream 字节输入流 代码演示 InputStream in = System.in; System.out.println("int read(byte b) ...

  7. 灵魂画师,在线科普多云平台/CMP云管平台/中间件/虚拟化/容器是个啥

    原创: 灵魂工作室 速石科技 经常碰到有人问: 你们是云管吗? 你们和CMP多云管理平台有什么区别? 你们这个多云平台到底是个啥? emmmmm,问题还挺不好回答. 为了说清楚这些问题,但又不希望你们 ...

  8. STM32动态内存分配需要注意的地方

    STM32进行动态内存分配是需要注意动态内存分配大小不要超过.S文件中设置Heap Size大小 如图所示: 0x4000 :可以分配得最大字节是16384bytes 这个地方malloc的大小超过了 ...

  9. 一个简易的 LED 数字时钟实现方法

    这个应该是已经有很多人做过的东西,我应该只是算手痒,想写一下,所以,花了点时间折腾了这个,顺便把 Dark Mode 的处理也加上了. 首先可以很明确的一点,这个真没技术含量存在,只是需要点耐心. L ...

  10. CDQ 入门

    推荐博客 :https://blog.csdn.net/wu_tongtong/article/details/78785836 https://www.cnblogs.com/mlystdcall/ ...