Nginx encountered an error log after docker started the container

  docker, question

1. After the image is build, start the container. supervisord is used in the container to start multiple services, and then the following error occurs

2019/03/09 17:33:58 [emerg] 81#0: still could not bind()
 2019/03/09 17:34:01 [emerg] 82#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
 2019/03/09 17:34:01 [emerg] 82#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
 2019/03/09 17:34:01 [emerg] 82#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
 2019/03/09 17:34:01 [emerg] 82#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
 2019/03/09 17:34:01 [emerg] 82#0: bind() to 0.0.0.0:80 failed (98: Address already in use)

Dockerfile content

ARG OS_VER=latest


FROM centos:$OS_VER
MAINTAINER zxd <zhenxidog@163.com>


#root用户密码
ARG ROOT_PASSWORD=123456
#php版本,因为php版本间配置文件模板不相同,此处的版本号只能为大于7.0以上版本
ARG PHP_VER=7.2.8
#nginx版本
ARG NGINX_VER=1.15.2
#xhprof版本
ARG XHPROF_VER=1.2
#hiredis版本
ARG HIREDIS_VER=0.13.3
#swoole版本
ARG SWOOLE_VER=4.0.4


#映射配置文件
ADD ./etc /usr/src/etc


#基础环境配置
RUN yum install vim wget git net-tools -y \
    && yum install epel-release -y \
    && yum update -y \
    && yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel libxml2 libxml2-devel libjpeg libjpeg-devel \
        libpng libpng-devel curl curl-devel libicu libicu-devel libmcrypt  libmcrypt-devel freetype freetype-devel \
        libmcrypt libmcrypt-devel autoconf gcc-c++ gcc make automake cmake ncurses-devel bison bison-devel\
    && yum install vixie-cron crontabs -y \
    && yum install python-setuptools -y \
    && easy_install supervisor \
    && yum install openssh-server -y \
    && yum install libgearman-devel -y \
    && echo PermitRootLogin  yes >> /etc/ssh/sshd_config \
    && echo PasswordAuthentication yes >> /etc/ssh/sshd_config \
    && echo RSAAuthentication yes >> etc/ssh/sshd_config \
    && sed -i "s/UseDNS yes/UseDNS no/" /etc/ssh/sshd_config \
    && echo "root:$ROOT_PASSWORD" | chpasswd \
    && ssh-keygen -t dsa -f /etc/ssh/ssh_host_rsa_key \
    && ssh-keygen -t rsa -f /etc/ssh/ssh_host_ecdsa_key \
    && ssh-keygen -t rsa -f /etc/ssh/ssh_host_ed25519_key \
    && yum clean all && rm -rf /var/cache/yum/*


#安装php
RUN cd /usr/src \
    && curl -o php.tar.gz http://php.net/get/php-${PHP_VER}.tar.gz/from/this/mirror -L \
    && mkdir php \
    && tar -xzvf php.tar.gz -C ./php --strip-components 1 \
    && cd php \
    && ./configure --prefix=/usr/local/php --with-config-file-path=/etc/php --enable-soap --enable-mbstring=all \
        --enable-sockets --enable-fpm --with-gd --with-freetype-dir=/usr/include/freetype2/freetype \
        --with-jpeg-dir=/usr/lib64 --with-zlib --with-iconv --enable-libxml --enable-xml  --enable-intl \
        --enable-zip --enable-pcntl --enable-bcmath --enable-maintainer-zts --with-curl --with-openssl \
        --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd \
    && make \
    && make install \
    && mkdir /etc/php \
    && cp /usr/src/php/php.ini-development /etc/php/php.ini \
    && echo $MYSQL_SOCK_DIR > /tmp/temp_mysql_sock_dir.txt && temp_mysql_sock_dir=$(sed "s/\//\\\\\//g" /tmp/temp_mysql_sock_dir.txt) && rm -rf /tmp/temp_mysql_sock_dir.txt \
    && sed -i "s/mysqli.default_socket =/mysqli.default_socket = ${temp_mysql_sock_dir}\/mysql.sock/" /etc/php/php.ini \
    && sed -i "s/pdo_mysql.default_socket=/pdo_mysql.default_socket = ${temp_mysql_sock_dir}\/mysql.sock/" /etc/php/php.ini \
    && cp /usr/src/php/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm \
    && chmod +x /etc/init.d/php-fpm \
    && cd /usr/local/php/etc \
    && cp php-fpm.conf.default php-fpm.conf \
    && sed -i "s/;daemonize = yes/daemonize = no/" php-fpm.conf \
    && cp ./php-fpm.d/www.conf.default ./php-fpm.d/www.conf \
    && sed -i "s/export PATH/PATH=\/usr\/local\/php\/bin:\$PATH\nexport PATH/" /etc/profile \
    && sed -i "s/export PATH/PATH=\/etc\/init.d:\$PATH\nexport PATH/" /etc/profile \
    && rm -rf /usr/src/php.tar.gz && rm -rf /usr/src/php \
    #php redis扩展
    && /usr/local/php/bin/pecl install redis && echo "extension=redis.so" >> /etc/php/php.ini \
    #php grpc扩展
    && /usr/local/php/bin/pecl install grpc && echo "extension=grpc.so" >> /etc/php/php.ini \
    #php protobuf扩展
    && /usr/local/php/bin/pecl install protobuf && echo "extension=protobuf.so" >> /etc/php/php.ini \
    #php swoole扩展
    && cd /usr/src && curl -o hiredis.tar.gz https://github.com/redis/hiredis/archive/v${HIREDIS_VER}.tar.gz -L && mkdir hiredis && tar -xzvf hiredis.tar.gz -C ./hiredis --strip-components 1 \
    && cd hiredis && make && make install && mkdir /usr/lib/hiredis && cp libhiredis.so /usr/lib/hiredis && mkdir /usr/include/hiredis && cp hiredis.h /usr/include/hiredis \
    && echo '/usr/local/lib' >> /etc/ld.so.conf && ldconfig \
    && /usr/local/php/bin/pecl download swoole-${SWOOLE_VER} && tar -zxvf swoole-${SWOOLE_VER}.tgz && cd swoole-${SWOOLE_VER} \
    && /usr/local/php/bin/phpize && ./configure --with-php-config=/usr/local/php/bin/php-config --enable-openssl --enable-async-redis && make && make install \
    && echo "extension=swoole.so" >> /etc/php/php.ini && rm -rf /usr/src/hiredis.tar.gz && rm -rf /usr/src/hiredis && rm -rf swoole-${SWOOLE_VER}.tgz && rm -rf swoole-${SWOOLE_VER} \
    #php xhprof扩展
    && cd /usr/src \
    && curl -o xhprof.tar.gz https://github.com/longxinH/xhprof/archive/v${XHPROF_VER}.tar.gz -L \
    && tar -xvf xhprof.tar.gz \
    && cd xhprof-${XHPROF_VER}/extension \
    && /usr/local/php/bin/phpize \
    && ./configure --with-php-config=/usr/local/php/bin/php-config --enable-xhprof && make && make install \
    && mkdir -p -m 777 /tmp/xhprof \
    && echo -e "[xhprof]\nextension = xhprof.so\nxhprof.output_dir = /tmp/xhprof" >> /etc/php/php.ini \
    && mkdir /var/tools \
    && cd /usr/src/xhprof-${XHPROF_VER} \
    && mv xhprof_html /var/tools/ \
    && mv xhprof_lib /usr/local/php/lib/php \
    && sed -i "s/dirname(__FILE__) . '\/..\/xhprof_lib'/'xhprof_lib'/" /var/tools/xhprof_html/index.php \
    && sed -i "s/dirname(__FILE__) . '\/..\/xhprof_lib'/'xhprof_lib'/" /var/tools/xhprof_html/callgraph.php \
    && sed -i "s/dirname(__FILE__) . '\/..\/xhprof_lib'/'xhprof_lib'/" /var/tools/xhprof_html/typeahead.php \
    && rm -rf /usr/src/xhprof-${XHPROF_VER} && rm -rf /usr/src/xhprof.tar.gz \
    #php gearman扩展
    && cd /usr/src \
    && wget https://github.com/wcgallego/pecl-gearman/archive/gearman-2.0.3.tar.gz && tar -zxvf gearman-2.0.3.tar.gz\
    && cd pecl-gearman-gearman-2.0.3 \
    && /usr/local/php/bin/phpize \
    && ./configure --with-php-config=/usr/local/php/bin/php-config \
    && make && make install \
    && echo "extension=gearman.so" >> /etc/php/php.ini && rm -rf /usr/src/pecl-gearman-gearman-2.0.3 && rm /usr/src/gearman-2.0.3.tar.gz

    #php xdebug
RUN /usr/local/php/bin/pecl install xdebug \
    && echo -e "[xdebug]\nzend_extension=/usr/local/php/lib/php/extensions/no-debug-zts-20170718/xdebug.so\nxdebug.enable=1\nxdebug.remote_enable=1\nxdebug.remote_connect_back=0\nxdebug.remote_host=192.168.31.135\nxdebug.remote_port=9000\nxdebug.profiler_enable=1\nxdebug.remote_log=/var/log/xdebug_remote.log\nxdebug.remote_autostart = 1" 
#RUN cd /usr/src \
#    && curl  'https://xdebug.org/files/xdebug-2.6.0.tgz' -o xdebug.tar.gz \
#    && mkdir xdebug \
#    && tar -xvzf xdebug.tar.gz -C xdebug --strip-components=1 \
#    && cd xdebug \
#    && /usr/local/php/bin/phpize \
#    && ./configure --with-php-config=/usr/local/php/bin/php-config --enable-xdebug \
#    && make \
#    && make install \
#    && rm -rf /usr/src/xdebug.tar.gz && rm -rf /usr/src/xdebug

#安装nginx
RUN cd /usr/src \
    && curl -o nginx.tar.gz http://nginx.org/download/nginx-${NGINX_VER}.tar.gz -L \
    && mkdir nginx && tar -xzvf nginx.tar.gz -C ./nginx --strip-components 1 \
    && cd nginx \
    && ./configure \
     --prefix=/usr/local/nginx \
     #--prefix=/data/www \
    --conf-path=/etc/nginx/nginx.conf \
    --error-log-path=/var/log/nginx/error.log \
        --http-log-path=/var/log/nginx/access.log \
    --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock \
        --user=nginx --group=nginx --with-http_ssl_module --with-http_flv_module --with-http_stub_status_module \
        --with-http_gzip_static_module --http-client-body-temp-path=/tmp/nginx/client/ \
        --http-proxy-temp-path=/tmp/nginx/proxy/ \
        --http-fastcgi-temp-path=/tmp/nginx/fcgi/ \
        --with-pcre --with-http_dav_module \
    && make && make install \
    && useradd nginx \
    && mkdir -p -m 777 /tmp/nginx \
    && echo "#!/bin/sh" > /etc/init.d/nginx \
    && echo "#description: Nginx web server." >> /etc/init.d/nginx \
    && echo -e "case \$1 in \n\
            restart): \n\
                /usr/local/nginx/sbin/nginx -s reload \n\
                ;; \n\
            stop): \n\
                /usr/local/nginx/sbin/nginx -s stop \n\
                ;; \n\
            *): \n\
                /usr/local/nginx/sbin/nginx \n\
                ;; \n\
        esac \n" >> /etc/init.d/nginx \
    && chmod +x /etc/init.d/nginx \
    #&& sed -i "3a daemon off;" /etc/nginx/nginx.conf \
    #&& sed -i "s/index  index.html index.htm;/index  index.php index.html index.htm;/" /etc/nginx/nginx.conf \
    #&& sed -i "s/# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000/location ~ \.php\$ { \nfastcgi_pass 127.0.0.1:9000;\nfastcgi_index  index.php;\nfastcgi_param  SCRIPT_FILENAME  \$document_root\$fastcgi_script_name;\ninclude fastcgi_params;\n }/" /etc/nginx/nginx.conf \
    && echo "<?php phpinfo()?>" > /usr/local/nginx/html/index.php \
    && rm -rf /etc/nginx && cp -rf /usr/src/etc/nginx /etc/nginx \
    && mkdir -m 777 -p /var/log/nginx \
    && rm -rf /usr/src/nginx.tar.gz && rm -rf /usr/src/nginx


#安装必要的服务
#RUN cd /usr/src \
#    && /usr/local/php/bin/php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
#    && /usr/local/php/bin/php composer-setup.php  --install-dir=/usr/local/bin --filename=composer \
#    && rm -rf composer-setup.php \
#    && /usr/local/php/bin/php /usr/local/bin/composer config -g repo.packagist composer https://packagist.phpcomposer.com \
#    && /usr/local/php/bin/php /usr/local/bin/composer create-project -s dev erik-dubbelboer/php-redis-admin /var/tools/phpredisadmin -vvv \
#    && cd /var/tools/phpredisadmin && cp includes/config.sample.inc.php includes/config.inc.php \
#    && sed -i "s/=> 'local server'/=> 'feehi server'/" includes/config.inc.php \
#    && sed -i "s/\/\/'auth' => 'redispasswordhere'/'auth' => '${REDIS_PASS}'/" includes/config.inc.php \
#    && sed -i "s/'scansize' => 1000/'scansize' => 1000,\n'login' => array('admin' => array('password' => '${REDIS_PASS}')),/" includes/config.inc.php \
#    && rm -rf /root/.composer/cache/ \
#    && cd /usr/src \
#    && curl -o phpmyadmin.tar.gz https://files.phpmyadmin.net/phpMyAdmin/${PHPMYADMIN_VER}/phpMyAdmin-${PHPMYADMIN_VER}-all-languages.tar.gz \
#    && mkdir -p /var/tools/phpmyadmin \
#    && tar -xzvf phpmyadmin.tar.gz -C /var/tools/phpmyadmin --strip-components 1 \
#    && rm -rf /usr/src/phpmyadmin.tar.gz


#服务器基础设置
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo 'Asia/Shanghai' > /etc/timezonesource \
    && source /etc/profile \
    &&echo [supervisord] > /etc/supervisord.conf \
    && echo nodaemon=true >> /etc/supervisord.conf \
    && echo user=root >> /etc/supervisord.conf \
    \
    && echo [program:sshd] >> /etc/supervisord.conf \
    && echo command=/usr/sbin/sshd -D >> /etc/supervisord.conf \
    \
    && echo [program:nginx] >> /etc/supervisord.conf \
    && echo command=/usr/local/nginx/sbin/nginx >> /etc/supervisord.conf \
    \
    && echo [program:php-fpm] >> /etc/supervisord.conf \
    && echo command=/usr/local/php/sbin/php-fpm >> /etc/supervisord.conf \
    \
    && echo [program:crond] >> /etc/supervisord.conf \
    && echo command=/usr/sbin/crond -n >> /etc/supervisord.conf


EXPOSE 80
#EXPOSE 9001
#EXPOSE 9000
CMD ["/usr/bin/supervisord"]

Nginx profile content

#user  nobody;
 worker_processes  1;
 #daemon off;
 #error_log  logs/error.log;
 #error_log  logs/error.log  notice;
 #error_log  logs/error.log  info;
 
 #pid        logs/nginx.pid;
 
 
 events {
 worker_connections  1024;
 }
 
 http {
 include       mime.types;
 default_type  application/octet-stream;
 client_max_body_size 100m;
 #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
 #                  '$status $body_bytes_sent "$http_referer" '
 #                  '"$http_user_agent" "$http_x_forwarded_for"';
 
 #access_log  logs/access.log  main;
 
 sendfile        on;
 #tcp_nopush     on;
 
 #keepalive_timeout  0;
 keepalive_timeout  65;
 
 #gzip  on;
 
 server {
 listen       80;
 server_name  localhost;
 
 #charset koi8-r;
 
 #access_log  logs/host.access.log  main;
 
 root   html;
 index   index.html  index.htm  index.php ;
 
 location /phpmyadmin {
 alias /var/tools/phpmyadmin;
 index  index.php ;
 }
 
 location ~ /phpmyadmin.+\.php.*$ {
 if ($fastcgi_script_name ~ /phpmyadmin/(.+\.php.*)$) {
 set $valid_fastcgi_script_name $1;
 }
 fastcgi_pass  127.0.0.1:9000;
 fastcgi_index   index.php ;
 fastcgi_param  SCRIPT_FILENAME  /var/tools/phpmyadmin/$valid_fastcgi_script_name;
 include  fastcgi_params;
 }
 
 location /phpredisadmin {
 alias /var/tools/phpredisadmin;
 index  index.php ;
 }
 
 location ~ /phpredisadmin.+\.php.*$ {
 if ($fastcgi_script_name ~ /phpredisadmin/(.+\.php.*)$) {
 set $valid_fastcgi_script_name $1;
 }
 fastcgi_pass  127.0.0.1:9000;
 fastcgi_index   index.php ;
 fastcgi_param  SCRIPT_FILENAME  /var/tools/phpredisadmin/$valid_fastcgi_script_name;
 include  fastcgi_params;
 }
 
 location /xhprof_html {
 alias /var/tools/xhprof_html;
 index  index.php ;
 }
 
 location ~ /xhprof_html.+\.php.*$ {
 if ($fastcgi_script_name ~ /xhprof_html/(.+\.php.*)$) {
 set $valid_fastcgi_script_name $1;
 }
 fastcgi_pass  127.0.0.1:9000;
 fastcgi_index   index.php ;
 fastcgi_param  SCRIPT_FILENAME  /var/tools/xhprof_html/$valid_fastcgi_script_name;
 include  fastcgi_params;
 }
 
 #error_page  404              /404.html;
 
 # redirect server error pages to the static page /50x.html
 #
 error_page   500 502 503 504  /50x.html;
 location = /50x.html {
 root   html;
 }
 
 # proxy the PHP scripts to Apache listening on 127.0.0.1:80
 #
 #location ~ \.php$ {
 #    proxy_pass   http://127.0.0.1;
 #}
 
 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
 #
 location ~ \.php$ {
 fastcgi_pass   127.0.0.1:9000;
 fastcgi_index   index.php ;
 fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
 include        fastcgi_params;
 }
 
 # deny access to .htaccess files, if Apache's document root
 # concurs with nginx's one
 #
 #location ~ /\.ht {
 #    deny  all;
 #}
 }
 
 
 # another virtual host using mix of IP-, name-, and port-based configuration
 #
 #server {
 #    listen       8000;
 #    listen       somename:8080;
 #    server_name  somename  alias  another.alias;
 
 #    location / {
 #        root   html;
 #        index   index.html  index.htm ;
 #    }
 #}
 
 
 # HTTPS server
 #
 #server {
 #    listen       443 ssl;
 #    server_name  localhost;
 
 #    ssl_certificate      cert.pem;
 #    ssl_certificate_key  cert.key;
 
 #    ssl_session_cache    shared:SSL:1m;
 #    ssl_session_timeout  5m;
 
 #    ssl_ciphers  HIGH:!  aNULL:!  MD5;
 #    ssl_prefer_server_ciphers  on;
 
 #    location / {
 #        root   html;
 #        index   index.html  index.htm ;
 #    }
 #}
 include conf.d/*.conf;
 }

The complete dockerifle files and configuration files are available in github.
https://github.com/zhengxidon …

After the container is started, check the nginx log and find that nginx keeps restarting, then the above error log appears. Nginx profile daemon off; After the comment is removed, restart the container again and the above error will not occur. Why is this?

Supervisor monitors the problem that nginx has been restarting. After starting the container, the log always outputs the following error

2019/03/09 17:33:58 [emerg] 81#0: still could not bind()
 2019/03/09 17:34:01 [emerg] 82#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
 2019/03/09 17:34:01 [emerg] 82#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
 2019/03/09 17:34:01 [emerg] 82#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
 2019/03/09 17:34:01 [emerg] 82#0: bind() to 0.0.0.0:80 failed (98: Address already in use)
 2019/03/09 17:34:01 [emerg] 82#0: bind() to 0.0.0.0:80 failed (98: Address already in use)

Supervisor monitors nginx. After writing the configuration file, he found that he has been restarting. After checking, he found that the command is wrong:

Command = /usr/local/bin/nginx this command is started in the background by default, butsupervisorThe daemon cannot be monitored, so the supervisor always executes this command.

Command plus-g 'daemon off;'This parameter can solve this problem. This parameter means to run at the front desk.

command = /usr/local/bin/nginx  -g 'daemon off;'

Or add it directly to the top of the nginx.conf configuration file

daemon off;