クリエイター:メタボ兔

ウェブやアプリの開発者で利用する色な技術やサーバーや開発環境の設定について共有する場

7.ウェブサーバー:Dockerfile作成

じゃ、いよいよウェブサーバーのDockerファイルを作成してみましょう!!

f:id:FattyRabbit:20201229190022p:plain

docker-composer.yml

先ずは使用する環境変数ファイル「.env」を作成します。

SERVER_NAME=local

こちらで使用するメインドメインを設定します。

次はdocker-compose.ymlに使用する内容です。

version: "3"
services:
  web:
    image: web
    build:
      context: ./web
      dockerfile: Dockerfile
      args:
        SERVER_NAME: $SERVER_NAME
    container_name: web
    command: /sbin/init
    volumes:
      - ./web/www:/var/www:rw
    tty: true
    stdin_open: true
    privileged: true
    restart: always
    external_links:
      - dba
    logging:
      options:
        max-size: 5m
        max-file: "5"
    networks:
      local-server-net:
        ipv4_address: 172.16.0.5
  • build.context: ./web:docker-composeのフォルダ構成です。
  • build.dockerfile: Dockerfile:dockerfile名です。
  • build.args.SERVER_NAME: $SERVER_NAME:Dockerfileに渡すパラメーターで.envのSERVER_NAME(local)を渡します。
  • volumes:docker-compose内のフォルダにコンテイナーのapacheのdocument-rootへマウントします。webフォルダにはプロジェクトことにフォルダを作成するかシンボルリングを作成するつもりです。

Dockerfile

次はDockerfileです。内容が多く一々説明をするのでは面倒でも時間がないことでファイルのみ共有させていただきます。以前使用したDockerfileなので実際作成する際に修正が加えるかもです。

FROM centos:7
MAINTAINER fatty.rabbit.dev@gmail.com

# Declare Arguments
ARG SERVER_NAME=example.com:80

# Set the environment of anyenv
ENV ANYENV_HOME /opt/anyenv
ENV ANYENV_ENV  $ANYENV_HOME/envs
ENV ANYENV_DEFINITION_ROOT $ANYENV_HOME/share/anyenv-install/
# Set the environment of phpenv
ENV PHPENV_ROOT $ANYENV_ENV/phpenv

# TimeZoneの設定
RUN rm -rf /etc/localtime && ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN echo "LC_ALL=ja_JP.UTF-8" >> /etc/environment && \
    echo "LC_CTYPE=ja_JP.UTF-8" >> /etc/environment && \
    echo "LANG=ja_JP.UTF-8" >> /etc/environment
RUN localedef -f UTF-8 -i ja_JP /usr/lib/locale/ja_JP.UTF-8
RUN localedef -f UTF-8 -i ja_JP ja_JP

# yumアップデート
RUN yum -y update

# apacheのインストール:v2.4.6
RUN yum install -y httpd

# apacheの設定
RUN rm -rf /etc/httpd/conf.d/welcome.conf
RUN cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak
RUN sed -ri '/<Directory "\/var\/www\/html">/,/<\/Directory>/s/    AllowOverride None/    AllowOverride All/' /etc/httpd/conf/httpd.conf && \
    sed -ri '/<Directory "\/var\/www\/html">/,/<\/Directory>/s/    Options Indexes FollowSymLinks/    Options Indexes FollowSymLinks Includes/' /etc/httpd/conf/httpd.conf && \
    sed -ri 's/DirectoryIndex index.html/DirectoryIndex index.html index.php/' /etc/httpd/conf/httpd.conf && \
    sed -i -e "s/\#ServerName www.example.com:80/ServerName ${SERVER_NAME}/g" /etc/httpd/conf/httpd.conf

# remiリポジトリの登録
RUN yum install -y epel-release
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

# SSHDのインストール
RUN yum -y install openssh-server

# SSHDの設定
RUN sed -ri 's/^#PermitRootLogin yes/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    sed -ri 's/^#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config && \
    sed -ri 's/^UsePAM yes/UsePAM no/' /etc/ssh/sshd_config

# rootユーザーのパスワード変更
RUN echo 'root:12345678' | chpasswd

# sudoのインストール
RUN yum -y install sudo

# PHPの依存するパッケージをインストール
RUN yum install -y gcc gcc-c++ wget make file php-fpm unzip git rsync automake libcurl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker

# system wide
# anyenvを入れる
RUN git clone https://github.com/riywo/anyenv $ANYENV_HOME
RUN git clone https://github.com/anyenv/anyenv-install $ANYENV_DEFINITION_ROOT
RUN echo 'export PATH="'$ANYENV_HOME'/bin:$PATH"' >> /etc/profile.d/anyenv.sh && \
    echo 'export ANYENV_ROOT="'$ANYENV_HOME'"'  >> /etc/profile.d/anyenv.sh && \
    echo 'export ANYENV_DEFINITION_ROOT="'$ANYENV_HOME'/share/anyenv-install"' >> /etc/profile.d/anyenv.sh && \
    chmod 755 /etc/profile.d/anyenv.sh

ENV PATH $ANYENV_HOME/bin:$PATH
ENV ANYENV_ROOT $ANYENV_HOME
ENV ANYENV_DEFINITION_ROOT $ANYENV_HOME/share/anyenv-install

# phpenvを入れる
RUN anyenv install phpenv

# phpのビルド環境を整える
RUN yum install -y libxml2-devel bison bison-devel libjpeg-devel libpng-devel readline-devel libmcrypt libmcrypt-devel libxslt-devel httpd-devel enchant-devel libXpm libXpm-devel freetype-devel t1lib t1lib-devel gmp-devel libicu-devel net-snmp net-snmp-devel bzip2 bzip2-devel
RUN sed -i -e '/--with-mcrypt/d' $ANYENV_HOME/envs/phpenv/plugins/php-build/share/php-build/default_configure_options
RUN sed -i -e '/--with-tidy/d' $ANYENV_HOME/envs/phpenv/plugins/php-build/share/php-build/default_configure_options
RUN yum --enablerepo=epel install -y libtidy-devel re2c

# cmakeのインストール
RUN wget https://cmake.org/files/v3.12/cmake-3.12.0-Linux-x86_64.tar.gz -O cmake-3.12.0-Linux-x86_64.tar.gz && \
    tar zxvf cmake-3.12.0-Linux-x86_64.tar.gz

RUN rm -rf /usr/share/aclocal && \
    rm -rf /usr/share/applications && \
    rm -rf /usr/share/mime

RUN mkdir -p /usr/bin && \
    cp -r cmake-3.12.0-Linux-x86_64/bin/* /usr/bin/ && \
    mkdir -p /usr/share && \
    cp -r cmake-3.12.0-Linux-x86_64/share/* /usr/share/ && \
    rm -rf cmake-3.12.0-Linux-x86_64

# libzipのインストール
RUN yum remove -y libzip libzip-devel
RUN mkdir /tmp/libzip && \
    cd /tmp/libzip && \
    curl -sSLO https://libzip.org/download/libzip-1.4.0.tar.gz && \
    tar zxf libzip-1.4.0.tar.gz && \
    cd libzip-1.4.0/ && \
    mkdir build && \
    cd build && \
    cmake ../ && \
    make && \
    make install

# ERROR:configure: error: off_t undefined; check your library configuration
# 以下を削除:Mysqlを利用してない場合
# 参考:http://www.8wave.net/ldconfig.html
# vi /etc/ld.so.conf
RUN echo '/usr/local/lib' >> /etc/ld.so.conf
RUN echo '/usr/lib ' >> /etc/ld.so.conf
RUN ldconfig

# php7.3をインストル
ENV PATH $ANYENV_ENV/phpenv/bin:$ANYENV_ENV/phpenv/shims:$PATH
RUN ls -al $ANYENV_ENV/phpenv
RUN PHP_BUILD_CONFIGURE_OPTS=--with-pear PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install -v 7.3.0
# php7.1.20をインストル
RUN PHP_BUILD_CONFIGURE_OPTS=--with-pear PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install -v 7.1.20
# php7.3.3をインストル
RUN PHP_BUILD_CONFIGURE_OPTS=--with-pear PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4 phpenv install -v 7.3.3

# linkを作成
RUN ln -s /opt/anyenv/envs/phpenv/shims/php /bin/php
RUN ln -s /opt/anyenv/envs/phpenv/shims/pecl /bin/pecl

# imageMagickをインストール
RUN yum install -y ImageMagick-devel ImageMagick

# php環境を設定
# 7.1.20
RUN phpenv global 7.1.20 && \
    phpenv rehash && \
    yes '' | pecl install imagick
RUN echo "extension = imagick.so" >> $PHPENV_ROOT/versions/7.1.20/etc/php.ini && \
    echo 'xdebug.remote_enable = 1' >> $PHPENV_ROOT/versions/7.1.20/etc/conf.d/xdebug.ini && \
    echo 'xdebug.remote_connect_back = 1' >> $PHPENV_ROOT/versions/7.1.20/etc/conf.d/xdebug.ini && \
    echo 'xdebug.remote_port = 9001' >> $PHPENV_ROOT/versions/7.1.20/etc/conf.d/xdebug.ini && \
    echo 'xdebug.max_nesting_level = 512' >> $PHPENV_ROOT/versions/7.1.20/etc/conf.d/xdebug.ini && \
    echo 'xdebug.idekey = "PHPSTORM"' >> $PHPENV_ROOT/versions/7.1.20/etc/conf.d/xdebug.ini
# 7.3.0
RUN phpenv global 7.3.0 && \
    phpenv rehash && \
    yes '' | pecl install imagick
RUN echo "extension = imagick.so" >> $PHPENV_ROOT/versions/7.3.0/etc/php.ini && \
    echo 'xdebug.remote_enable = 1' >> $PHPENV_ROOT/versions/7.3.0/etc/conf.d/xdebug.ini && \
    echo 'xdebug.remote_connect_back = 1' >> $PHPENV_ROOT/versions/7.3.0/etc/conf.d/xdebug.ini && \
    echo 'xdebug.remote_port = 9001' >> $PHPENV_ROOT/versions/7.3.0/etc/conf.d/xdebug.ini && \
    echo 'xdebug.max_nesting_level = 512' >> $PHPENV_ROOT/versions/7.3.0/etc/conf.d/xdebug.ini && \
    echo 'xdebug.idekey = "PHPSTORM"' >> $PHPENV_ROOT/versions/7.3.0/etc/conf.d/xdebug.ini
# 7.3.3
RUN phpenv global 7.3.3 && \
    phpenv rehash && \
    yes '' | pecl install imagick
RUN echo "extension = imagick.so" >> $PHPENV_ROOT/versions/7.3.3/etc/php.ini && \
    echo 'xdebug.remote_enable = 1' >> $PHPENV_ROOT/versions/7.3.3/etc/conf.d/xdebug.ini && \
    echo 'xdebug.remote_connect_back = 1' >> $PHPENV_ROOT/versions/7.3.3/etc/conf.d/xdebug.ini && \
    echo 'xdebug.remote_port = 9001' >> $PHPENV_ROOT/versions/7.3.3/etc/conf.d/xdebug.ini && \
    echo 'xdebug.max_nesting_level = 512' >> $PHPENV_ROOT/versions/7.3.3/etc/conf.d/xdebug.ini && \
    echo 'xdebug.idekey = "PHPSTORM"' >> $PHPENV_ROOT/versions/7.3.3/etc/conf.d/xdebug.ini

# composerのインストール
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer

# supervisordのインストール
RUN yum install -y supervisor

# php-fpmサービスを追加
COPY php-fpm*.service /etc/systemd/system/
RUN grep -l '$PHPENV_ROOT' /etc/systemd/system/php-fpm*.service | xargs sed -i -e "s/\$PHPENV_ROOT/$(echo $PHPENV_ROOT | sed -e 's/\//\\\//g')/g"
RUN cat /etc/systemd/system/php-fpm7.3.3.service

# サンプルのVirtualhostの設定ファイルを追加
RUN mkdir /var/www/sample-7.1.20
RUN mkdir /var/www/sample-7.3.0
COPY *_virtual.conf /etc/httpd/conf.d/
RUN grep -l '$SERVER_NAME' /etc/httpd/conf.d/*_virtual.conf | xargs sed -i -e "s/\$SERVER_NAME/$(echo $SERVER_NAME | sed -e 's/\//\\\//g; s/\:/\\\:/g; s/\./\\\./g;')/g"
RUN cat /etc/httpd/conf.d/7.3.0_virtual.conf

# postfixをインストール
RUN yum install -y postfix mailx
RUN systemctl enable postfix

# syslogの追加
RUN yum install -y rsyslog
RUN systemctl enable rsyslog

# supervisordの設定
RUN touch /etc/supervisord.conf
RUN sed -i -e 's/nodaemon=false/nodaemon=true/g' /etc/supervisord.conf
COPY supervisord-fpm*-service.ini /etc/supervisord.d/
RUN touch /etc/supervisord.d/supervisord-ssh.ini && \
    echo '[program:sshd]' >> /etc/supervisord.d/supervisord-ssh.ini && \
    echo 'command=systemctl start sshd' >> /etc/supervisord.d/supervisord-ssh.ini
RUN touch /etc/supervisord.d/supervisord-httpd.ini && \
    echo '[program:apache]' >> /etc/supervisord.d/supervisord-httpd.ini && \
    echo 'command=systemctl start httpd' >> /etc/supervisord.d/supervisord-httpd.ini
RUN touch /etc/supervisord.d/supervisord-postfix.ini && \
    echo '[program:postfix]' >> /etc/supervisord.d/supervisord-postfix.ini && \
    echo 'command=systemctl start postfix' >> /etc/supervisord.d/supervisord-postfix.ini

# php-fpmの設定
RUN sed -i -e 's/^user = nobody/user = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^group = nobody/group = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm7.1.20.sock/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^;listen.owner = nobody/listen.owner = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^;listen.group = nobody/listen.group = apache/g' $PHPENV_ROOT/versions/7.1.20/etc/php-fpm.d/www.conf
RUN sed -i -e 's/^user = nobody/user = apache/g' $PHPENV_ROOT/versions/7.3.0/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^group = nobody/group = apache/g' $PHPENV_ROOT/versions/7.3.0/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm7.3.0.sock/g' $PHPENV_ROOT/versions/7.3.0/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^;listen.owner = nobody/listen.owner = apache/g' $PHPENV_ROOT/versions/7.3.0/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^;listen.group = nobody/listen.group = apache/g' $PHPENV_ROOT/versions/7.3.0/etc/php-fpm.d/www.conf
RUN sed -i -e 's/^user = nobody/user = apache/g' $PHPENV_ROOT/versions/7.3.3/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^group = nobody/group = apache/g' $PHPENV_ROOT/versions/7.3.3/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^listen = 127.0.0.1:9000/listen = \/var\/run\/php-fpm7.3.3.sock/g' $PHPENV_ROOT/versions/7.3.3/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^;listen.owner = nobody/listen.owner = apache/g' $PHPENV_ROOT/versions/7.3.3/etc/php-fpm.d/www.conf && \
    sed -i -e 's/^;listen.group = nobody/listen.group = apache/g' $PHPENV_ROOT/versions/7.3.3/etc/php-fpm.d/www.conf

EXPOSE 80 443

CMD ["/usr/bin/supervisord", "-c", "/etc/supervisord.conf"]

大きく以下のデモン・ツールをインストールします。

使用ポートは80と443のみです。また、serviceファイルやsupervisordのファイルは一部COPYですが、実際の時はcomposeでシンボルリングにする可能性もあります。