hexo
status
Published
date
Apr 21, 2022
slug
docker-io-and-config-proxy
summary
记录docker写磁盘IO问题和配置网络代理的折腾
category
折腾分享
tags
docker
代理
折腾
icon
password

发现IO问题

最近发现群晖的磁盘转动的越来越频繁,滴滴滴的声音也越来越大。终于打开资源监控查看了下,发现这磁盘读写,主要是写入得有点厉害。静默状态下写入都有5MB/s。
notion image
百思不得其解,静默状态下群晖也没什么可以跑呀,难不成是云盘同步?也不对啊,一直维持在这个速度也不正常。那能否有什么工具可以查询后台IO读写的进程。在群晖界面找了半天似乎没有,顶多是任务管理器可以看有什么进程。有读写的列目,但根据观察和实际磁盘读写监控页面不符。
notion image
在linux中可以通过 iotop -oP来查看IO。
notion image
但在群晖ssh中输入这个命令却没有。
notion image
sudo synogear install
群晖需要输入进行安装开启群晖内置的这些工具,包括但不限于iperf3、iostat、iotop等。(每次都需要这个命令)
notion image
然后就发现后台有两个异常进程在疯狂的写硬盘,一个是v2raya,属于docker的一个容器。一个是docker守护进程。
notion image
把前者的容器停止后果然消停了一些,从5MB/s下降到2MB/s左右。至于为什么会疯狂的写硬盘不得而知,当然关于它之前处理过的另一个问题是,它所在的容器内存消耗会一直增加,达到1G甚至更多,然而实际没有什么连接,之前的处理是限制了容器内存上限。最终把这个容器移到了局域网普通linux下运行发现都没有出现这些问题。

Docker网络代理

还是v2raya,得益于它的透明代理功能,群晖整机的网络环境包括Docker都可以自由的访问网络。
notion image
现如今碍于IO问题把它转移到其他机子上后,群晖的网络可以通过设置系统代理解决,但Docker环境就不行了,它不会跟随系统代理。
notion image
根据官网Configure Docker to use a proxy server | Docker Documentation查阅得知,Docker配置代理有两种:全局配置和局部配置。前者是统一为所有的docker容器进行配置,后者是针对某个容器进行单独配置。
  1. 全局配置
    1. 只支持docker version ≥ 17.07
      创建~/.docker/config.json 文件,如果文件已存在则修改就行。写入如下内容。
      { "proxies": { "default": { "httpProxy": "http://192.168.3.100:20172", "httpsProxy": "http://192.168.3.100:20172", "noProxy": "*.test.example.com,.example2.com,127.0.0.0/8" } } }
  1. 局部配置
    1. 适用于所有docker版本。但有两种输入途径。
    2. 在制作dockerfile的时候就加入代理配置
    3. 在运行docker的时候代入环境参数即为单独的容器进行代理配置。
      1. docker run -it --name alpine \ --env HTTP_PROXY="http://192.168.3.100:20170 \ --env HTTPS_PROXY="http://192.168.3.100:20170 \ --env http_proxy="http://192.168.3.100:20170 \ --env https_proxy="http://192.168.3.100:20170 \ alpine:latest
根据官网文档所描述,环境变量均为大写,此处为什么要大小写都配置呢。
notion image
其实这其中有两个问题:
  1. http_proxy与https_proxy(也包括大写)有什么区别?
  1. http_proxy、https_proxy大小写有什么区别?
根据我的理解。
首先第一个问题,http_proxy与https_proxy区别在于实际网络请求的协议是http还是https。如果是http那么代理会走http_proxy,https则会走https_proxy。大写同理。
第二个问题大小写的区别则是在于不同的程序脚本所识别的环境变量代理配置不同,比如curl只识别大写的,wget只识别小写的。所有都配置最为稳妥。
当然这也会存在一些容器里的wget或curl依然不支持请求https的代理,我怀疑可能是集成的版本问题导致的。
反正最终我在使用全局配置的方式,让群晖docker又成功地能否自由上网。

参考

Notion for Mac使用代理访问轻量级ubuntu虚拟机multipass安装和使用