我想在服务器上部署 docker,但我希望所有与 docker 相关的数据都位于与基本系统不同的分区中。因此,根据官方文档,我已将所述分区安装在“/srv”并进行了以下更改:
这是我的“/usr/lib/systemd/system/docker.service”文件:
[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
Requires=docker.socket
[Service]
Type=notify
EnvironmentFile=-/srv/docker/docker.conf
ExecStart=/usr/bin/docker -d -H fd:// $OPTIONS
LimitNOFILE=1048576
LimitNPROC=1048576
[Install]
Also=docker.socket
WantedBy=multi-user.target
这是“docker.service”文件中引用的“/srv/docker/docker.conf”文件:
$OPTIONS="--graph /srv/docker --storage btrfs"
docker 守护进程正确启动并且还拉取图像。问题是它仍然没有在“/srv/docker”目录中存储任何内容。
另外,当我运行 'ps -aux | grep docker',我得到的是:
root 661 0.4 0.2 351080 17044 ? Ssl 19:33 0:00 /usr/bin/docker -d -H fd://
命令行在“fd://”处停止。在我看来,'$OPTIONS' 出于某种原因被忽视了。
现在,我引用文件的方式有问题吗?这里还有其他事情吗?我进行所有这些配置更改的原因是我真的很想将所有与 docker 相关的数据保存在“/srv/docker/”目录下。
有任何想法吗?
更新 1:
按照答案部分的建议,我更改了我的 'docker.conf' 文件。现在:
$OPTIONS="--graph /srv/docker --storage btrfs"
变成:
OPTIONS="--graph /srv/docker --storage btrfs"
这导致了 docker 守护进程未启动的(意外)后果。这是来自“systemctl status docker”的调试消息:
[root@V12 ~]# systemctl status docker ● docker.service - Docker 应用程序容器引擎已加载:已加载(/usr/lib/systemd/system/docker.service;已启用;供应商预设:已禁用) 活动:失败(结果:退出-code) 自 2015 年 2 月 5 日星期四 20:13:31 EET 起;14 秒前 文档:http ://docs.docker.com 进程:776 ExecStart=/usr/bin/docker -d -H fd:// $OPTIONS (code=exited, status=2) Main PID: 776 (code=退出,状态=2)
您的
/srv/docker/docker.conf
文件中有错误。变量的说明不应以 $ 开头;$ 应该只在以后使用变量时使用。
将其更改为:
首先,我要感谢@MichaelHampton 的回答。它是正确的,我永远不会发现带有'$'('OPTIONS=...'而不是'$OPTIONS=...')的错字。
现在,问题出在命令行选项上。在 docker 文档中,更改存储驱动程序的参数如下:
请记住,这是 1.4 版的文档,这是我拥有的版本。唉,'docker --help' 证明的正确语法是:
因此,在进行必要的更改后,守护程序正确启动,图像在“/srv/docker”目录中被拉取,一切都很好。
道德是总是对官方文档有点不信任,特别是对于像 Docker 这样正在大力开发的项目。再次感谢大家的贡献。
最初,我花了相当多的时间来摆弄以前的 upstart/sysv initscript from
/etc/init.d/docker
及其配置文件/etc/default/docker
。真的很奇怪,无论我尝试什么它都不起作用,然后最终我意识到这systemd
只是忽略了这两个,因为我直接使用遗留脚本。建议的解决方案似乎无法在我的 15.04 上 100% 工作,并
lxc-docker-1.7.0
从官方 docker PPA 安装,因为我的配置文件中EnvironmentFile
似乎缺少该解决方案。docker
systemd
一个选项是就地编辑它并使用以下命令添加它:
但这有可能被下一次更新覆盖,所以我的解决方案是通过运行来创建一个覆盖
然后我决定只
ExecStart
在新的配置覆盖中重新定义命令,而不是在/srv/docker/docker.conf
.上面的代码片段没有错误,由于某些奇怪的原因,与
systemd
读取其配置覆盖的方式有关,需要首先用空值定义一个值,然后重新分配给新值。一旦我这样做了,守护进程就会愉快地启动,我终于可以使用它了。