多容器应用栈(node+主从redis)

这篇博客介绍了如何使用Docker构建一个多容器应用,包括一个Node.js服务和一个主从Redis集群。首先,从Ubuntu基础镜像开始,安装Node.js和npm,并配置Node.js应用。接着,创建Redis基础Dockerfile,安装Redis服务器并设置数据卷和暴露端口。然后,构建主Redis实例和从Redis实例的镜像,分别配置日志文件和从属关系。最后,演示了如何启动和连接这些容器,强调了查看日志文件的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. nodeDockerfile内容如下:

    FROM ubuntu:14.04 #基础的ubuntu环境

    RUN apt-get -y update #更新软件

    RUN apt-get -y install nodejs npm #安装Node.js和npm

    RUN ln -s /usr/bin/nodejs /usr/bin/node #做软链接

    RUN mkdir -p /var/log/nodeapp #在容器里面创建目录

    ADD nodeapp /opt/nodeapp/ #将node应用放到容器/opt/nodeapp/下面

    WORKDIR /opt/nodeapp #指定指定RUNCMDENTRYPOINT命令的工作目录

    RUN npm install #安装/opt/nodeapp下面的package.json

    VOLUME ["/var/log/nodeapp"] #授权可从容器访问的目录

    EXPOSE 3000 #开放宿主机器的3000端口

    ENTRYPOINT ["nodejs","server.js"] #运行/opt/nodeapp包下面的server.js文件

  2. 创建一个redis的基础Dockerfile文件

    FROM ubuntu

    RUN apt-get -y update

    RUN apt-get install redis-server

    VOLUME ["/var/lib/redis","/var/log/redis/"]

    EXPOSE 6379

  3. 构建步骤2的镜像docker build -t my/redis .

  4. 根据步骤3生成的my/redis镜像生成redis主服务器,内容如下

    FROM my/redis

    ENTRYPOINT ["redis-server","--logfile /var/log/redis/redis-server.log"]

  5. 构建步骤4的镜像docker build -t my/redis_primary .

  6. 同样根据步骤3生成的my/redis镜像来生成redis从服务器,内容如下

    FROM my/redis

    ENTRYPOINT ["redis-server","--logfile /var/log/redis/redis-replica.log","--slaveof redis_primary 6379"]

  7. docker build -t my/redis_replica .

  8. 运行redis主服务器,执行docker run -d --name redis_primary my/redis_primary

  9. 因为redis服务会将日志记录到文件而不是记录到标准输出,使用docker logs redis_primary查看不到任何输出.可以使用之前创建的/var/log/redis/redis-server.log文件来查看该内容.键入docker run -ti --rm --volumes-from redis_primary ubuntu cat /var/log/redis/redis-server.log,即使用ubuntu一次性容器查看redis主服务器的log

  10. 运行redis从服务器,执行docker run -d --name redis_replica --link redis_primary:redis_primary my/redis_replica

    1. 这里通过--link来链接到redis主服务器

  11. 运行node容器,docker run -d --name nodeapp -p 3000:3000 --link redis_primary:redis_primary my/nodejs

在Kubernetes上部署Redis主从集群可以采用不同的方法。一种常见的方法是使用StatefulSet来部署Redis。StatefulSet是为了解决有状态服务的问题而设计的,它可以为每个Pod分配固定的名称和稳定的网络标识。在Redis的部署中,可以使用StatefulSet来管理Redis主从节点。同时,可以使用Headless Service来为StatefulSet提供服务,Headless Service不会分配Cluster IP,而是返回所有Pod的Endpoint列表。这样可以确保在主从切换时,客户端可以正确地访问到Redis节点。\[3\] 另一种方法是在Kubernetes上创建一个额外的容器,专门用于进行Redis集群的管理控制。可以在该容器中安装Redis-tribe工具,通过该工具来初始化Redis集群。这种方法可以避免将初始化逻辑写入StatefulSet中,从而简化部署过程。\[2\] 需要注意的是,在Kubernetes上部署Redis Sentinel可能没有意义。因为在容器中,Pod的IP地址在重启时会发生变化,而Sentinel是以IP地址来进行探测和配置的。这导致Sentinel无法识别宕机后重新启动的Master节点,从而无法加入集群。虽然可以通过固定Pod的IP地址或使用NodePort来解决这个问题,但在Kubernetes中,Pod的重启和活性检测已经可以保证Redis主从的高可用性。因此,个人认为在Kubernetes上部署Sentinel没有意义。\[3\] #### 引用[.reference_title] - *1* *3* [k8s上部署高可用redis集群--三主三从](https://blog.youkuaiyun.com/Hlroliu/article/details/105859200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [K8S搭建redis主从集群](https://blog.youkuaiyun.com/zxc_123_789/article/details/122924616)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值