如何在给定 docker 文件的情况下启动带有 fleet 的 docker?
How to launch a docker with fleet given a dockerfile?
我只是在试验 coreOS、docker 和 fleet。
我有下一个 docker 文件:
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 服务器。
我认为问题出在服务文件中,但我不知道如何构建它。
谢谢。
服务文件中的关键行应该让您思考:
ExecStartPre=/usr/bin/docker pull nginx-example
您认为这张图片是从哪里提取的?
为了 pull 图像,您需要先 push 到某个地方。最简单的当然是DockerHub. You will need to create an account. I'll leave the exercise of creating the account, repository, and configuring authentication to you, as the documentation is readily available here.
现在,如果您只是尝试 docker push nginx-example
,它会失败,因为它需要通过标签与您的用户帐户的命名空间相关联。为了这个答案,我们假设您的帐户是 kimberlybf
。
$ docker tag nginx-example:latest kimberlybf/nginx-example:latest
- 这将正确标记您的图像以推送到 DockerHub。
$ docker push kimberlybf/nginx-example:latest
- 这实际上会推动您的形象。图片将是 public,所以不要在您的配置中放置任何敏感数据。
然后你会修改你的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
您不应该以守护进程模式 (-d) 启动您的容器:
"If you are going to modify these units, be sure you don't copy a
docker run command that starts a container in detached mode (-d).
Detached mode won't start the container as a child of the unit's pid.
This will cause the unit to run for just a few seconds and then exit."
https://coreos.com/docs/launching-containers/launching/fleet-example-deployment/#service-files
这个有效:
[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。
我只是在试验 coreOS、docker 和 fleet。 我有下一个 docker 文件:
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 服务器。 我认为问题出在服务文件中,但我不知道如何构建它。 谢谢。
服务文件中的关键行应该让您思考:
ExecStartPre=/usr/bin/docker pull nginx-example
您认为这张图片是从哪里提取的?
为了 pull 图像,您需要先 push 到某个地方。最简单的当然是DockerHub. You will need to create an account. I'll leave the exercise of creating the account, repository, and configuring authentication to you, as the documentation is readily available here.
现在,如果您只是尝试 docker push nginx-example
,它会失败,因为它需要通过标签与您的用户帐户的命名空间相关联。为了这个答案,我们假设您的帐户是 kimberlybf
。
$ docker tag nginx-example:latest kimberlybf/nginx-example:latest
- 这将正确标记您的图像以推送到 DockerHub。
$ docker push kimberlybf/nginx-example:latest
- 这实际上会推动您的形象。图片将是 public,所以不要在您的配置中放置任何敏感数据。
然后你会修改你的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
您不应该以守护进程模式 (-d) 启动您的容器:
"If you are going to modify these units, be sure you don't copy a docker run command that starts a container in detached mode (-d). Detached mode won't start the container as a child of the unit's pid. This will cause the unit to run for just a few seconds and then exit."
https://coreos.com/docs/launching-containers/launching/fleet-example-deployment/#service-files
这个有效:
[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。