首页 > 解决方案 > Docker Centos7+haproxy1.8 80端口

问题描述

我正在centos 7之上构建一个docker haproxy 1.8自定义映像。我想为前端打开端口80但是每当IO启动容器时,它都会抱怨“无法在端口80上绑定套接字”,但是它可以绑定到8080其他不是照常使用。我相信它与内核参数有关,但我无法在返回“只读”文件系统的 dockerfile 中运行 sysctl。docker run 有 --sysctl 命令行,但我相信它没有任何效果。我的 Dockerfile 如下:

FROM centos:7
MAINTAINER "SAGAR"
ADD ["http://www.haproxy.org/download/1.8/src/haproxy-1.8.20.tar.gz", "/tmp/"]
RUN mkdir /etc/haproxy
COPY ["haproxy.cfg", "/etc/haproxy/"]
RUN yum -y update && \
yum -y install wget tar gcc pcre-static pcre-devel make perl zlib-devel openssl-devel systemd-devel make && \
groupadd -r haproxy && \
useradd -g haproxy -d /etc/haproxy -s /sbin/nologin  -c "Haproxy User" haproxy && \
chown -R haproxy:haproxy /etc/haproxy && \
chmod -R 774 /etc/haproxy && \
cd /tmp/ && \
tar -xvzf /tmp/haproxy-1.8.20.tar.gz && \
cd /tmp/haproxy-1.8.20 && \
make TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_CRYPT_H=1 USE_LIBCRYPT=1 USE_LINUX_TPROXY=1 USE_SYSTEMD=1 USE_THREAD=1 && \
make install && \
ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy && \
yum clean all; 
EXPOSE 80 443 13888 9000
USER haproxy 
CMD ["/usr/sbin/haproxy", "-W", "-f", "/etc/haproxy/haproxy.cfg"] 

我的 docker run 命令是:

 docker run -d --name haproxy --privileged -p 80:80 haproxy:80

标签: docker

解决方案


USER haproxy在启动 haproxy 之前使用,这意味着您正在使用普通用户运行应用程序。

但是在linux中,普通用户只能打开1024~65535的端口,root可以打开1024以下的端口,它们被称为特权端口

特权端口

低于 1024 的 TCP/IP 端口号的特殊之处在于普通用户不允许在其上运行服务器。这是一项安全功能,因为如果您在其中一个端口上连接到服务,您可以相当确定您拥有真实的东西,而不是某些黑客为您提供的假货。W3 服务器的正常端口号是端口 80。该号码已由 Internet 号码分配机构 IANA 分配给 WWW。

当您从非特权帐户运行服务器作为测试时,您通常会在其他端口上测试它,例如 2784、5000、8001 或 8080。

其实你可以看到haproxy 官方镜像,这里是它的dockerfile,他们可以使用 root 启动服务。

并且,如果你真的需要它,你可以指定用户haproxy.cfg,参考这个

global
    daemon
    maxconn 60000
    user haproxy

推荐阅读