docker - 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
解决方案
您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
推荐阅读
- android - 无法在空对象上调用方法 doFirst():react.gradle
- node.js - 从连接表中选择列 - TypeOrm
- ios - Swift 2D 阵列性能
- c - 如何在C中的单行上制作倒数计时器打印结果?
- cassandra - Debezium MongoDB 源 JSON 接收到 Cassandra (LENSES.IO)
- python-3.x - 我在使用 python 时遇到问题,我正在尝试制作 QRcode 创建应用程序
- python - 如何在缩放时更新嵌入在 Scatter 中的 RecycleView 的数据值(即图像宽度、高度)?
- javascript - Node.js express:试图从 HTML 表单中获取文本,req.body 为空
- java - org.json.JSONException: JSONObject["weather"] 不是字符串
- javascript - 将选定的多个值复制到文本框