接上篇, <树莓派使用多个联通4G上网卡> - http://blog.csdn.net/u012731379/article/details/78732774
本篇使用Docker 拨号联通4G, 并且搭建代理服务, 并且出口 IP 随机化. 解决多网卡拨号后需要配置路由表的问题.
在 docker 中共享 device
$ docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
如果设备在容器运行需要驱动, 可以使用privileged模式挂载
$ docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu bash
开放容器中的端口
$ docker run --expose ubuntu bash
## 主机
# 运行的时候不指定网络模式, 因为主机要访问容器中的服务
docker run -it -d --name test --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu bash
# 进入容器
docker exec -it test bash
## docker
# 删掉 -net 0.0.0.0 eth0 的路由, 不然拨号之后无法上网
$ route del -net 0.0.0.0 eth0
# 安装必要的服务
$ apt install net-tools wvdial squid vim
# 不是必要的服务
$ apt install iputils-ping vim
# 配置 wvdial: /etc/wvdial.conf
# 参考上一篇文章 [树莓派使用多个联通4G上网卡] -- http://blog.csdn.net/u012731379/article/details/78732774
# 配置 squid
# 代理访问授权
$ echo "http_access allow all" > /etc/squid/squid.conf.tmp
$ cat /etc/squid/squid.conf >> etc/squid/squid.conf
$ mv /etc/squid/squid.conf.tmp /etc/squid/squid.conf
# 关闭一些 header
$ echo "via off" >> /etc/squid/squid.conf
$ echo "forwarded_for delete" >> /etc/squid/squid.conf
# 等同下面的方式
$ echo "request_header_access Via deny all" >> /dev/squid/squid.conf
$ echo "request_header_access X-Forwarded-For deny all" >> /dev/squid/squid.conf
# 设置超时
$ echo "request_timeout 2 minutes" >> /etc/squid/squid.conf
$ echo "write_timeout 2 minutes" >> /etc/squid/squid.conf
$ echo "read_timeout 2 minutes" >> /etc/squid/squid.conf
# 关闭日志/缓存
$ echo "access_log none" >> /dev/squid/squid.conf
$ echo "cache_store_log none" >> /dev/squid/squid.conf
$ echo "cache_log /dev/null" >> /dev/squid/squid.conf
$ echo "logfile_rotate 0" >> /dev/squid/squid.conf
# 下面两个配置高版本不兼容, 低版本可以用
$ echo "cache_dir no-store " >> /dev/squid/squid.conf
$ echo "cache_mem 0MB" >> /dev/squid/squid.conf
# 列出在运行的容器
$ docker ps
xxxxxxxxxx ubuntu "/bin/bash" hardcore_montalcini
# 把运行中的 docker 做的修改, 提交成一个镜像
$ docker commit -m="wvdial 4G image" --author="zhipeng" xxxxxxxxxx zhipeng/wvdial_4G:v1
$ docker images
REPOSITORY TAG IMAGEID CREATE SIZE
ubuntu lastest 6fxxxxxx 2 weeks ago 99MB
zhipeng/wvdial v1 82xxxxx 1 minutes age 240MB
# 使用自定义提交的镜像运行容器
$ docker run -it -d --name test1 -privileged -v /dev/bus/usb:/dev/bus/usb zhipeng/wvdial_4G:v1 bash
# 如果需要在别的机器上运行, 可以直接导出镜像文件
# 导出镜像
$ docker export 82xxxxx > wvdial_4G_v1.image
# 导入镜像文件
$ docker import wvdial_4G_v1.image zhipeng/wvidal:v1
# 或者保存镜像
$ docker save 82xxxxx > wvdial_4G_v1.image
$ docker load wvdial_4G_v1.image
## 主机
# 进入 docker 容器
$ docker exec -it test1 bash
## docker
# 启动 squid
$ service squid start
# 开始拨号
# 这里因为通过自定的镜像, wvdial.conf 是会保留记录的. SG-01是配置中自定义的名字.
$ wvdial SG-01
## 在主机中, 再开启一个 bash 进入容器后
# 配置路由表
$ route del -net 0.0.0.0 eth0
$ route add -net 0.0.0.0 ppp0
# docker 中测试代理是否正常
$ curl -x localhost:3128 ip.haschek.at
114.232.125.11
# 可以看到成功返回联通的 IP
## 主机
# 主机的公网 IP
$ curl ip.haschek.at
60.12.114.48
# 在主机中测试代理服务是否正常
$ curl -x 172.17.0.2:3128 ip.haschek.at
114.232.125.11
# 结果正常
剩下就是在主机上搭建代理环境, 使多个docker 服务可以自动分流, 做到出口 IP 随机.
# squid 配置和容器中配置方式一样
# 配置代理上游节点
$ echo "cache_peer 172.17.0.2 parent 3128 0 no-query round-robin" >> /etc/squid/squid.conf
$ echo "cache_peer 172.17.0.2 parent 3128 0 no-query round-robin" >> /etc/squid/squid.conf
$ echo "never_direct allow all" >> /etc/squid/squid.conf
$ service squid restart
# 测试主机代理环境
$ curl -x 172.17.0.2:3128 ip.haschek.at
114.232.125.11
$ curl -x 172.17.0.2:3128 ip.haschek.at
114.232.125.11
$ curl -x 172.17.0.2:3128 ip.haschek.at
114.22.55.48
# 可以看到出口 IP 已经做到随机
docker 运行 ubuntu 并共享/dev/ttyUSB0 - http://www.powenko.com/wordpress/?p=9259
Docker实践: 创建本地镜像(commit、Dockerfile) - http://blog.csdn.net/u010246789/article/details/54139168
如何解决docker宿主机无法访问容器中的服务 - https://segmentfault.com/q/1010000008776168
在 docker 之间导出导入镜像 - http://blog.csdn.net/a906998248/article/details/46236687