共计 2773 个字符,预计需要花费 7 分钟才能阅读完成。
原文地址
一些 docker daemon 生产环境中要注意的参数配置。
本文介绍一些生产环境中 dockerd 要特别注意的参数,这些参数可以通过在 dockerd 命令行参数形式给,也可以通过在 /etc/docker/daemon.json 里配置。本文介绍的就是 daemon.json 配置方式。
在开始之前,请先查看 /etc/docker/daemon.json 是否存在,如果不存在则新建一个,内容是 {}。然后你要懂 JSON 文件格式。
如何应用配置
下面所讲的配置最好在 Docker 安装完之后马上做,如果已经有容器运行了,那么先 stop 掉所有容器,然后再做。
修改完之后重启 Docker daemon,比如在 Ubuntu 16.04 下:sudo systemctl restart docker.service。
然后执行 docker info 来验证配置是否生效。
registry-mirrors
{
“registry-mirrors”: []
}
此参数配置的是 Docker registry 的镜像网站,国内访问 docker hub 有时候会抽风,所以配置一个国内的镜像网站能够加速 Docker image 的下载。
可以使用 Daocloud 加速器(需注册,使用免费)或者其他云厂商提供的免费的加速服务。它们的原理就是修改 registry-mirrors 参数。
dns
{
“dns”: []
}
Docker 内置了一个 DNS Server,它用来做两件事情:
解析 docker network 里的容器或 Service 的 IP 地址
把解析不了的交给外部 DNS Server 解析(dns 参数设定的地址)
默认情况下,dns 参数值为 Google DNS nameserver:8.8.8.8 和 8.8.4.4。我们得改成国内的 DNS 地址,比如:
1.2.4.8
阿里 DNS:223.5.5.5 和 223.6.6.6
114DNS:114.114.114.114 和 114.114.115.115
比如:
{
“dns”: [“223.5.5.5”, “223.6.6.6”]
}
log-driver
Log driver 是 Docker 用来接收来自容器内部 stdout/stderr 的日志的模块,Docker 默认的 log driver 是 JSON File logging driver。这里只讲 json-file 的配置,其他的请查阅相关文档。
json-file 会将容器日志存储在 docker host machine 的 /var/lib/docker/containers/<container id>/<container id>-json.log(需要 root 权限才能够读),既然日志是存在磁盘上的,那么就要磁盘消耗的问题。下面介绍两个关键参数:
max-size,单个日志文件最大尺寸,当日志文件超过此尺寸时会滚动,即不再往这个文件里写,而是写到一个新的文件里。默认值是 -1,代表无限。
max-files,最多保留多少个日志文件。默认值是 1。
根据服务器的硬盘尺寸设定合理大小,比如:
{
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “100m”,
“max-files”:”5″
}
}
storage-driver
Docker 推荐使用 overlay2 作为 Storage driver。你可以通过 docker info | grep Storage 来确认一下当前使用的是什么:
$ docker info | grep ‘Storage’
Storage Driver: overlay2
如果结果不是 overlay2,那你就需要配置一下了:
{
“storage-driver”: “overlay2”
}
mtu
如果 docker host machine 的网卡 MTU 为 1500,则不需要此步骤
MTU 是一个很容易被忽略的参数,Docker 默认的 MTU 是 1500,这也是大多数网卡的 MTU 值。但是!在虚拟化环境下,docker host machine 网卡的 MTU 可能不是 1500,比如在 openstack 创建的虚拟的网卡的 MTU 是 1450:
$ ip link
1: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
link/ether fa:16:3e:71:09:f5 brd ff:ff:ff:ff:ff:ff
当 Docker 网络的 MTU 比 docker host machine 网卡 MTU 大的时候可能会发生:
容器外出通信失败
影响网络性能
所以将 Docker 网络 MTU 设置成和 host machine 网卡保持一致就行了,比如:
{
“mtu”: 1450
}
验证:
$ ip link
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 02:42:6b:de:95:71 brd ff:ff:ff:ff:ff:ff
注意到 docker0 的 MTU 还是 1500,不用惊慌,创建一个容器再观察就变成 1450 了(下面的 veth 是容器的虚拟网卡设备):
$ docker run -itd –name busybox –rm busybox
$ ip link
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default
link/ether 02:42:6b:de:95:71 brd ff:ff:ff:ff:ff:ff
268: vethdf32b1b@if267: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master docker0 state UP mode DEFAULT group default
link/ether 1a:d3:8a:3e:d3:dd brd ff:ff:ff:ff:ff:ff link-netnsid 2
在到容器里看看它的网卡,MTU 也是 1450:
$ docker exec busybox ip link
267: eth0@if268: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1450 qdisc noqueue
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
关于 Overlay network 的 MTU 看这篇文章
参考资料
Daemon CLI
Configure logging drivers
JSON File logging driver
Use the OverlayFS storage driver