我没有使用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,使整个过程失败
2条答案
按热度按时间cidc1ykv1#
Docker容器运行在自己的网络中。如果你想和他们交谈,那么你必须设置很多东西。
iptables
是您的朋友)开始的路由最后...设置这个是相当硬核的,如果你还想要,那么你应该在https://serverfault.com/上问这个。
当你从Docker中公开端口功能时,这会容易得多。
当这对你来说是不可能的时候,那么
network: host
可能会帮助你。xoefb8l82#
设置容器外部访问的常规方法是使用Compose
ports:
指令。试图避免ports:
的设置几乎总是更加复杂。您显示的Dockerfile是一个非常典型的Node应用程序。您可以省略几乎所有的Compose选项。我可能会将其简化为不超过:
请特别注意,我确实有一行
ports:
,但我删除了所有其他与网络相关的设置,包括IP地址分配、DNS配置和命名覆盖。这应该可以实现从其他主机访问容器的目标,这是标准的Docker设置。原则上,可以为您的主机分配另一个IP地址,并将容器Map到该地址,或者使用更奇特的设置,如Docker macvlan网络,但这些都是不寻常的设置,而且要复杂得多。