Docker best practices指南指出:
“......你应该只在一个容器中运行一个进程......”
Nginx和PHP-FPM应该在不同的容器中运行吗?或者这是否意味着微服务架构只在容器中运行一个服务或“app”?
将这些服务放在一个容器中似乎更容易部署和维护。
答案 0 :(得分:5)
根据用例,可以在单个容器中运行多个进程,但我不建议这样做。
在某种意义上,在不同的容器中运行它们更简单。保持容器小,无状态,并且只需一个工作就可以更容易地维护它们。让我告诉你我的容器工作流程是如何处于类似的情况。
所以:
拥有这种结构,部署是模块化的,因此每个“服务”都是独立的,并且在逻辑上独立于系统的其他部分。
作为副作用,在此特定情况下,您可以对应用程序执行零停机时间部署(更新)。这背后的想法很简单。当您必须进行更新时,使用更新的应用程序创建docker镜像,运行容器,运行所有测试和维护脚本,如果一切顺利,则将新创建的容器添加到链(负载均衡器),并且轻轻地杀死旧的。就是这样,你有更新的应用程序,用户根本没有注意到它。
答案 1 :(得分:2)
这意味着在Linux / Unix意义上的过程。也就是说,没有什么可以阻止你在容器中运行多个进程,这不是推荐的范例。
答案 2 :(得分:1)
我们发现我们可以使用Supervisord运行多项服务。它使架构变得非常简单,只需要你有一个额外的supervisor.conf文件。例如:
supervisord.conf
[supervisord]
nodaemon=true
[program:apache2]
command=/bin/bash -c "source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND"
[program:udpparser]
command=bin/bash -c "exec /usr/bin/php -f /home/www-server/services/udp_parser.php"
来自Dockerfile:
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y apache2 supervisor php5 php5-mysql php5-cli
RUN mkdir -p /var/lock/apache2 /var/run/apache2 /var/log/supervisor
RUN a2enmod rewrite
RUN a2enmod ssl
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
ADD 000-default.conf /etc/apache2/sites-enabled/
ADD default-ssl.conf /etc/apache2/sites-enabled/
ADD apache2.conf /etc/apache2/
ADD www-server/ /home/www-server/
EXPOSE 80 443 30089
CMD ["/usr/bin/supervisord"]
作为 最佳实践 ,我们只会在服务受益于一起运行而其他所有容器都是独立微服务的情况下执行此操作。