将Traefik预启动脚本合并入Docker Compose配置的优化咨询
关于将Traefik整合进Docker Compose的疑问解答与优化建议
1. 将traefik-work网络改为bridge而非external是否合理?
完全合理,甚至是更推荐的做法:
- 原preload.sh创建external网络是为了提前让网络就绪,现在整合进compose后,compose会自动在启动服务前创建这个网络,无需手动干预。
- 只要所有需要和Traefik通信的服务都配置加入
traefik-work网络,服务间的通信不会有任何问题。 - 如果你没有外部容器(不在当前compose栈中的容器)需要接入这个网络,完全不需要保留
external: true;如果有外部容器需要接入,再考虑将网络设为external并提前创建。
2. Traefik容器的端口未在command中配置是否正确?
这取决于你的Traefik配置方式,直接不配置是错误的:
- Traefik v2+需要显式配置entrypoints来指定监听的端口,不管你是否在compose的
ports字段做了端口映射。 - 两种正确的配置方式:
- 方式一:在command中通过静态参数配置entrypoints,比如:
command: --entrypoints.web.address=:80 --entrypoints.websecure.address=:443 - 方式二:将静态配置写入
traefik.yml文件,通过volume挂载进容器,command中只需指定配置文件路径:command: --configfile=/etc/traefik/traefik.yml
- 方式一:在command中通过静态参数配置entrypoints,比如:
- 注意:compose的
ports字段只是做主机和容器的端口映射,和Traefik自身监听哪个端口是两回事,两者都需要配置才能让外部访问Traefik。
3. 给所有使用traefik-work网络的服务添加depends_on: traefik是否能确保Traefik先启动?
能保证容器启动顺序,但不能保证Traefik服务已经就绪可用:
depends_on的默认行为只是等待Traefik容器启动完成,不会检查Traefik的服务是否初始化完成、是否能处理请求。如果你的其他服务启动后立刻需要和Traefik通信,可能会出现连接失败的情况。- 优化方案:使用compose的
depends_on条件判断(需要compose file版本3.8及以上),配合Traefik的健康检查:- 给Traefik配置healthcheck:
services: traefik: healthcheck: test: ["CMD", "wget", "--spider", "http://localhost:8080/ping"] interval: 5s timeout: 3s retries: 3 - 其他服务的depends_on配置为:
depends_on: traefik: condition: service_healthy
- 给Traefik配置healthcheck:
4. Traefik容器的networks配置优化建议
假设你的基础配置是将Traefik加入traefik-work网络,这里给出几个优化点:
- 明确网络配置:给
traefik-work网络指定自定义子网,避免和主机其他Docker网络的IP段冲突:networks: traefik-work: driver: bridge ipam: config: - subnet: 172.20.0.0/16 - 添加网络别名:给Traefik在
traefik-work网络中设置别名,方便其他服务通过别名访问:services: traefik: networks: traefik-work: aliases: - traefik-proxy - 权限安全:如果Traefik需要通过Docker socket自动发现服务,挂载
/var/run/docker.sock时建议使用只读模式,并配置用户组权限,避免容器获得过高权限:volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - 分离配置文件:将Traefik的静态配置(entrypoints、providers等)和动态配置(路由、中间件等)分开,用volume挂载到容器中,比全写在command里更易维护。
整合后的示例docker-compose.yml片段
version: "3.8" networks: traefik-work: driver: bridge ipam: config: - subnet: 172.20.0.0/16 services: traefik: image: traefik:v2.11 command: --api.insecure=true --providers.docker=true --providers.docker.exposedbydefault=false --entrypoints.web.address=:80 ports: - "80:80" - "8080:8080" volumes: - /var/run/docker.sock:/var/run/docker.sock:ro networks: traefik-work: aliases: - traefik-proxy healthcheck: test: ["CMD", "wget", "--spider", "http://localhost:8080/ping"] interval: 5s timeout: 3s retries: 3 # 示例服务 my-app: image: nginx:alpine labels: - traefik.enable=true - traefik.http.routers.my-app.rule=Host(`my-app.local`) - traefik.http.routers.my-app.entrypoints=web networks: - traefik-work depends_on: traefik: condition: service_healthy
内容的提问来源于stack exchange,提问作者BigJobbies
相关产品推荐
相关产品推荐

