【问题标题】:frequent restart - docker containers in marathon/mesos频繁重启 - marathon/mesos 中的 docker 容器
【发布时间】:2015-07-29 15:18:40
【问题描述】:

在完全 dockerizing 我的网络服务器应用程序之前,我一直是成功的。现在我想通过 marathon 框架将它们直接部署到 mesos slave 来探索更多。 我可以通过两种不同的方法将 docker 容器部署到马拉松中,命令行或马拉松 Web UI。 两者都对我有用,但挑战是当我尝试部署我的 docker 映像时,马拉松经常重新启动作业,并且在 mesos UI 页面中,我可以看到同一个容器的许多已完成作业。每分钟接近 10 个任务。我相信这不是预期的。

我的 docker 文件如下所示:

FROM ubuntu:latest

#---------- file Author / Maintainer
MAINTAINER "abc"

#---------- update the repository sources list
RUN apt-get update && apt-get install -y \
apache2 \
curl \
openssl \
php5 \
php5-mcrypt \
unzip  

#--------- installing  composer
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer
RUN a2enmod rewrite

#--------- modifying the 000default file
COPY ./ /var/www/airavata-php-gateway
WORKDIR /etc/apache2/sites-available/ 
RUN sed -i 's/<\/VirtualHost>/<Directory "\/var\/www"> \n AllowOverride All \n <\/Directory> \n <\/VirtualHost>/g'  000-default.conf 
RUN sed -i 's/DocumentRoot \/var\/www\/html/DocumentRoot \/var\/www/g'  000-default.conf

WORKDIR /etc/php5/mods-available/ 
RUN sed -i 's/extension=mcrypt.so/extension=\/usr\/lib\/php5\/20121212\/mcrypt.so/g' mcrypt.ini 
WORKDIR /var/www/airavata-php-gateway/
RUN php5enmod mcrypt

#--------- making storage folder writable
RUN chmod -R 777 /var/www/airavata-php-gateway/app/storage

#-------- starting command
CMD ["sh", "-c", "sh pga-setup.sh ; service apache2 restart ; /bin/bash"]

#--------- exposing apache to default port
EXPOSE 80

现在我不知道如何解决这个问题,任何指导将不胜感激。 谢谢

【问题讨论】:

    标签: docker mesos mesosphere marathon


    【解决方案1】:

    Marathon 旨在运行长时间运行的任务。因此,在您的情况下,如果您启动的 Docker 容器不继续侦听特定端口,这意味着它成功或不成功退出,Marathon 将再次启动它。

    例如,我使用最简单的镜像hello-world 启动了一个 Docker 容器。这在几秒钟内就在 Mesos UI 中生成了 10 多个进程!这是意料之中的。 Docker 容器内的代码已成功执行并正常退出。自从它退出后,Marathon 确保该应用程序的另一个实例立即启动。

    另一方面,当我启动一个持续侦听端口 80 的 nginx 容器时,它会变成一个长时间运行的任务,并且只有在现有容器退出(成功或不成功)时才会启动新任务(Docker 容器)。

    您可能需要处理 Dockerfile 的 CMD 部分。有问题的容器在正常启动时是否继续运行?也就是说,没有 Marathon - 只使用普通的 docker run?如果是,请检查它是否继续以分离模式运行 - docker run -d。如果它退出,那么CMD 就是您需要处理的部分。

    【讨论】:

    • 感谢 Dharmit,是的,当我在没有马拉松的情况下运行我的 docker 容器时,它工作正常,即即使在分离模式下它也可以作为一个长时间运行的容器。因此,正如您所说,问题出在 CMD 部分。我添加了“/bin/bash”以使其成为一个长时间运行的容器,其中一些无法与 mesos 一起使用,所以我在前台添加了一个无限的 while(非忙于等待,只是一个睡眠条件)循环,这让我的 docker容器活着,这个技巧有效。频繁重启的问题是,在一个容器死掉和另一个容器启动之间,我的 Web 服务器变得不可用。
    • BTW Dharmit 你能告诉我你是如何使用马拉松来运行 docker 的吗?是通过命令提示符还是马拉松 UI?
    • @psaha4:我正在使用命令行。我创建了一个 json 文件并使用 curl 将其发布到 Marathon 的 /v2/apps 端点。 while 循环解决方案虽然可以解决问题,但看起来并不是一个优雅的解决方案。如果您每次都需要执行sh pga-setup.sh,为什么不将其添加到Dockerfile 中的RUN 语句中?
    • RUN 只会在 docker 构建期间执行。我需要一个 shell 文件,它可以根据我将传递的环境变量处理一些网络服务器文件。所以当我启动或运行 docker 时我需要这个。 CMD 将在 docker run/restart 期间执行它。
    猜你喜欢
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多