Docker network inspect无法显示docker-compose添加到网络的容器
Hadoop容器无法通过docker-compose自动连接外部网络的解决方法
问题描述
基于big-data-europe的Hadoop Docker镜像编写docker-compose文件,创建了namenode、datanode、resourcemanager、nodemanager、historyserver共5个容器,并配置了外部网络rete1,但容器并未自动加入该网络:
- 执行
docker network inspect rete1时,Containers字段为空 - 容器实际处于docker-compose默认创建的
docker-hadoop_default网络中(可通过docker network ls确认) - 手动执行
docker network connect rete1 <container_id>可成功连接,但需实现自动配置
问题原因
你的docker-compose文件仅定义了外部网络network1对应rete1,但未将任何服务容器关联到该网络。Docker Compose默认会为项目创建专属的默认网络,容器默认加入这个网络,而非你定义的外部网络。
解决方法
需要在每个服务块中明确指定使用已定义的外部网络,或者将该外部网络设置为项目默认网络。
方法1:为每个服务指定网络
修改docker-compose文件,在每个service块下添加networks配置,关联到定义的network1:
version: "3" services: namenode: image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8 container_name: namenode restart: always ports: - 9870:9870 - 9000:9000 volumes: - hadoop_namenode:/hadoop/dfs/name environment: - CLUSTER_NAME=test env_file: - ./hadoop.env networks: - network1 # 添加网络关联 datanode: image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8 container_name: datanode restart: always volumes: - hadoop_datanode:/hadoop/dfs/data environment: SERVICE_PRECONDITION: "namenode:9870" env_file: - ./hadoop.env networks: - network1 # 添加网络关联 resourcemanager: image: bde2020/hadoop-resourcemanager:2.0.0-hadoop3.2.1-java8 container_name: resourcemanager restart: always environment: SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864" env_file: - ./hadoop.env networks: - network1 # 添加网络关联 nodemanager1: image: bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8 container_name: nodemanager restart: always environment: SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864 resourcemanager:8088" env_file: - ./hadoop.env networks: - network1 # 添加网络关联 historyserver: image: bde2020/hadoop-historyserver:2.0.0-hadoop3.2.1-java8 container_name: historyserver restart: always environment: SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864 resourcemanager:8088" volumes: - hadoop_historyserver:/hadoop/yarn/timeline env_file: - ./hadoop.env networks: - network1 # 添加网络关联 volumes: hadoop_namenode: hadoop_datanode: hadoop_historyserver: networks: network1: external: name: rete1
方法2:设置默认网络为外部网络
更简洁的方式是将rete1设置为项目的默认网络,这样所有服务会自动使用该网络,无需逐个配置:
version: "3" services: namenode: image: bde2020/hadoop-namenode:2.0.0-hadoop3.2.1-java8 container_name: namenode restart: always ports: - 9870:9870 - 9000:9000 volumes: - hadoop_namenode:/hadoop/dfs/name environment: - CLUSTER_NAME=test env_file: - ./hadoop.env datanode: image: bde2020/hadoop-datanode:2.0.0-hadoop3.2.1-java8 container_name: datanode restart: always volumes: - hadoop_datanode:/hadoop/dfs/data environment: SERVICE_PRECONDITION: "namenode:9870" env_file: - ./hadoop.env resourcemanager: image: bde2020/hadoop-resourcemanager:2.0.0-hadoop3.2.1-java8 container_name: resourcemanager restart: always environment: SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864" env_file: - ./hadoop.env nodemanager1: image: bde2020/hadoop-nodemanager:2.0.0-hadoop3.2.1-java8 container_name: nodemanager restart: always environment: SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864 resourcemanager:8088" env_file: - ./hadoop.env historyserver: image: bde2020/hadoop-historyserver:2.0.0-hadoop3.2.1-java8 container_name: historyserver restart: always environment: SERVICE_PRECONDITION: "namenode:9000 namenode:9870 datanode:9864 resourcemanager:8088" volumes: - hadoop_historyserver:/hadoop/yarn/timeline env_file: - ./hadoop.env volumes: hadoop_namenode: hadoop_datanode: hadoop_historyserver: networks: default: external: name: rete1
验证步骤
- 停止并移除现有容器:
docker-compose down - 启动新配置的容器:
docker-compose up -d - 检查网络关联:
docker network inspect rete1,此时Containers字段会显示所有Hadoop容器的信息。
内容的提问来源于stack exchange,提问作者Bob
相关产品推荐
相关产品推荐

