【问题标题】:How to launch a docker with fleet given a dockerfile?如何在给定 dockerfile 的情况下使用舰队启动 docker?
【发布时间】:2015-06-16 23:40:37
【问题描述】:

我只是在试验 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-example”),我可以启动容器:

docker run -v /home/core/share:/var/www:rw -p 80:80 -d nginx-example

现在,我想用fleet启动它,所以我知道我必须创建一个服务文件,然后用fleet启动它。

所以我尝试创建de服务文件(nginx1.service):

[Unit]
Description=MyTry
After=docker.service
Requires=docker.service

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

我提交并开始了它,但是当我这样做时:

fleetctl list-units
nginx1.service  cbbed2c1.../IP  failed      failed

而且我无法运行 Web 服务器。 我认为问题出在服务文件中,但我不知道如何构建它。 谢谢。

【问题讨论】:

    标签: docker coreos systemd fleet


    【解决方案1】:

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

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

    https://coreos.com/docs/launching-containers/launching/fleet-example-deployment/#service-files

    【讨论】:

      【解决方案2】:

      这行得通:

      [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。

      【讨论】:

        【解决方案3】:

        这是您的服务文件中应该引起您思考的关键行:

        ExecStartPre=/usr/bin/docker pull nginx-example
        

        您认为这张图片是从哪里提取的?
        为了一张图片,你需要先push它到某个地方。最简单的当然是DockerHub。您将需要创建一个帐户。我将把创建帐户、存储库和配置身份验证的练习留给您,因为文档随时可用here

        现在,如果您只是尝试docker push nginx-example,它会失败,因为它需要通过标签与您的用户帐户的命名空间相关联。为了得到这个答案,我们假设您的帐户是kimberlybf

        $ docker tag nginx-example:latest kimberlybf/nginx-example:latest - 这将正确标记您的图像以推送到 DockerHub。

        $ docker push kimberlybf/nginx-example:latest - 这实际上会推动你的形象。该图像将是公开的,因此请不要将任何敏感数据放入您的配置中。

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

        [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
        

        【讨论】:

        • 与您的问题没有直接关系,但另一个可以帮助您解决问题的花絮是获取日志日志。 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
        • 很高兴有帮助。虽然如果我正确理解您的信息,您已经删除了杀死、删除和停止容器的行。您应该保留这些,因为当服务停止时,您希望它优雅地停止,而当它启动时,您希望确保清理旧的延迟容器。虽然当然有不同的用例。无论如何,如果我的回答似乎正确,请随时将其标记为 :) 谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-19
        • 1970-01-01
        • 2019-03-27
        • 1970-01-01
        • 2021-10-13
        • 1970-01-01
        相关资源
        最近更新 更多