Docker编写-将网络模式更改为“主机”会导致错误:来自守护程序的错误响应:无法将接口veth 701 c890添加到沙箱

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

this question之后,我编辑了我的网关容器以使用host网络模式:

services:
  gateway:
  ...
  network_mode: "host"

然后docker compose up -d会给出这个
来自守护程序的错误响应:无法将接口veth 701 c890添加到沙箱:将接口“veth 701 c890”IP设置为172.26.0.11/16:时出错,无法在沙盒接口中对地址172. 26. 0. 11/16进行编程,因为它与现有路由{Ifindex:4日期:172.26.0.0/16来源:172.26.0.1 Gw:旗标:[]表格:254
我重新启动了docker甚至服务器都没成功。
docker-compose.yml如下所示(只有gateway容器具有已发布的端口):

version: '3.4'

services:
  gateway:
    image: <ms-yarp>
    environment:
      - ASPNETCORE_URLS=https://+:443;http://+:80
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./tls/:/tls/
    networks:
      - mynet
    restart: on-failure

  orders:
    image: <registry>/orders
    environment:
      - ASPNETCORE_URLS=http://+:80
    networks:
      - mynet
    restart: on-failure

  users:
    image: <registry>/users
    environment:
      - ASPNETCORE_URLS=http://+:80
    networks:
      - mynet
    restart: on-failure

  smssender:
    image: <registry>/smssender
    environment:
      - ASPNETCORE_URLS=http://+:80
    networks:
      - mynet
    restart: on-failure

  logger:
    image: <registry>/logger
    environment:
      - ASPNETCORE_URLS=http://+:80
    networks:
      - mynet
    restart: on-failure

  notifications:
    image: <registry>/notifications
    environment:
      - ASPNETCORE_URLS=http://+:80
    networks:
      - mynet
    restart: on-failure

  cacheserver:
    image: <registry>/redis
    networks:
      - mynet
    restart: on-failure

  ...

networks:
  mynet:
oxf4rvwz

oxf4rvwz1#

您不能将主机网络与任何其他Docker网络选项结合使用。如果您将network_mode: host与其他networks:ports:选项结合使用,至少某些版本的Compose会发出警告。
在这个特定的设置中,主机网络的另一个含义是,使用它的一个容器是“外部Docker”,以便连接到其他容器。它的工作方式与非容器进程完全相同。这意味着其他容器需要发布ports:才能从网关访问,而网关配置又需要使用localhost和公布的端口号来到达其它容器。
第一个

pexxcrt2

pexxcrt22#

大概是这样的:(不适用于Windows WSL2上的Docker Desktop,至少我甚至无法运行docs中的nginx示例)

version: '3.4'

services:
  gateway:
    image: <ms-yarp>
    environment:
      - ASPNETCORE_URLS=https://+:443;http://+:80
    network_mode: host
    volumes:
      - ./tls/:/tls/
    restart: on-failure

  orders:
    image: <registry>/orders
    environment:
      - ASPNETCORE_URLS=http://+:80
    ports:
      - 8080:80  
    networks:
      - mynet      
    restart: on-failure

  users:
    image: <registry>/users
    environment:
      - ASPNETCORE_URLS=http://+:80
    ports:
      - 8081:80            
    networks:
      - mynet      
    restart: on-failure

  smssender:
    image: <registry>/smssender
    environment:
      - ASPNETCORE_URLS=http://+:80
    ports:
      - 8082:80                  
    networks:
      - mynet      
    restart: on-failure

  logger:
    image: <registry>/logger
    environment:
      - ASPNETCORE_URLS=http://+:80
    ports:
      - 8082:80                  
    networks:
      - mynet      
    restart: on-failure

  notifications:
    image: <registry>/notifications
    environment:
      - ASPNETCORE_URLS=http://+:80
    ports:
      - 8083:80                  
    networks:
      - mynet      
    restart: on-failure

  cacheserver:
    image: <registry>/redis
    restart: on-failure
    networks:
      - mynet

此外,在网关服务配置中,您还需要更改
从订单80到本地主机8080
从http://users:80更改为http://localhost:8081等等
此外,将8080至8083的Docker主机上的端口限制为只能从本地主机访问,而不能从Internet访问。
您甚至可以将所有容器(网关除外)放到另一个只能从运行网关容器的Docker主机访问的Docker主机上,并将网关中的配置从http://orders:80更改为http://otherdockerhost:80,等等。
但是,对于此Docker组合将不可行,您将需要使用docker run命令“手动”创建容器(或者有两个单独的组合项目,一个用于网关,另一个用于其余服务),因此这是需要更严格的容器编排工具(如kubernetes)的地方(您可以尝试DockerSwarm或Nomad或任何其他容器编制器,但这些都不是那么受欢迎,所以如果你是新的两个kubernetes和码头群或所有其他你最好从kubernetes开始,从长远来看,你会收获这个项目和你的个人运营商的好处)

相关问题