You're hardcoding the broker host and port
p = KafkaProducer(bootstrap_servers = ['localhost:9092', 'kafka:9092'], value_serializer=lambda v: json.dumps(v).encode('utf-8'))
but when running under Docker you need to connect to the listener that is correct for that network, namely kafka:29092
(which you have included at KAFKA_BROKERCONNECT
but I don't see it being read in your code).
So either update your code to use the environment variable, or change your hardcoded list to
p = KafkaProducer(bootstrap_servers = ['localhost:9092', 'kafka:29092'], value_serializer=lambda v: json.dumps(v).encode('utf-8'))
See this blog for thorough background on Kafka listeners, Docker, etc.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…