【问题标题】:restart nginx container when upstream servers is updated更新上游服务器时重启 nginx 容器
【发布时间】:2021-10-27 18:17:39
【问题描述】:

我想在 docker 容器内运行的 nginx 中添加/删除服务器

我在 Dockerfile 中使用 ADD 命令将我的 nginx.conf 添加到 /etc/nginx 目录。

# Copy a configuration file from the current directory
ADD nginx.conf /etc/nginx/

然后在我正在运行的 nginx 容器中具有这样的配置

# List of application servers
upstream app_servers {
    server 172.17.0.91:9000;
    server 172.17.0.92:9000;
    server 172.17.0.93:9000;
}

如何重启我的 nginx 才能使编辑的 nginx.conf 生效?

提前致谢!

【问题讨论】:

  • 由于您正在修改 Dockerfile,因此您需要重新构建 docker 映像,从而从该映像运行一个新容器。无法重新启动已过时容器中的 nginx 进程以读取它没有的新配置文件。
  • 我想我真的不太了解docker。我想,外部脚本,更新后,我只需执行 docker restart 或其他操作即可生效。再次重建图像有点不方便。因为我有其他脚本可以修改 nginx 配置。我想,我会停止使用 nginx docker。但是,嘿,我在其他应用程序中大量使用 docker。谢谢你的回答。
  • 结合下面 Dean Armada 的精彩回答,我建议您考虑使用 conf.d 安装一个卷,以便从 docker 主机、共享驱动器或什至只是一个 s3 持久保存它桶。然后它很容易编辑,并且软重新加载让它开始。此外,如果不确定,请在重新加载之前对其进行测试以避免停机!

标签: nginx docker


【解决方案1】:

在初始化 Docker Swarm 时不建议重新启动容器,因为它可能会删除 nginx 服务。所以如果你需要一个替代方案docker restart;你可以进入容器内部并运行nginx -s reload

例如,在 docker env 中,如果您有名为 nginx 的容器

docker exec <nginx_container_id> nginx -s reload

【讨论】:

  • 这似乎更好,破坏性更小。
  • 这正是我想要的。我不确定为什么杀死容器是公认的答案。
  • 有史以来最简单的解决方案。大多数人,比如我,有时可能会忘记 docker 中的一些任务是微不足道的,就像在主机中完成一样。
【解决方案2】:

要重新加载 NGINX 配置运行命令

docker kill -s HUP 容器名称

https://blog.docker.com/2015/04/tips-for-deploying-nginx-official-image-with-docker/

【讨论】:

  • 仅供参考,这可能对某些人有用,但对我不起作用。它只是简单地杀死了容器。之后我必须做docker start &lt;container name&gt; 才能恢复它
  • @jlee 设置restart policy
【解决方案3】:

简单方法Docker容器中重新加载Nginx

docker exec -it {container_name} nginx -s reload

使用 PowerShell

【讨论】:

    【解决方案4】:

    如果要重启NGINX进程,运行命令重启容器:

    docker restart <container name>
    

    https://blog.docker.com/2015/04/tips-for-deploying-nginx-official-image-with-docker/

    【讨论】:

    • 不确定,但有时当这些容器与 cloudfront 关联时,cloudfront 注册表会产生一些问题,并且容器本身会消失。
    【解决方案5】:

    如果您想在容器中执行此操作,您将需要服务/配置发现。像coreOS/etcdApache Zookeeper 这样的工具是用来促进这个过程的。公平警告:对于简单的应用程序,这些可能有点难以管理。

    还有docker-gen,比较容易上手。对于您所描述的场景,甚至还有一个 specific pre-made script

    【讨论】:

    • 感谢 nanaeu,我现在就试一试。生病回帖,我的结果是什么。如果这可行,我可能会改变在生产中使用它。到目前为止,我们只有容器、裸机上的 nginx 和清漆。当然是在测试机器上测试 nginx 容器。再次感谢您的建议!
    【解决方案6】:

    所有答案都是正确的,但只是为了澄清有许多不同的方法可以达到相同的结果。 例如

    1. docker kill -s SIGHUP container_name
    2. docker run nginx_image nginx -s reload
    3. docker exec -t container_name nginx -s reload

    Docker-Compose 的工作原理几乎相同:

    docker-compose kill -s SIGHUP container_name
    

    【讨论】:

      猜你喜欢
      • 2011-08-08
      • 2017-12-27
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 2022-01-24
      • 2011-08-13
      • 2017-03-16
      • 2021-06-14
      相关资源
      最近更新 更多