Как запустить докер с флотом по заданному докерфайлу?
Я просто экспериментирую с 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/