You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过静态IP跨VM访问Docker Cassandra容器的macvlan网络问题排查

问题排查:Macvlan网络下Cassandra容器无法被主机及其他虚拟机访问

环境背景

  • 两台Ubuntu 22.04 LTS虚拟机(Oracle VirtualBox),已配置桥接网络
  • 第一台虚拟机运行Cassandra Docker容器,目标是让第二台虚拟机通过容器静态IP(192.168.1.200)使用cqlsh访问
  • 使用Docker bridge网络时,通过虚拟机IP+9042端口可正常建立cqlsh连接

问题现象

配置macvlan网络CASnetwork后:

  1. 主机虚拟机无法ping通容器静态IP 192.168.1.200
  2. 主机执行sudo lsof -nPi | grep 90未发现Cassandra相关端口监听
  3. nodetool status显示容器已分配静态IP且状态正常(UN)

相关配置与输出

1. Macvlan网络创建命令

docker network create -d macvlan --gateway 192.168.1.198 --subnet 192.168.1.197/28 -o parent=enp0s8 CASnetwork

2. nodetool状态输出

docker exec -it cassandra1 nodetool status

Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load        Tokens  Owns (effective)  Host ID                               Rack 
UN  192.168.1.200  297.98 KiB  256     100.0%            4254dee6-fe6e-49ce-afa6-6cb6561b2bf3  rack1

3. 主机端口监听情况

~/Cassandra$ sudo lsof -nPi | grep 90
systemd-r  445 systemd-resolve   13u  IPv4  19069      0t0  UDP 127.0.0.53:53 
systemd-r  445 systemd-resolve   14u  IPv4  19070      0t0  TCP 127.0.0.53:53 (LISTEN)

4. docker-compose.yml配置

version: '3.8'

services:
  cassandra1:
    image: cassandra:latest
    container_name: cassandra1
    ports:
      - 9042:9042
      - 7000:7000
    environment:
      - CASSANDRA_SEEDS=cassandra1
      - CASSANDRA_CLUSTER_NAME='cassandra-cluster'
      - CASSANDRA_NUM_TOKENS=256
      - CASSANDRA_RPC_ADDRESS=0.0.0.0
      - CASSANDRA_LISTEN_ADRESS=192.168.1.200
      - CASSANDRA_START_PRC=true
      - CASSANDRA_BROADCAST_ADDRESS=192.168.1.200
    networks:
      CASnetwork:
        ipv4_address: 192.168.1.200
    volumes:
      - cassandra-data:/var/lib/cassandra

volumes:
  cassandra-data:
    driver: local

networks:
  CASnetwork:
      name: CASnetwork
      external: true

排查分析与解决建议

1. 修复Cassandra配置拼写错误

docker-compose.yml中存在两处环境变量拼写错误,这是导致端口未监听的核心原因:

  • CASSANDRA_LISTEN_ADRESS应为CASSANDRA_LISTEN_ADDRESS(缺少字母D),错误配置会导致Cassandra无法绑定到指定静态IP
  • CASSANDRA_START_PRC应为CASSANDRA_START_RPC(字母R误写为P),RPC服务未启动会导致cqlsh无法连接

修正后的环境变量段:

environment:
  - CASSANDRA_SEEDS=cassandra1
  - CASSANDRA_CLUSTER_NAME='cassandra-cluster'
  - CASSANDRA_NUM_TOKENS=256
  - CASSANDRA_RPC_ADDRESS=0.0.0.0
  - CASSANDRA_LISTEN_ADDRESS=192.168.1.200
  - CASSANDRA_START_RPC=true
  - CASSANDRA_BROADCAST_ADDRESS=192.168.1.200

2. 解决Macvlan主机访问限制

Macvlan网络默认隔离主机与容器的通信,因为虚拟接口流量不经过主机网络栈。要让主机能访问容器,需在主机上创建同网段的macvlan子接口:

# 创建macvlan子接口
sudo ip link add macvlan0 link enp0s8 type macvlan mode bridge
# 分配同网段IP(需在192.168.1.193-206范围内,避开容器和网关IP)
sudo ip addr add 192.168.1.199/28 dev macvlan0
# 启用接口
sudo ip link set macvlan0 up
# 添加路由规则
sudo ip route add 192.168.1.197/28 dev macvlan0

3. 移除冗余端口映射

Macvlan容器拥有独立网络IP,无需配置ports字段做端口转发,删除- 9042:9042和- 7000:7000即可,避免不必要的端口冲突。

4. 验证容器内部端口监听

不要在主机上检查端口,进入容器内部确认Cassandra监听状态:

docker exec -it cassandra1 netstat -tulpn | grep 9042

若输出包含192.168.1.200:9042或0.0.0.0:9042,说明Cassandra已正确绑定端口。

5. 验证子网与网关连通性

在容器内ping网关IP,确认网络路由正常:

docker exec -it cassandra1 ping 192.168.1.198

若无法ping通,需检查网关是否存在、虚拟机桥接网络是否正常获取到同网段IP。


内容的提问来源于stack exchange,提问作者Alan Synix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:00:41