【问题标题】:Communication between two containers on the same host同一主机上的两个容器之间的通信
【发布时间】:2017-02-21 19:19:25
【问题描述】:

思路很简单,我需要从一个容器向另一个容器发送信号来重启nginx

ssh 中的第一个容器连接到nginx 容器是一个好的解决方案吗?

您还有其他推荐的方法吗?

【问题讨论】:

    标签: nginx docker dockerfile


    【解决方案1】:

    我不建议安装sshDocker 容器不是虚拟机,并且应该尊重微服务架构以从它提供的许多优势中受益。

    为了将信号从一个容器发送到另一个容器,您可以使用 docker API。

    首先您需要在所需容器之间共享/var/run/docker.sock

    docker run -d --name control -v /var/run/docker.sock:/var/run/docker.sock <Control Container>
    

    要将信号发送到名为 nginx 的容器,您可以执行以下操作:

    echo -e "POST /containers/nginx/kill?signal=HUP HTTP/1.0\r\n" | \
    nc -U /var/run/docker.sock
    

    另一个选项是使用带有自定义脚本的自定义图像,它会检查 nginx 配置文件,如果哈希值发生更改,则会发送重新加载信号。这样,每次修改config,nginx都会自动重新加载,也可以使用cmets手动重新加载。这类脚本在kubernetes 用户中很常见。下面是一个例子:

    nginx "$@"
    oldcksum=`cksum /etc/nginx/conf.d/default.conf`
    
    inotifywait -e modify,move,create,delete -mr --timefmt '%d/%m/%y %H:%M' --format '%T' \
    /etc/nginx/conf.d/ | while read date time; do
    
        newcksum=`cksum /etc/nginx/conf.d/default.conf`
        if [ "$newcksum" != "$oldcksum" ]; then
            echo "At ${time} on ${date}, config file update detected."
            oldcksum=$newcksum
            nginx -s reload
        fi
    
    done
    

    别忘了安装inotifywait 包。

    【讨论】:

    • 有外部入口点重启nginx不危险吗?
    • 取决于您的环境,有很多选项,您可以共享配置数据还有很多其他选项
    • 问题是我需要以root用户身份重启nginx,如果可能的话,我宁愿没有外部入口点。
    • 添加了另一个选项
    • 不,记住微服务,还有 docker 哲学,试着用它作为入口。
    猜你喜欢
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2018-05-21
    • 2019-04-22
    • 1970-01-01
    • 2016-03-22
    相关资源
    最近更新 更多