簡體   English   中英

將容器作為主機暴露給 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 個容器在自己的網絡中運行。 如果你想與他們交談,那么你必須設置很多東西。

  • 容器的 IP 地址
  • 來自主機的路由( iptables是你的朋友)
  • 可能是您所有客戶的特殊路線(因為您必須使用可能與其他網絡沖突的私人 IP 地址)

最后......設置它非常困難。 如果您仍然想要它,那么您應該在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.

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