Linux

docker中的HAProxy

  • October 1, 2021

我正在嘗試在 docker 上執行 haproxy,但它不起作用。

這是我所做的:

  1. 創建的 Dockerfile 包含以下文本:
FROM haproxy:2.3
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
  1. 這是我的 haproxy.cfg:
global
       log /dev/log    local0
       log /dev/log    local1 notice
       chroot /var/lib/haproxy
       stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
       stats timeout 30s
       user haproxy
       group haproxy
       daemon

defaults
       log     global
       mode    http
       option  httplog
       option  dontlognull
       timeout connect 10s
       timeout client  60s
       timeout server  60s
#        errorfile 400 /etc/haproxy/errors/400.http
#        errorfile 403 /etc/haproxy/errors/403.http
#        errorfile 408 /etc/haproxy/errors/408.http
#        errorfile 500 /etc/haproxy/errors/500.http
#        errorfile 502 /etc/haproxy/errors/502.http
#        errorfile 503 /etc/haproxy/errors/503.http
#        errorfile 504 /etc/haproxy/errors/504.http

frontend https_in
       mode tcp
       option tcplog
       bind *:443
       acl tls req.ssl_hello_type 1
       tcp-request inspect-delay 5s
       tcp-request content accept if tls
       
       acl host_server1 req.ssl_sni -i my1stdomain.com
       acl host_server2 req.ssl_sni -i my2nddomain.com

       use_backend https_Server if host_server1
       use_backend https_NUC if host_server2

backend https_Server
       mode tcp
#        option tcplog
       option ssl-hello-chk
       server Server 10.0.0.10:443

backend https_NUC
       mode tcp
#        option tcplog
       option ssl-hello-chk
       server NUC 10.0.0.40:443
  1. 目的是將 SSL 埠 443my1stdomain.com指向 LAN IP10.0.0.10my2nddomain.comIP10.0.0.40
  2. docker 應該位於 10.0.0.44,所以這些是我執行的命令:
docker build -t my-haproxy .

結果:

Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM haproxy:2.3
---> 397cf3d55fac
Step 2/2 : COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg
---> Using cache
---> a5cc1ff3c0c6
Successfully built a5cc1ff3c0c6
Successfully tagged my-haproxy:latest

然後,我測試了配置:

docker run -it --rm --name haproxy-syntax-check my-haproxy haproxy -c -f /usr/local/etc/haproxy/haproxy.cfg
Configuration file is valid

然後,我嘗試執行它:

docker run -d --name haproxy --restart=always -p 10.0.0.44:443:443/tcp my-haproxy
a253dbce7341e454353e9a2b4278e22ae8172ed106aeec7

但是,當我執行時docker ps,我發現它並沒有真正執行:

docker ps
CONTAINER ID   IMAGE                                     COMMAND                  CREATED              STATUS                          PORTS                                                                    NAMES
a253dbce7341   my-haproxy                                "docker-entrypoint.s…"   About a minute ago   Restarting (1) 12 seconds ago                                                                            haproxy

有什麼建議嗎?

您應該檢查此容器的故障日誌,而不是總是重新啟動它。您可以從命令中刪除-d標誌以在前台執行此容器,以便在標準輸出上獲取日誌:

docker run --name haproxy --restart=always -p 10.0.0.44:443:443/tcp my-haproxy

我用你haproxy.cfg來檢查問題。我在容器日誌中發現了以下兩個問題:

  • 您正在使用/var/lib/haproxychroot 但此目錄不能由非 root 使用者創建。因此,您可以顯式創建它並將所有權更改為haproxy使用者。
  • stats socket /run/haproxy/admin.sock命令中,/run/haproxy需要創建目錄。

因此,您的 Dockerfile 應該像這樣更新以使其工作:

FROM haproxy:2.3
RUN mkdir --parents /var/lib/haproxy && chown -R haproxy:haproxy /var/lib/haproxy
RUN mkdir /run/haproxy
COPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

引用自:https://serverfault.com/questions/1065786