docker 将容器作为主机暴露给外部网络

k97glaaz  于 2022-12-03  发布在  Docker
关注(0)|答案(2)|浏览(326)

我没有使用Docker和Docker-compose的经验,但至少我知道如何让一个容器运行,下面是我的一个简单的react应用程序锅炉板的compose文件。我的意图是给它分配一个IP,这样我就可以从外部网络ping它,并且也可以在没有任何端口Map到主机的情况下访问它

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}

我不知道如何去做这件事,请协助
我尝试将网络部分中的驱动程序部分从bride更改为macvlan,构建将通过,但再次无法ping容器的ip。添加external:true,使整个过程失败

cidc1ykv

cidc1ykv1#

Docker容器运行在自己的网络中。如果你想和他们交谈,那么你必须设置很多东西。

  • 容器的IP地址
  • 从您的主机(iptables是您的朋友)开始的路由
  • 也许是一个特殊的路由为您所有的客户端(因为你必须使用私有的IP地址,这可能会与其他网络冲突)

最后...设置这个是相当硬核的,如果你还想要,那么你应该在https://serverfault.com/上问这个。
当你从Docker中公开端口功能时,这会容易得多。
当这对你来说是不可能的时候,那么network: host可能会帮助你。

xoefb8l8

xoefb8l82#

设置容器外部访问的常规方法是使用Composeports:指令。试图避免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:,但我删除了所有其他与网络相关的设置,包括IP地址分配、DNS配置和命名覆盖。
这应该可以实现从其他主机访问容器的目标,这是标准的Docker设置。原则上,可以为您的主机分配另一个IP地址,并将容器Map到该地址,或者使用更奇特的设置,如Docker macvlan网络,但这些都是不寻常的设置,而且要复杂得多。

相关问题