选中内容(绿色)时除了会搜索文章名,还会搜索文章内容
点击结果中的文章名进入文章界面后可以按Ctrl+F在页面内搜索
  • 版权:CC BY-SA 4.0
  • 创建:2020-05-16
  • 更新:2020-11-23
设置docker代理(版本17.07以后的方法)


背景

使用 proxychains 企图让 docker pull使用代理来拉取镜像,实际上没有走代理,依然很慢

对于镜像, 可以使用国内的加速镜像, 也可以用自己的代理服务器访问dockerhub

这里主要是写设置代理的方法

设置 docker 全局代理

设置方法参考官方文档: https://docs.docker.com/network/proxy/

注意新版和旧版本(17.07以前)设置方法不一样,比旧版更简单而且不需要重启服务,网上文章基本都是针对旧版本的,可能未来又变化了,所以多看官方文档~

  1. vim ~/.docker/config.json
  1. {
  2. "proxies":
  3. {
  4. "default":
  5. {
  6. "httpProxy": "http://172.17.0.1:8123",
  7. "httpsProxy": "http://172.17.0.1:8123",
  8. "noProxy": "localhost,127.0.0.1,.daocloud.io"
  9. }
  10. }
  11. }

注意:

  • 仅支持http协议,不支持socks5协议(2020.5.16,未来不一定,官方文档为准),可以使用polipo创建一个http代理服务,参考https://neucrack.com/p/275

  • 这里使用了172.17.0.1(docker 虚拟网卡地址), 而不是127.0.0.1, 这是因为这是从容器内部的角度来看的, 容器内部要使用代理,默认情况下只能访问这个虚拟网卡的地址, 127.0.0.1是容器内部, 如果代理在宿主机, 要使用 虚拟网卡的地址才能访问到.

  • 这个文件一旦存在, docker就会使用这里面的代理, 包括创建的容器都会使用它。 所以不需要代理了, 需要关闭代理, 就是把文件重命名一下就好了, 这点用起来确实挺麻烦,也许未来会优化体验吧。

  • 注意, 一个容器一旦生成, 它是否使用代理就已经固定了, 就算把config.json删除, 这个容器依然使用创建时的设置, 这点也挺容易让人头疼的, 一定要注意。

    比如 有个镜像叫 imageA, 现在设置~/.docker/config.json也就是有代理, 然后docker run创建容器 A, 然后再重命名config.json, 创建容器B, 然后会发现无论现在怎么修改config.json, 容器A B都会使用它被创建时的代理设置,即容器A使用代理, 容器B不使用代理

和宿主机共享网络

当然, 一定要使用 127.0.0.1 也可以, 在docker run/build 添加--network=host参数,和宿主机共享网络就好了,
比如

构建镜像时:

  1. docker build --network=host -t test .

创建容器时:

  1. docker run --network=host --gpus all --name jupyterlab-gpu -it -p 8889:8889 -e USER_NAME=$USER -e USER_ID=`id -u $USER` -e GROUP_NAME=$USER -e GROUP_ID=`id -g $USER` -v /home/${USER}:/tf neucrack/tensorflow-gpu-py3-jupyterlab

容器使用宿主机的代理的几种方法总结

  • 方法一: 直接使用(推荐
  1. export ALL_PROXY='socks5://172.17.0.1:1080'

这里ip地址使用的是宿主机的ip

  • 方法二: 与宿主机共享网络

创建容器时使用--network=host参数

然后在docker内设置代理,比如全局代理

  1. export ALL_PROXY='socks5://127.0.0.1:1080'

这样就可以使用宿主机的代理了

但是要注意, 如果是用--network=host,这样的话使用 -p 参数映射端口就没用了, 即所有端口都是开放和宿主机共享的

  • 方法三: 映射代理端口
    docker run时带参数-p映射代理的端口到容器, 在容器里面使用即可,比如:

    1. docker run -p 1080:1080 .....
    2. export ALL_PROXY='socks5://127.0.0.1:1080'
  • 方法四: docker配置全局代理

设置 docker 全局代理,比如设置了http://172.17.0.1:8123, 容器内全都会走这个代理,除了配置文件中的白名单里面的地址以外

注意: 全局代理和 --network=host 参数只能用一个,不然就容易混乱

文章有误?有想法想讨论?查看或者发起勘误/讨论 主题
(发起评论需要先登录 github)

/wallpaper/wallhaven-6omkp7.jpg