设置docker代理(版本17.07以后的方法) 对于镜像, 可以使用国内的加速镜像, 也可以用自己的代理服务器访问 dockerhub 国内镜像加速 { but 最近(2024.6)貌似国内镜像站波动比较大,你可能需要多试试哪个镜像能用,所以直接使用代理也是不错的选择。 后文则是设置代理的方法 docker pull 拉取镜像时设置代理 首先, docker pull 和 docker build/docker run 使用代理的方式不一样! docker pull 的代理被 systemd 接管,所以需要设置 systemd… sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf [Service] sudo systemctl daemon-reload 然后docker pull就会使用代理啦! 这里 HTTP 代理可以通过你的代理软件开出来,如果你的代理软件只能开出来 socks5 代理的话,你可以用 polipo 开一个 http 代理使用。 build 镜像时使用代理 docker build --build-arg http_proxy=http://172.17.0.1:8123 --build-arg https_proxy=http://172.17.0.1:8123 -t image_name . 设置 docker 全局代理 注意新版和旧版本(17.07以前)设置方法不一样,比旧版更简单而且不需要重启服务,网上文章基本都是针对旧版本的,可能未来又变化了,所以多看官方文档~ vim ~/.docker/config.json 注意: 仅支持 http https ftp 协议,不支持 socks5 协议(2022.3.24,未来不一定,官方文档为准),可以使用polipo创建一个http代理服务,参考https://neucrack.com/p/275 这里使用了172.17.0.1(docker 虚拟网卡地址), 而不是127.0.0.1, 这是因为这是从容器内部的角度来看的, 容器内部要使用代理,默认情况下只能访问这个虚拟网卡的地址, 127.0.0.1是容器内部, 如果代理在宿主机, 要使用 虚拟网卡的地址才能访问到. 这个文件一旦存在, docker就会使用这里面的代理, 包括创建的容器都会使用它。 所以不需要代理了, 需要关闭代理, 就是把文件重命名一下就好了, 这点用起来确实挺麻烦,也许未来会优化体验吧。 注意, 一个容器一旦生成, 这些环境变量(http_proxy https_proxy ftp_proxy no_proxy)就会被继承到容器中, 就算把config.json删除, 这个容器依然使用创建时的环境变量,可以手动在容器内重新设置这些环境变量, 这点也挺容易让人头疼的, 一定要注意。 比如 有个镜像叫 imageA, 现在设置~/.docker/config.json也就是有代理, 然后docker run创建容器 A, 然后再重命名config.json, 创建容器B, 然后会发现无论现在怎么修改config.json, 容器A B都会使用它被创建时的代理设置,即容器A使用代理, 容器B不使用代理 容器使用宿主机的代理的几种方法总结 方法一: 直接在容器内使用(推荐 方法二: 与宿主机共享网络时直接在容器内使用 然后在docker内设置代理,比如全局代理 export ALL_PROXY='socks5://127.0.0.1:1080' 但是要注意, 如果是用--network=host,这样的话使用 -p 参数映射端口就没用了, 即所有端口都是开放和宿主机共享的 方法三: 映射代理端口后直接在容器内使用 docker run -p 1080:1080 ..... 注意: 全局代理和 --network=host 参数只能用一个,不然就容易混乱 版权声明:本文为 neucrack 的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 |