[英]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
需要指出的是,上述所有解決方案都將端口映射到您機器上的每個接口。 如果您有一個公共 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.