DockerでApacheを動かす

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と入れてるんですね。