docker-compose 里用 host 网络模式,意思是:容器不再拥有自己的网络 namespace,而是直接使用宿主机的网络栈。
env
- 3x ecs
- zk image
- docker-v26.1.3
⚠️:低版本的docker会导致启动异常
zk-compose
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| services: zk: image: harbor.pxb7.com/public/zookeeper:3.9 container_name: zk01 restart: always network_mode: host environment: ZOO_MY_ID: 1 ZOO_SERVERS: > server.1=172.21.208.220:2888:3888;2181 server.2=172.21.208.221:2888:3888;2181 server.3=172.21.208.222:2888:3888;2181 JVMFLAGS: "-Xms512m -Xmx512m" volumes: - ./zk/data:/data - ./zk/log:/log - ./zk/datalog:/datalog
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| services: zk: image: harbor.pxb7.com/public/zookeeper:3.9 container_name: zk02 restart: always network_mode: host environment: ZOO_MY_ID: 2 ZOO_SERVERS: > server.1=172.21.208.220:2888:3888;2181 server.2=172.21.208.221:2888:3888;2181 server.3=172.21.208.222:2888:3888;2181 JVMFLAGS: "-Xms512m -Xmx512m" volumes: - ./zk/data:/data - ./zk/log:/log - ./zk/datalog:/datalog
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| services: zk: image: harbor.pxb7.com/public/zookeeper:3.9 container_name: zk03 restart: always network_mode: host environment: ZOO_MY_ID: 3 ZOO_SERVERS: > server.1=172.21.208.220:2888:3888;2181 server.2=172.21.208.221:2888:3888;2181 server.3=172.21.208.222:2888:3888;2181 JVMFLAGS: "-Xms512m -Xmx512m" volumes: - ./zk/data:/data - ./zk/log:/log - ./zk/datalog:/datalog
|
二、host 模式的运行机制
flowchart LR
A[ZooKeeper Container] --> B[Host Network Stack]
B --> C[eth0 172.21.208.220]
对内核来说,这个容器进程就像:
/usr/bin/java -jar zookeeper.jar
只不过被 namespace 隔离了文件系统。
三、容器网络模型应用场景
容器网络模型有三种思路:
flowchart TB
A[bridge] -->|NAT| B[适合业务服务]
C[host] -->|无NAT| D[适合中间件]
E[macvlan] -->|真实IP| F[适合大型集群]
如果你是三台物理机,每台跑一个 zk 容器,最干净模型是(network_mode: host):
- host 模式
- 每台只跑一个实例
- IP 就是物理 IP
这比 macvlan 更简单。