在 Docker 中部署 HAProxy,最稳妥的方式是通过卷挂载配置文件,并显式映射需要监听的端口,这样既能保证配置持久化,也能让外部流量正常进入容器。
先说结论:核心是把宿主机的配置文件和端口映射到容器内部对应位置,避免配置丢失和网络不通。
- 适合:需要长期运行的负载均衡或反向代理场景
- 先准备:宿主机上的 haproxy.cfg 配置文件和需要开放的端口规划
- 验收:容器启动无报错,外部能访问映射端口且日志正常
命令速用版
docker run -d `--name` haproxy \ -v /etc/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro \ -p 80:80 -p 443:443 \ haproxy:latest上面命令中,-v用于挂载配置,-p用于映射端口,:ro表示只读权限,防止容器内误改。若开启 SELinux,需在卷挂载路径后添加:Z后缀。
最小配置模板
在宿主机创建/etc/haproxy/haproxy.cfg,以下是一个最小可用配置示例:
global log stdout format raw local0 maxconn 4096 defaults mode http timeout connect 5s timeout client 50s timeout server 50s frontend http_front bind *:80 default_backend http_back backend http_back balance roundrobin server web1 192.168.1.10:80 checkDocker Compose 部署方案
推荐使用 Docker Compose 管理配置,创建docker-compose.yml:
version: '3' services: haproxy: image: haproxy:latest container_name: haproxy ports: - "80:80" - "443:443" volumes: - ./haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro restart: always启动命令:docker-compose up -d。
分步处理
1. 准备配置文件
在宿主机创建一个目录,例如/etc/haproxy,并在其中放入haproxy.cfg。确保配置语法正确,至少包含 global 和 defaults 段落。
2. 检查端口占用
在启动前,确认宿主机上计划映射的端口(如 80、443)没有被其他程序占用。可以使用ss -tlnp | grep 80查看。
3. 配置文件语法检查
修改配置后建议先在宿主机检查语法(需安装 haproxy 包):
haproxy -c -f /etc/haproxy/haproxy.cfg # 输出示例:Configuration file is valid4. 启动容器
使用上述 docker run 命令或 docker-compose 启动。
5. 权限调整
如果遇到权限错误,检查宿主机配置文件是否允许 Docker 进程读取。在开启 SELinux 的系统上,可能需要添加:Z后缀或使用chcon -Rt svirt_sandbox_file_t /etc/haproxy调整上下文。
怎么验证是否生效
1. 查看容器状态
执行docker ps确认容器处于 Up 状态。
2. 检查日志
执行docker logs haproxy,观察是否有 "Starting HAProxy" 字样,且没有报错信息。
3. 连通性测试
在另一台机器或本地使用curl -v http://宿主机 IP:映射端口测试能否得到响应。
常见坑
1. 配置语法错误导致启动失败
HAProxy 对配置语法要求严格,修改配置后建议先在宿主机用haproxy -c -f haproxy.cfg检查语法,再重启容器。
2. 端口冲突
宿主机上如果已经运行了 Nginx 或其他占用 80 端口的服务,HAProxy 容器会启动失败。需要停止冲突服务或更换映射端口。
3. 配置文件路径错误
官方镜像默认配置路径是/usr/local/etc/haproxy/haproxy.cfg,挂载时目标路径必须一致,否则容器无法找到配置。
4. SELinux 权限拦截
CentOS/RHEL 系统开启 SELinux 时,默认禁止容器访问宿主机文件。挂载卷时务必添加:Z标记或调整文件上下文。
来源https://www.zjcp.cc/ask/11219.html