Как запустить докер с флотом по заданному докерфайлу?

Я просто экспериментирую с coreOS, докером и флотом. У меня есть следующий докер-файл:

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.

Поэтому я пытаюсь создать файл службы (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

И я не могу запустить веб-сервер. Я думаю, что проблема в служебном файле, но я не знаю, как его построить. Спасибо.

3 ответа

Решение

Вот ключевая строка в вашем сервисном файле, которая заставит вас задуматься:

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

Как вы думаете, откуда это изображение?
Для того, чтобы вытащить изображение, вам нужно сначала куда-то его подтолкнуть. Самым простым, конечно, является DockerHub. Вам нужно будет создать учетную запись. Я оставлю вам упражнение по созданию учетной записи, репозитория и настройке аутентификации, поскольку документация доступна здесь.

Теперь, если бы вы просто попробовали 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

Это работает:

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

Вы не должны запускать свой контейнер в режиме демона (-d):

"Если вы собираетесь изменить эти модули, убедитесь, что вы не копируете команду запуска docker, которая запускает контейнер в отдельном режиме (-d). В отдельном режиме контейнер не будет запускаться как дочерний элемент pid модуля. заставит устройство работать всего несколько секунд, а затем выйдет. "

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

Другие вопросы по тегам