簡體   English   中英

Docker 組合端口映射

[英]Docker compose port mapping

我有一個 docker-compose yml 文件,如下所示

version: '2'
services:
  nodejs:
    build:
      context: .
      dockerfile: DockerFile
    ports:
      - "4000:4000"
    links:
      - redis
    expose:
      - "6379"
  redis:
    build:
      context: .
      dockerfile: Dockerfile-redis

我的目標是將 nodejs-127.0.0.1 端口 6379 轉發到 redis 主機。 我已經可以從 nodejs 機器 ping redis,但是端口沒有映射。 嘗試公開選項,但也沒有機會。

如果要從nodejs容器綁定到 redis 端口,則必須在redis容器中公開該端口:

version: '2'
services:
  nodejs:
    build:
      context: .
      dockerfile: DockerFile
    ports:
      - "4000:4000"
    links:
      - redis

  redis:
    build:
      context: .
      dockerfile: Dockerfile-redis
    expose:
      - "6379"

expose標簽將允許你暴露端口而不將它們發布到主機,但它們將暴露給容器網絡。

https://docs.docker.com/compose/compose-file/#expose

ports標簽將映射主機端口與容器端口HOST:CONTAINER

https://docs.docker.com/compose/compose-file/#ports

需要指出的是,上述所有解決方案都將端口映射到您機器上的每個接口。 如果您有一個公共 IP 地址,或者您的機器在大型網絡上有一個 IP,這不太理想。 您的應用程序可能會接觸到比您希望的更廣泛的受眾。

redis:
  build:
    context:
    dockerfile: Dockerfile-redis
    ports:
    - "127.0.0.1:3901:3901"

127.0.0.1是映射到您機器上主機名localhost的 IP 地址。 因此,現在您的應用程序僅通過該接口公開,並且由於127.0.0.1只能通過您的機器訪問,因此您不會向全世界公開您的容器。

文檔進一步解釋了這一點,可以在這里找到: https : //docs.docker.com/compose/compose-file/#ports


注意:如果您使用 Docker for mac,這將使容器偵聽 Docker for Mac VM 上的 127.0.0.1,並且無法從您的本地主機訪問。 如果我沒記錯的話。

如果要從主機(127.0.0.1)訪問redis ,必須使用ports命令。

redis:
  build:
    context: .
    dockerfile: Dockerfile-redis
    ports:
    - "6379:6379"

似乎這里的其他答案都誤解了您的問題。 如果我理解正確,您想向 localhost:6379(redis 的默認值)發出請求,並讓它們自動轉發到 redis 容器上的同一端口。

https://unix.stackexchange.com/a/101906/38639幫助我找到了正確的答案。

首先,您需要在圖像上安裝nc命令。 在 CentOS 上,此軟件包稱為 nmap-ncat,因此在下面的示例中,如果您使用不同的操作系統作為基本映像,只需將其替換為適當的軟件包即可。

接下來,您需要告訴它每次容器啟動時運行某個命令。 您可以使用 CMD 執行此操作。

# Add this to your Dockerfile
RUN yum install -y --setopt=skip_missing_names_on_install=False nmap-ncat
COPY cmd.sh /usr/local/bin/cmd.sh
RUN chmod +x /usr/local/bin/cmd.sh
CMD ["/usr/local/bin/cmd.sh"]

最后,我們需要在 cmd.sh 中設置端口轉發。 我發現nc ,即使使用-l-k選項,偶爾也會在請求完成時終止,所以我使用了一個 while 循環來確保它始終運行。

# cmd.sh
#! /usr/bin/env bash

while nc -l -p 6379 -k -c "nc redis 6379" || true; do true; done &

tail -f /dev/null # Or any other command that never exits

暫無
暫無

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

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