docker-compose 在向桥接设备 docker0 添加 veth(虚拟接口)时失败。

7

问题
以下是我的docker-compose.yaml文件:

version: '2'

services:
    elasticsearch:
        image: 'elasticsearch:latest'
        ports:
            - "9200:9200"

    logstash:
        build: './logstash_image'
        links:
            - elasticsearch
        ports:
            - "5000:5000"
            - "5001:5001"
            - "5201:5201"
            - "5202:5202"
            - "5203:5203"

    kibana:
        image: 'kibana:latest'
        ports:
             - '5601:5601'
        links:
             - elasticsearch
        volumes:
             - ./kibana.yml:/opt/kibana/config/kibana.yml

这是我的Dockerfile文件:

FROM logstash:latest

LABEL maintainer1.name="anon" \
      maintainer1.email="anon@mail.com" \
      maintainer2.name="myname" \
      maintainer2.email="myname@somemail.com"

RUN /opt/logstash/bin/logstash-plugin install logstash-input-log4j2-logstash2 logstash-output-syslog
# FIX: use `logstash-input-log4j2` instead of `logstash-input-log4j2-logstash2`?
# other plugins: logstash-input-http, logstash-input-log4j
COPY logstash.conf /etc/logstash/conf.d/logstash.conf

ENTRYPOINT ["logstash","-f","/etc/logstash/conf.d/logstash.conf", "--debug"]

这个几天前还能够成功构建,但是现在我收到了以下错误信息:

[root@somemachine elk_stack]# docker-compose up -d
Creating network "elkstack_default" with the default driver
Building logstash
Step 1 : FROM logstash:latest
 ---> 1ca34df702f8
Step 2 : LABEL maintainer1.name ...
 ---> Using cache
 ---> 6dd78ac216f2
Step 3 : RUN /opt/logstash/bin/logstash-plugin install logstash-input-log4j2-logstash2 logstash-output-syslog
 ---> Running in 885b0429b3a4
ERROR: Service 'logstash' failed to build: failed to create endpoint focused_almeida on network bridge: adding interface veth0491201 to bridge docker0 failed: operation not supported

错误:服务“logstash”构建失败:在网络桥上创建端点focused_almeida失败:将接口veth0491201添加到docker0桥时失败:操作不受支持。

看起来像是(1)docker-compose随机生成了一个名称分配给logstash服务,而不是elkstack_logstash_1,可能是因为compose没有完全执行。 (2)由于某种原因,veth0491201无法附加到docker0桥上,因此我无法从容器内部访问互联网,因为它未通过docker0连接。

调查
执行compose后输入docker ps -a

CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                                        NAMES
885b0429b3a4        6dd78ac216f2                "/bin/sh -c '/opt/log"   18 minutes ago      Created                                                          focused_almeida

在使用Compose后运行docker network ls命令。
NETWORK ID          NAME                          DRIVER            
23bcc8c01ad4        bridge                        bridge              
4aea66903c6b        none                          null                
67cb26c508d9        host                          host                
9fc4a42bbcf6        elkstack_default              bridge  

docker network inspect elkstack_default:

[
    {
        "Name": "elkstack_default",
        "Id": "9fc4a42bbcf6800889f8e9bc71ab394ebf6f97b21e0ce2345253b055d17138aa",
        "Scope": "local",
        "Driver": "bridge",
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1/16"
                }
            ]
        },
        "Containers": {},
        "Options": {}
    }
]

route -n:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.0.120.1      0.0.0.0         UG    100    0        0 docker0
10.0.120.0      0.0.0.0         255.255.255.0   U     100    0        0 docker0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-83e64c848669
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-9fc4a42bbcf6

故障排除提示:

  1. docker --version:Docker版本1.10.2,构建c3959b1
    docker-compose --version:docker-compose版本1.8.0,构建f3628c7
    Docker中存在某些网络错误吗?
  2. 我执行此操作的计算机最近进行了一些有关其网络、防火墙等方面的配置更改。
    我认为它正在为其他事情使用172.18.0.0,因此当Docker尝试使用该路由时,它被阻止了。我如何进行故障排除或确定问题是否与机器的网络设置有关?
  3. 关于(2)中提到的问题,我尝试制作一个docker-compose文件,在其中明确定义网络,但这似乎也没有起作用:
networks:
    net:
        driver: bridge
        ipam:
            driver: default
            config:
            - subnet: 172.30.0.0/16
              ip_range: 172.30.5.0/24
  • 我能在这台机器上使用docker-compose启动其他服务堆栈,这表明这是一个与Docker或docker-compose相关的缺陷,可能存在于应用程序本身或我的配置中。
  • 我可以让它在我的本地机器上工作,这表明这是我正在遇到问题的远程机器上存在的问题。

    uname -a: Linux somemachine 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    cat /etc/centos-release: CentOS Linux release 7.2.1511 (Core)

相关信息和问题:
- http://54.71.194.30:4017/articles/networking/#how-docker-networks-a-container
- https://github.com/docker/docker/issues/23047
- https://github.com/docker/docker/issues/15341


机器上的网络接口似乎存在问题。docker0桥接口被设置为默认网络接口,而不是eth0 - Petrus K.
2个回答

1

你的问题似乎与系统配置有关。

请尝试使用Unix命令brctl手动将veth添加到桥中。

命令应该是:

brctl addif veth0491201 docker0

这是启动虚拟机的脚本执行的命令,但是它失败了。通过解决这一步骤可能会说明原因。

我怀疑veth类型在您的系统上不兼容,您需要知道为什么。可能是桥软件部分的系统错误。

毫无疑问,您的问题与IP设置无关。

您可以尝试升级或降级内核,测试不同的内核版本。

如果没有更多关于“brctl addif veth0491201 docker0”命令期间发生的确切情况的细节,我就不能再说更多了。

虽然这将返回相同的“操作不支持”错误消息,但通过检查两个接口的所有内容,您可以找到“操作不支持”的好原因(错误类型接口)或具有良好接口类型的内核错误。


正如我在我的问题下的评论中提到的那样,这是机器上网络接口的问题。eth0没有被设置为默认接口,而是docker0成为了默认接口,导致错误。在此处阅读更多信息:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/3/html/Reference_Guide/s1-networkscripts-interfaces.html为了解决这个问题,对包含在/etc/sysconfig/network-scripts/中指定网络接口配置的文件进行了更改。 - Petrus K.

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接