如何在给定dockerfile的情况下启动docker?

如何在给定dockerfile的情况下启动docker?,docker,coreos,systemd,fleet,Docker,Coreos,Systemd,Fleet,我只是在试验coreOS、docker和fleet。 我有下一个dockerfile: FROM ubuntu:14.04 RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list RUN apt-get update RUN apt-get -y install nginx RUN echo "daemon off;" >> /etc/ngin

我只是在试验coreOS、docker和fleet。 我有下一个dockerfile:

FROM ubuntu:14.04

RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get -y install nginx

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
RUN mkdir /etc/nginx/ssl
ADD default /etc/nginx/sites-available/default

EXPOSE 80

CMD ["nginx"]
我从这个文件创建了一个图像(“nginx示例”),我可以通过以下方式启动容器:

docker run -v /home/core/share:/var/www:rw -p 80:80 -d nginx-example
现在,我想用fleet启动它,所以我知道我必须创建一个服务文件,然后用fleet启动它

因此,我尝试创建de服务文件(nginx1.service):

我提交并启动了它,但当我这样做时:

fleetctl list-units
nginx1.service  cbbed2c1.../IP  failed      failed
我不能运行网络服务器。 我认为问题出在服务文件中,但我不知道如何构造它。
谢谢。

在您的服务文件中,有一行关键内容应该让您思考:

ExecStartPre=/usr/bin/docker pull nginx-example
你认为这张照片是从哪里来的?
要拉取图像,首先需要将其推到某个位置。当然,最简单的是。您需要创建一个帐户。我将把创建帐户、存储库和配置身份验证的练习留给您,因为文档随时可用

现在,如果您只是尝试
docker push nginx example
,它将失败,因为它需要通过标记与您的用户帐户的名称空间相关联。为了回答这个问题,我们假设您的帐户是
kimberlybf

$docker tag nginx示例:最新kimberlybf/nginx示例:最新
-这将正确标记您的图像,以便推送到DockerHub

$docker push kimberlybf/nginx示例:最新版本
-这将实际推送您的图像。映像将是公共的,因此不要在配置中放置任何敏感数据

然后您将修改您的
服务
,并相应地替换容器标签,同时记住为容器命名,例如:

[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill nginx
ExecStartPre=-/usr/bin/docker rm nginx
ExecStartPre=/usr/bin/docker pull kimberlybf/nginx-example:latest
ExecStart=/usr/bin/docker docker run -p 80:80 -d --name nginx kimberlybf/nginx-example:latest
ExecStop=/usr/bin/docker stop nginx

您不应在守护程序模式(-d)下启动容器:

“如果要修改这些单位,请确保不要复制 docker运行命令,以分离模式(-d)启动容器。 分离模式不会将容器作为单元pid的子级启动。 这将导致装置仅运行几秒钟,然后退出。”

这项工作:

[Service]
TimeoutStartSec=0
ExecStartPre=/usr/bin/docker pull kimberlybf/nginx-example:latest
ExecStart=/usr/bin/docker run -p 80:80 -d --name nginx kimberlybf/nginx-example:latest

我把我的图片推到DockerHub上。

与您的问题没有直接关系,但另一个可能帮助您解决问题的小贴士是获取日志
journalctl--unit=nginx1.service
将“跟踪”服务中的日志,因此希望如果它无法启动,您能够从中收集到一些线索。谢谢您,实际上
journalctl--unit=nginx1.service
帮了我大忙。我推送我的图像使其工作,我也不得不删除这行:
ExecStartPre=-/usr/bin/docker kill nginx ExecStartPre=-/usr/bin/docker rm nginx ExecStop=/usr/bin/docker stop nginx
很高兴这有帮助。如果我理解正确,您已经删除了终止、删除和停止容器的行。您应该保留这些,因为当服务停止时,您希望它优雅地停止,而当它启动时,您希望确保旧的滞留容器被清理干净。当然,尽管有不同的用例。无论如何,如果我的答案似乎正确,请随意标记:)谢谢。
[Service]
TimeoutStartSec=0
ExecStartPre=/usr/bin/docker pull kimberlybf/nginx-example:latest
ExecStart=/usr/bin/docker run -p 80:80 -d --name nginx kimberlybf/nginx-example:latest