Docker Daemon生產環境關鍵的幾個參數

原文地址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.servicebash

而後執行docker info來驗證配置是否生效。服務器

registry-mirrors

{
  "registry-mirrors": []
}

此參數配置的是Docker registry的鏡像網站,國內訪問docker hub有時候會抽風,因此配置一個國內的鏡像網站可以加速Docker image的下載。網絡

可使用Daocloud加速器(需註冊,使用免費)或者其餘雲廠商提供的免費的加速服務。它們的原理就是修改registry-mirrors參數。post

dns

{
  "dns": []
}

Docker內置了一個DNS Server,它用來作兩件事情:性能

  1. 解析docker network裏的容器或Service的IP地址
  2. 把解析不了的交給外部DNS Server解析(dns參數設定的地址)

默認狀況下,dns參數值爲Google DNS nameserver:8.8.8.88.8.4.4。咱們得改爲國內的DNS地址,好比:

  1. 1.2.4.8
  2. 阿里DNS:223.5.5.5223.6.6.6
  3. 114DNS:114.114.114.114114.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權限纔可以讀),既然日誌是存在磁盤上的,那麼就要磁盤消耗的問題。下面介紹兩個關鍵參數:

  1. max-size,單個日誌文件最大尺寸,當日志文件超過此尺寸時會滾動,即再也不往這個文件裏寫,而是寫到一個新的文件裏。默認值是-1,表明無限。
  2. 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大的時候可能會發生:

  1. 容器外出通訊失敗
  2. 影響網絡性能

因此將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看這篇文章

參考資料

相關文章
相關標籤/搜索