docker的启动文件和配置文件

接触 docker 时间也不短了, 但是 docker 的配置文件一直是个”神秘”的东西, 我在CentOS/Ubuntu/Fedora 平台上都使用过 docker, 而且 docker 的版本从1.9到最新的1.13都用过, 可以说 docker 的配置文件真的是 “乱花渐欲迷人眼”, 写在哪儿的都有. 而且 docker 的启动方式不同读取的配置文件位置也不同, 有的时候改了半天配置文件发现不生效… 今天我们就来找找 docker 的配置文件!

1.12版本后的万能配置文件

1.12版本后, 用户可以自行创建 /etc/docker/daemon.js 该文件, 该文件是 docker 进程的配置管理文件, 里面几乎包含了所有 docker 命令行启动可以配置的参数, 不管是哪个平台, 不管是以何种方式启动, 默认都会来这里读取配置, 所以如果你会配置这个文件, 就不会再费力气去找 docker 的普通配置文件或是 docker 的启动入口了

这个文件在前面的文章里有介绍, 官方也给出了使用模板, 有需要的话可以翻看前面的文章查看或是到 docker 的官方文档中查看

查找配置文件

不管是 CentOS7+/Fedora24+ 还是 Ubuntu16+, 他们现在都使用 systemctl 来管理程序, 所以在以上平台上, 启动 docker 的时候都推荐使用如下命令

1
> systemctl start docker.service

即使在 Ubuntu 下使用/etc/init.d/docker start的方式启动, 回显也会告诉你他还是使用了 systemd 去管理的. service 也是一样, service 找的就是/etc/init.d/docker 所以使用 service 启动其本质也还是使用了 systemctl 的方式启动的(Ubuntu16.04LTS)

docker启动成功后(当然启动失败也行) 执行如下命令查看 docker 的启动状态(日志)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
> systemctl status docker.service
● docker.service - Docker Application Container Engine
Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2017-02-06 12:43:32 CST; 1s ago
Docs: https://docs.docker.com
Main PID: 22100 (dockerd)
Tasks: 18
Memory: 12.5M
CPU: 434ms
CGroup: /system.slice/docker.service
├─22100 /usr/bin/dockerd -H fd://
└─22109 docker-containerd -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc

Feb 06 12:43:31 xsl dockerd[22100]: time="2017-02-06T12:43:31.890635900+08:00" level=warning msg="Your kernel does not support cgroup rt period"
Feb 06 12:43:31 xsl dockerd[22100]: time="2017-02-06T12:43:31.891099470+08:00" level=warning msg="Your kernel does not support cgroup rt runtime"
Feb 06 12:43:31 xsl dockerd[22100]: time="2017-02-06T12:43:31.892444087+08:00" level=info msg="Loading containers: start."
Feb 06 12:43:31 xsl dockerd[22100]: time="2017-02-06T12:43:31.903230791+08:00" level=info msg="Firewalld running: false"
Feb 06 12:43:32 xsl dockerd[22100]: time="2017-02-06T12:43:32.205131505+08:00" level=info msg="Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to set a preferred IP address"
Feb 06 12:43:32 xsl dockerd[22100]: time="2017-02-06T12:43:32.346345114+08:00" level=info msg="Loading containers: done."
Feb 06 12:43:32 xsl dockerd[22100]: time="2017-02-06T12:43:32.397174805+08:00" level=info msg="Daemon has completed initialization"
Feb 06 12:43:32 xsl dockerd[22100]: time="2017-02-06T12:43:32.397651049+08:00" level=info msg="Docker daemon" commit=49bf474 graphdriver=aufs version=1.13.0
Feb 06 12:43:32 xsl dockerd[22100]: time="2017-02-06T12:43:32.419960532+08:00" level=info msg="API listen on /var/run/docker.sock"
Feb 06 12:43:32 xsl systemd[1]: Started Docker Application Container Engine.

在回显的第二行就可以看到Loaded字样, 这行就提示了 docker 启动的入口文件, 如果有需要添加的启动配置, 来这里找就对了!

以上查出来的 docker 文件是 docker 的入口文件, 你可以在入口文件的 docker 启动方式中, 添加一些参数, 也可以像上面写的, 把配置写进”万能配置文件中(js 文件)”

其他配置文件

让人眼花缭乱的配置文件

/etc/default/docker

这个文件在开头的注释中就写到了

1
2
3
4
5
6
7
8
# Docker Upstart and SysVinit configuration file

#
# THIS FILE DOES NOT APPLY TO SYSTEMD
#
# Please see the documentation for "systemd drop-ins":
# https://docs.docker.com/engine/articles/systemd/
#

这个配置文件只有在 Linux 使用SysvinitUpstart作为初始化 init 系统的时候才会生效, 才会读取这个配置文件, 紧接着下面一行又说了 systemd系统并不适用

而在 Ubuntu16.04 LTS中, 系统默认使用的是 systemd 来管理的, 即使你使用 service, 最后还是重定向到了 systemctl. 所以上面这个配置文件在默认使用 systemd 的 CentOS7+/Fedora24+/Ubuntu16+ 系统中都是没有任何卵用的配置文件!!!

如果你想深入了解三大 init 系统的历史以及发展现状, 可以点开以下参考文档中的链接查看

下面我简单区分一下这三大初始化系统

  1. Sysvinit: CentOS6时代, 我们最熟悉的 service docker restart 命令就出自这个系统管理; 在 Ubuntu 中的 /etc/init.d/docker restart 也是这个系统来管理的

  2. Upstart: 这个初始化系统比较少见, 在 Ubuntu 上比较多见, 启动软件的方式为 restart docker 在 docker 的官方网站中, 介绍基于 Ubuntu14和15版本 docker 启动方式时, 就是使用的这个初始化系统https://docs.docker.com/engine/admin/

  3. Systemd: systemd 是目前大多数 Linux 发行版默认的初始化管理系统, CentOS7+ 和 Ubuntu16+ 都是使用 Systemd 进行管理, 软件启动方式为 systemctl restart docker.service

/etc/init.d/docker

这个文件只有在系统使用 sysvinit 来管理时才会用到, 因为我的系统默认都使用了 systemd 进行管理, 所以这个文件对我来说也没有任何卵用, 即使我用了 sysvinit 管理程序的语法, 也会被重定向到 systemd 去管理程序. 这个 docker 入口读取的是 /etc/default/docker 这个配置文件

/etc/init/docker.conf

这个文件只有在系统使用 Upstart 来管理时才会用到, 无用的道理同上. 这个 docker 入口读取的也是 /etc/default/docker 这个配置文件

总结

入口文件

  • /etc/init/docker.conf == service docker start 的入口文件==
  • /etc/init.d/docker == start docker 的入口文件 ==
  • /usr/lib/systemd/system/docker == RHEL 系列中 systemctl start docker.service 的入口文件 ==
  • /lib/systemd/system/docker == Ubuntu 系列中 systemctl start docker.service 的入口文件 ==

配置文件

  • /etc/default/docker == service 和 start 的配置文件==
  • /etc/docker/daemon.js ==1.12版本后万能配置文件==

如果你使用的是 docker 1.11(含)之前的版本, 如果能升级的话还是升级到最新版本吧. 如果不能升级, 还找不到配置文件, 可以在对应的入口文件中直接在启动命令后面添加参数

不知道的时候对 docker 这么多的入口和配置文件感觉真的很烦, 明白了他们的对应关系之后才恍然大悟, 原来 docker 不仅仅为跨平台付出了大量的精力, 连初始化系统也全部都适配到了, 让你不管使用什么系统, 系统使用什么初始化工具都能运用自如, 这里给 docker 点👍 (虽然用不到这么多文件, 而且给我带来了很长时间的困扰)


参考文档

Linux文件目录/etc/init和/etc/init.d的前世今生: https://my.oschina.net/lvyi/blog/183123