簡體   English   中英

在 Docker 容器之間共享 Linux 套接字

[英]Sharing Linux socket between Docker containers

我有兩個 Docker 容器redis (運行 Redis 數據庫)和node (運行 Node.js 應用程序)。 我的 Node.js 應用程序需要與 Redis 數據庫通信,但我不知道應該如何安排。 以下是我目前想到的一些方法:

  1. 將兩個容器放在一個網絡上,暴露(但不發布) redis容器的6379端口(或Redis服務器正在監聽的任何地方),並從node容器連接到暴露的端口。
  2. 讓 Redis 服務器監聽一個 UNIX 套接字,該套接字安裝到主機上的某個位置(即,在redis容器之外),該套接字也安裝到node容器中(這甚至可以工作嗎?)。
  3. 完全放棄分離容器的想法,將 Redis 服務器和 Node 應用程序放在同一個容器中(我真的不想這樣做)。

哪個選項是最好的,或者您還有其他建議嗎? 我想最大化性能安全性,但我也需要使用容器。

PS 那里有一些與此類似的問題,但似乎沒有一個回答我的問題。 話雖如此,如果您找到可能有幫助的現有答案,請鏈接到它。

據推測,第二種方法具有更高的性能。 這里這里有一些比較。

為了實現這種方法,您可以簡單地創建一個 docker 卷並將其安裝在兩個容器中。 例如,您可以基於redis映像創建 Dockerfile:

FROM redis:7-alpine

RUN mkdir -p /run/redis-socket
RUN chmod 777 /run/redis-socket
COPY ./etc/redis.conf /etc/redis.conf

ENTRYPOINT ["docker-entrypoint.sh", "/etc/redis.conf"]

並將這樣的配置寫入./etc/redis.conf

unixsocket /run/redis-socket/redis.sock
unixsocketperm 777 
port 0

然后將 docker 卷掛載到 redis 容器的/run/redis-socket/ 不要忘記將該卷掛載到節點容器中的任意路徑。

如果您使用 docker-compose,示例docker-compose.yml將如下所示:

version: "2.3"

services:
  redis:
    image: my-altered-redis-image
    container_name: my-redis
    volumes:
      - redis-socket:/run/redis-socket

  mynode:
    image: my-node-image
    container_name: my-node
    depends_on:
      - "redis"
    volumes:
      - redis-socket:/run/redis-socket

volumes:
  redis-socket:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM