在 Docker 容器中使用宿主机的代理
1.拉取镜像
这里以ubuntu
镜像为例子:
1 | docker pull ubuntu |
2.容器内配置代理的方式
2.1 方式一(host 模式)
运行完后退出容器:
1 | docker run -it --name=test --network=host ubuntu |
因为在容器里默认是没有安装编辑器的,要么通过在容器内下载(apt install vi
),要么通过在宿主机里对文件进行编辑后再通过docker cp
复制到容器里。
编辑宿主机的.bashrc
文件,在里面添加代理配置:
1 | kate ~/.bashrc |
打开后在里面添加:
1 | # where proxy |
7890
是clash
的代理端口。
然后把.bashrc
复制到test
容器的/root
下:
1 | docker cp ~/.bashrc test:/root/ |
可以重启下容器:
1 | docker restart test |
进入容器:
1 | docker exec -it test bash |
开启并查看代理:
1 | # 开启代理 |
2.1.1 原理
一、host
网络模式的特点
共享网络堆栈 :
- 容器与宿主机共享网络堆栈,因此容器和宿主机的网络接口和端口是直接共享的。
- 容器中的服务可以直接通过宿主机的 IP 地址和端口访问,不需要额外的端口映射。
无需端口映射:
- 在
host
网络模式下,你不需要使用-p
或--publish
选项来映射端口。 - 容器中的服务将直接监听宿主机的端口,可以通过宿主机的 IP 地址直接访问。
- 在
网络性能 :
- 由于没有虚拟网络桥接的开销,
host
网络模式通常提供更高的网络性能。
- 由于没有虚拟网络桥接的开销,
网络隔离 :
- 使用
host
网络模式时,容器与宿主机网络没有隔离,这意味着容器可以访问宿主机上所有可访问的网络资源,也可能对宿主机网络造成安全风险。
- 使用
二、注意事项
- 安全性 :由于容器与宿主机共享网络,容器可能会有更大的安全风险,因为它可以直接访问宿主机的网络资源。
- 网络冲突 :如果容器和宿主机上的应用程序尝试监听相同的端口,可能会发生端口冲突。
2.2 方式二(bridge 模式)
2.2.1 通过修改容器内的终端配置文件
运行完后退出容器:
1 | docker run -it --name=test ubuntu |
这里同样需要修改.bashrc
文件,但是代理地址不再是宿主机的本地回环地址了,惹事宿主机的实际 ip
地址。
查询宿主机的ip
地址:
1 | ip a |
编辑.bashrc
文件:
1 | kate ~/.bashrc |
打开后在里面添加:
1 | # where proxy |
2.2.2 直接在docker run
命令中指定代理
使用--env
参数设置代理环境变量:
1 | docker run -it --name=my-container \ |
your-proxy-server
需要替换为代理服务器或者宿主机的ip
地址,port
是代理端口。
2.2.3 原理
如果是在桥接模式下在容器中使用 127.0.0.1
来访问宿主机的服务(如代理服务),这个 IP 地址将指向容器本身,而不是宿主机。因此要让容器访问宿主机上的服务(例如宿主机上的代理服务),应该使用宿主机的实际 IP 地址,或者在 Docker 中使用特定的地址来实现宿主机的访问。
- Title: 在 Docker 容器中使用宿主机的代理
- Author: loskyertt
- Created at : 2024-08-16 13:45:53
- Updated at : 2024-11-13 03:07:10
- Link: https://redefine.ohevan.com/2024/08/16/Dokcer容器代理/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments