![](/img/trans.png)
[英]Connect Linux Containers in Windows Docker Host to external network
[英]exposing containers to external network as host
我沒有使用 docker 和 docker-compose 的經驗,但至少我知道如何讓容器運行,下面是我編寫的一個簡單的 React 應用程序樣板文件。 我的意圖是給它分配一個 IP,這樣我就可以從 external.network ping 它,並且無需任何端口映射到主機就可以訪問它
version: "3.9"
services:
front-web:
build:
context: .
dockerfile: Dockerfile
args:
buildno: 1.0.0
container_name: web-front
domainname: fontend
dns: 8.8.8.8
network_mode: "host"
hostname: alpha
restart: unless-stopped
stop_grace_period: 1m
expose:
- 4000
tty: true
pid: host
stdin_open: true
ports:
- target: 4000
published: 4000
protocol: tcp
mode: host
networks:
web-net:
ipv4_address: 192.168.1.195
volumes:
- web-front:/app/data
networks:
web-net:
name: web-net
driver: bridge
driver_opts:
enable_ipv4: 1
enable_ipv6: 1
ipam:
driver: default
config:
- subnet: 192.168.1.1/24
ip_range: 192.168.1.195/24
gateway: 192.168.1.195/24
volumes:
web-front:
該應用程序的 docker 文件如下
FROM node:alpine3.16
# RUN addgroup app && adduser -SG app app
# USER app
WORKDIR /app
RUN mkdir data
EXPOSE 4000
COPY package* .
RUN npm install
COPY . .
CMD [ "npm", "start" ]
忽略“adduser”,盡管它也無法鍛煉。 每當我運行 docker-compose 時,我都會收到一條錯誤消息:
Attaching to web-front
Error response from daemon: failed to add interface vethcf21a7d to sandbox: error setting interface "vethcf21a7d" IP to 192.168.1.195/24: cannot program address 192.168.1.195/24 in sandbox interface because it conflicts with existing route {Ifindex: 31 Dst: 192.168.1.0/24 Src: 192.168.1.1 Gw: <nil> Flags: [] Table: 254}
我不知道如何 go 關於這個,請協助
我嘗試將“網絡”部分中的驅動程序部分從 brigde 更改為 macvlan,構建將通過,但我再次無法通過其 ip ping 容器。添加外部:true,使整個事情失敗
Docker 個容器在自己的網絡中運行。 如果你想與他們交談,那么你必須設置很多東西。
iptables
是你的朋友)最后......設置它非常困難。 如果您仍然想要它,那么您應該在https://serverfault.com/上詢問。
當您從 docker 公開端口功能時,會容易得多。
如果這對您來說不可能,那么network: host
可能會幫助您。
設置對容器的外部訪問的正常方法是使用 Compose ports:
指令。 在大多數情況下,這是您唯一需要的與網絡相關的配置; 試圖避開ports:
幾乎總是更復雜。
您展示的 Dockerfile 是一個非常典型的 Node 應用程序。 您可以省略幾乎所有的 Compose 選項。 我可能會將其減少到不超過:
version: "3.8" # newest supported by all current common Compose implementations
services:
front-web:
build: . # default Dockerfile name, no args
restart: unless-stopped
ports:
- "4000:4000"
volumes: # only because you store data in the container
- web-front:/app/data
volumes:
web-front:
請特別注意,我確實有一個ports:
行,但我刪除了所有與 other.network 相關的設置,包括 IP 地址分配、DNS 配置和命名覆蓋。
這應該實現使容器可從其他主機訪問的既定目標,這是標准的 Docker 設置。 原則上,可以將另一個 IP 地址分配給您的主機,並將容器 map 分配給該地址,或者使用更奇特的設置,如 Docker macvlan.network,但這些設置不尋常且復雜得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.