在Ubuntu上启动Docker作为守护进程

61

我已经成功使用 Docker 几周了,但今天当我按照一组指令操作时,它建议在 Docker 配置文件 /etc/init/docker.conf 中添加以下两行:

limit memlock unlimited unlimited
limit nofile 262144

然后建议使用sudo /etc/init.d/docker restart重启Docker。在Ubuntu 14.04下执行时,它返回以下信息:

  • Docker是通过upstart进行管理的,请尝试使用service docker restart。

我尝试了sudo service docker restart,但返回以下内容:

stop: Unknown job: docker

start: Unknown job: docker

现在我的docker守护程序无法运行!我尝试重新启动,但它仍无法运行,并且当我运行像sudo docker version这样简单的命令时,会得到以下结果:

Client version: 1.2.0
Client API version: 1.14
Go version (client): go1.3.1
Git commit (client): fa7b24f
OS/Arch (client): linux/amd64
2014/10/01 09:57:45 Get http:///var/run/docker.sock/v1.14/version: dial unix /var/run/docker.sock: no such file or directory

为了解决问题,我尝试在命令行上启动Docker守护进程:

sudo docker -d

现在我可以在另一个终端窗口正常运行Docker。这很棒,但是我如何使它再次正常启动?此外,我注意到我有两个Docker配置文件:

/etc/init/docker.conf
/etc/init/docker.io.conf

它们看起来像重复的东西。它们是否多余?我应该查看哪个?我需要两个吗?

我还注意到,当我运行sudo service --status-all |grep docker时,这种重复出现了。我得到了列出的服务中的dockerdocker.io两者。烦人。


请注意,我真的不理解upstart的机制,我怀疑这更多是upstart的问题而不是docker的问题。 - ken
6个回答

63

有多个流行的仓库提供Ubuntu的docker程序包。包docker.io(很可能)来自Ubuntu仓库。另一个流行的是http://get.docker.io/ubuntu,它提供了一个lxc-docker程序包(我使用后者,因为它可以更快地更新)。确保只安装一个程序包。不太确定删除程序包是否会清理干净。如果sudo service docker restart仍然不能工作,则可能需要在/etc/中手动清理。


1
既然你这么说,我也记得我在Docker上“快速跟进”,这几乎肯定是为什么我有两个版本的原因。可惜的是,我从来没有记录下我做了什么,所以我猜我今天早上要逆向工程它。 - ken
1
我也会再尝试sudo service docker restart,但我不指望与之前有任何变化。当你说“在/etc中手动清理”时,你能给个具体的想法吗?我猜我需要去那里,但这是我不太了解的领域。 - ken
顺便提一句,在/etc/apt/sources.list.d/中,我有一个"docker.list"和一个"docker.list.save"文件,它们都指向http://get.docker.io/ubuntu。所以这个谜团解开了。我不知道"docker.list.save"文件的功能是什么,但这个目录中的其他文件似乎也有这个附属文件,所以我认为这是正常的。 - ken
2
好的,我将把这个标记为正确答案...我只是从/etc/init/etc/default中删除了docker.io的引用(并且睡了一个晚上),现在sudo service docker start可以正常工作了。 - ken
sudo service docker restart 对我有效,通过 sudo service docker status 检查状态。 - MechaCode

22

我在14.04上使用docker 1.9.1时遇到了同样的问题。

即使我是root用户,当我使用sudo时,upstart服务命令确实起作用:

$ whoami
root
$ service docker status
status: Unbekannter Auftrag: docker

$ sudo service docker status
docker start/running, process 7394

这似乎取决于环境变量。

service docker status 在使用 su - 成为 root 用户时有效,但在只使用 su 时无效:

$ su
Password:
$ service docker status
status: unknown job: docker
$ exit
$ su -
Password:
$ service docker status
docker start/running, process 2342

1
这就是 su - rootsu root 之间的区别。如果以 su root 登录,则 sudo service docker status 是唯一可行的方法。如果以 su - root 登录,则 service docker status 应该可以正常工作! - VanagaS

9

这个问题占用了我几个小时的时间。

我的系统是Ubuntu 14.04,我通过sudo apt-get install docker安装了docker,并输入了一些其他命令导致了问题。

  1. 我在谷歌上搜索“unknown job: docker.io”,但没有得到有效的答案。

  2. 我查看了/etc/init.d/中“unknown job”的原因,但没有找到恰当的答案。

  3. 我寻找调试/etc/init.d/脚本的方法,但没有找到合适的答案。

  4. 然后,我进行了清理:

    1. sudo apt-get remove docker.io
    2. 使用find / -name "*docker*"命令来删除所有可疑文件,例如/etc/init/docker.io.conf/etc/init.d/docker.io等。
  5. 遵循最新的官方文档:https://docs.docker.com/installation/,其中有很多过时的文档可能会误导你。

最终,问题得到了解决。

注意:如果你在中国,由于GFW的缘故,你可能需要设置https_proxy从https://get.docker.com/安装docker。


8
我知道这个问题已经有答案了,但是你遇到这个问题的原因可能是因为你没有将你的用户名加入到docker组中。
以下是操作步骤:
如果docker组不存在,请先创建docker组:
```bash sudo groupadd docker ```
将当前用户添加到docker组中:
```bash sudo usermod -aG docker $USER ```
注销并重新登录系统,使更改生效。
sudo groupadd docker

将已连接用户${USER}添加到docker组中。更改用户名以匹配您喜欢的用户:

sudo gpasswd -a ${USER} docker

重新启动Docker守护进程:

sudo service docker restart

如果您使用的是Ubuntu 14.04-15.10*,请使用docker.io:

sudo service docker.io restart

如果您使用的是Ubuntu 16.04,则服务名称为“docker”。
要激活组的更改,请执行newgrp docker或注销/登录。

7

我在Ubuntu 14.04上遇到了同样的问题,以下是解决方案:

sudo service docker start

或者您可以列出图像。
docker images

0

我曾经遇到过同样的问题,原因是在/etc/default/docker中存在不安全注册表的行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接