原文地址git
一些docker daemon生产环境中要注意的参数配置。github
本文介绍一些生产环境中dockerd要特别注意的参数,这些参数能够经过在dockerd
命令行参数形式给,也能够经过在/etc/docker/daemon.json
里配置。本文介绍的就是daemon.json
配置方式。docker
在开始以前,请先查看/etc/docker/daemon.json
是否存在,若是不存在则新建一个,内容是{}
。而后你要懂JSON文件格式。json
下面所讲的配置最好在Docker安装完以后立刻作,若是已经有容器运行了,那么先stop掉全部容器,而后再作。segmentfault
修改完以后重启Docker daemon,好比在Ubuntu 16.04下:sudo systemctl restart docker.service
。bash
而后执行docker info
来验证配置是否生效。服务器
registry-mirrors
{ "registry-mirrors": [] }
此参数配置的是Docker registry的镜像网站,国内访问docker hub有时候会抽风,因此配置一个国内的镜像网站可以加速Docker image的下载。网络
可使用Daocloud加速器(需注册,使用免费)或者其余云厂商提供的免费的加速服务。它们的原理就是修改registry-mirrors
参数。post
dns
{ "dns": [] }
Docker内置了一个DNS Server,它用来作两件事情:性能
dns
参数设定的地址)默认状况下,dns
参数值为Google DNS nameserver:8.8.8.8
和8.8.4.4
。咱们得改为国内的DNS地址,好比:
1.2.4.8
223.5.5.5
和223.6.6.6
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看这篇文章