Docker多项目容器网络配置:跨项目访问+容器隔离+SSH端口映射
Docker Compose 实现跨项目访问+容器隔离方案
核心配置思路
要满足需求,关键是做两层网络隔离:
- 给所有Resources容器分配一个共享网络,允许Users容器接入
- 每个Users容器分配专属的独立网络,避免互相通信,同时映射SSH端口到主机
一、分项目实现方案
1. Resources 项目配置(docker-compose.yml)
先创建Resources的专属网络,让内部服务都在这个网络里:
version: '3.8' networks: resources_net: driver: bridge # 允许外部容器(Users)访问,不要设为internal: true services: resource_db: image: mysql:8.0 networks: - resources_net environment: MYSQL_ROOT_PASSWORD: example # 按需添加数据卷、端口映射等配置
启动Resources项目,自动创建resources_net网络:
docker-compose up -d
2. Users 项目配置(docker-compose.yml)
每个Users容器单独使用专属网络,同时接入Resources的共享网络,避免容器间互访:
version: '3.8' networks: resources_net: external: true # 引用Resources项目创建的外部网络 user1_net: driver: bridge internal: true # 仅允许当前容器和关联网络访问 user2_net: driver: bridge internal: true services: user1_ssh: image: linuxserver/openssh-server ports: - "2222:22" # 主机端口2222映射到容器SSH端口 networks: - user1_net - resources_net environment: PUID: 1000 PGID: 1000 USER_PASSWORD: user1pass user2_ssh: image: linuxserver/openssh-server ports: - "2223:22" # 不同用户用不同主机端口 networks: - user2_net - resources_net environment: PUID: 1000 PGID: 1000 USER_PASSWORD: user2pass
启动Users项目:
docker-compose up -d
二、macvlan 问题修复(若坚持使用)
如果之前用macvlan遇到访问问题,需要补全主机端配置:
- 开启主机网卡混杂模式:
ip link set eth0 promisc on
- 创建macvlan网络时指定子网和网关:
docker network create -d macvlan \ --subnet=192.168.1.0/24 \ --gateway=192.168.1.1 \ -o parent=eth0 macvlan_net
- 添加主机路由,让主机能访问macvlan容器:
ip route add 192.168.1.0/24 dev eth0
注意:macvlan默认允许同网络容器互访,需额外添加iptables规则阻止Users容器间通信,不如bridge方案简便。
三、更优方案:单Compose项目统一管理
没必要拆分两个项目,把所有服务放在同一个compose文件里,管理更高效:
version: '3.8' networks: resources_net: driver: bridge user1_net: driver: bridge internal: true user2_net: driver: bridge internal: true services: # Resources 服务 resource_db: image: mysql:8.0 networks: - resources_net environment: MYSQL_ROOT_PASSWORD: example volumes: - db_data:/var/lib/mysql # Users SSH 服务 user1_ssh: image: linuxserver/openssh-server ports: - "2222:22" networks: - user1_net - resources_net environment: PUID: 1000 PGID: 1000 USER_PASSWORD: user1pass user2_ssh: image: linuxserver/openssh-server ports: - "2223:22" networks: - user2_net - resources_net environment: PUID: 1000 PGID: 1000 USER_PASSWORD: user2pass volumes: db_data:
优势
- 一键启动/停止所有服务,无需维护多个配置文件
- 网络和资源集中管理,避免外部网络依赖问题
- 扩展更方便,新增用户或资源服务只需追加配置
验证方法
- 进入user1容器,尝试ping user2容器的IP/名称,应无法连通
- 在user1容器内ping resource_db,应能正常访问
- 从公网/主机执行
ssh user@你的主机IP -p 2222,可登录user1容器;同理用2223端口登录user2容器
内容的提问来源于stack exchange,提问作者jackops
相关产品推荐
相关产品推荐

