Dockerの上でApache2を動かすときにはDockerfileを以下のようにする。
FROM ubuntu:12.04 RUN apt-get update RUN apt-get install -y apache2 ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_LOG_DIR /var/log/apache2 EXPOSE 80 CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
そしてビルドする。
mkdir apache2 cd apache2 vi Dockerfile # 上のDockerfileを作成 docker build -t="apache2" .
これでapache2というREPOSITORYが出来上がるのでこれを指定して起動することが出来る。
docker run -d apache2
/usr/sbin/apache2の-D FOREGROUND引数について
Apache2.2のドキュメントを見ると、
-D parameter
Sets a configuration parameter which can be used with
sections in the configuration files to conditionally skip or process commands at server startup and restart. Also can be used to set certain less-common startup parameters including -DNO_DETACH (prevent the parent from forking) and -DFOREGROUND (prevent the parent from calling setsid() et al).
つまりFOREGROUNDオプションを指定したときにはsetsid()を行わないというようにかいてある。そもそもこのsetsid()はC言語システムコール-setsidに書いてあるようにプロセスをデーモン化する際に使用するシステムコール。下記のコードはC言語システムコール-setsidより引用させてもらった。
#include <stdio.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <unistd.h> int main(void) { pid_t pid = 0; int rc = 0; printf("sid = %d\n", getsid(0)); pid = fork(); if(pid < 0){ printf("Error: fork(%d) %s\n", errno, strerror(errno)); return(-1); } if(pid > 0){ /* 親プロセスを終了する */ _exit(0); } rc = setsid(); if(pid < 0){ printf("Error: setsid(%d) %s\n", errno, strerror(errno)); return(-1); } printf("sid = %d\n", getsid(0)); return(0); }
setsid()を抑制するということはデーモン化しないということなのでFOREGROUNDで実行するってこと。だからDockerfileのCMDに-D FOREGROUNDと入れてるんですね。