无法通过Docker连接到外部服务器上的Zookeeper

时间:2018-08-08 17:37:27

标签: docker apache-kafka apache-zookeeper confluent debezium

我目前对所有这些工具都是陌生的,请您耐心地与我联系。

我正在尝试创建一个数据管道,以将MySQL数据库的更改推送到Kafka Broker。我正在尝试遵循教程here。如果所有docker容器(直接从debezium仓库下载)都位于本地计算机内,则可以使系统运行。

但是,如果我将MySQL,Kafka和Zookeeper码头工人放置在本地网络上的另一台计算机上并尝试连接它,则会出现以下错误:

private void ConfigurePolicies(IServiceCollection services)
{
    //get data by your way, here is only an example.
    var policies = new DefaultContext().AspNetPolicy
        .Include(x => x.AspNetPolicyRequirement)
        .Where(x => x.Enabled)
        .ToList();

    //map them to real policies
    services.AddAuthorization(options =>
    {
        policies.ForEach(aspNetPolicy =>
        {
            options.AddPolicy(aspNetPolicy.Name, policy =>
            {
                foreach (var aspNetPolicyRequirement in aspNetPolicy.AspNetPolicyRequirement.Where(x=>x.Enabled))
                {
                    switch (aspNetPolicyRequirement.RequirementType)
                    {
                        case RequirementType.Claim:
                        {
                            policy.RequireClaim(aspNetPolicyRequirement.RequirementName);
                            break;
                        }
                        case RequirementType.UserName:
                        {
                            policy.RequireUserName(aspNetPolicyRequirement.RequirementName);
                            break;
                        }
                        case RequirementType.Role:
                        {
                            policy.RequireRole(aspNetPolicyRequirement.RequirementName);
                            break;
                        }
                        case RequirementType.AuthenticatedUser:
                        {
                            policy.RequireAuthenticatedUser();
                            break;
                        }
                        case RequirementType.Assertion:
                        {
                            //policy.RequireAssertion(...);//To Do
                            break;
                        }
                    }
                }
            });

        });
    });
}

以下是我用来实现此目的的命令:

docker: Error response from daemon: could not get container for zookeeper: No such container: zookeeper.

两台机器可以在所有涉及的端口上相互通信(Zookeeper为2181,Kafka为9092,MySQL为3306)。

我还尝试提供属性名称

sudo docker run -it --rm --name connect \
    -p 8083:8083 \
    -e GROUP_ID=1 \
    -e CONFIG_STORAGE_TOPIC=my_connect_configs \
    -e OFFSET_STORAGE_TOPIC=my_connect_offsets \
    -e ADVERTISED_HOST_NAME=192.168.31.214 \
    -e ADVERTISED_PORT=2181 \
    --link zookeeper:zookeeper \
    --link kafka:kafka \
    --link mysql:mysql \
    debezium/connect:0.8

并将host属性修改为

-e ADVERTISED_PORT=2181

两者都没有帮助。

据我了解,有一些属性可以将各个链接绑定到计算机上的端口,但是我找不到该属性。请让我知道我要怎么做。

1 个答案:

答案 0 :(得分:1)

我认为-e ADVERTISED_PORT=2181对于Debezium容器没有意义。那是一个Zookeeper端口,它运行在其他地方,而不是在Debezium内部。同样,对于播发的主机名,这是Kafka服务器的属性,不会由Debezium容器加载(并且也不应使用端口2181)

如果Zookeeper和其他软件在另一台计算机上,则--link将不起作用。该教程假定一切都在一台机器上运行

如果您正在使用Docker Swarm,则需要设置并使用“覆盖网络”。

否则,您需要将Debezium配置指向另一台计算机的外部IP地址。但是,这不是解决问题的“ Docker方法”,因为您不必知道容器在哪些主机上运行。