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, but
supervisor
The 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;