docker

dockerを使ってみよう

More than 1 year has passed since last update.

はじめに

docker初心者として調べた結果を途中書きの形で書き残します。

docker-machineでマシン名testを作っている前提

  • centos6.9ベース
  • phpはphpbrewで7.1.8を入れる
  • apache2+phpの構成になるようにする
  • 80ポートで公開するようにする
  • コンテナ内の/var/www/html/をローカル環境からマウントする

TODO

  • mariadbかpostgresを別コンテナにしたい
  • docker-composeで一斉に作りたい

前準備

ローカルのディレクトリツリー

/Users/positrium/src/centos69
  ├── Dockerfile
  ├── php.conf
  └── public
      └── index.php

index.php

<?php
phpinfo();

Dockerfile

FROM centos:6.9

WORKDIR /root
RUN rpm -Uvh https://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
RUN yum update -y
RUN yum install -y --enablerepo=remi,epel php php-xml re2c libmhash httpd httpd-devel
RUN yum install -y --enablerepo=remi,epel gcc gcc-c++ libxml2-devel openssl-devel bzip2-devel
RUN yum install -y --enablerepo=remi,epel libxslt-devel libicu libicu-devel readline-devel
RUN yum install -y --enablerepo=remi,epel libmcrypt libmcrypt-devel
RUN curl -s -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew
RUN chmod +x phpbrew
RUN mv phpbrew /usr/bin/phpbrew
RUN phpbrew init
RUN echo 'source ~/.phpbrew/bashrc' >> ~/.bashrc
#RUN source ~/.phpbrew/bashrc
RUN phpbrew known
RUN phpbrew install php-7.1.8 +default+mysql+pdo +apxs2 +openssl=/usr -- --with-libdir=lib64
RUN phpbrew switch 7.1.8
ADD php.conf ./php.conf
RUN cp php.conf /etc/httpd/conf.d/
RUN sed -i -e 's/LoadModule php7_module/#LoadModule php7_module/g' /etc/httpd/conf/httpd.conf
RUN sed -i -e 's/#ServerName/ServerName/g' /etc/httpd/conf/httpd.conf
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

RUN chmod -R 777 /etc/httpd/confを入れないことで、phpbrewからのhttpd.conf自動書き換えを防ぐ。phpbrewはhttpd.confに対して、LoadModuleしか追記しないので、phpが実行出来るようにはなってない。 後で調べたら、/etc/httpd/confが700でもhttpd.confの書き換えは行われていた。なので、sedして対応を行うことになった。

例えば、拡張子phpに対してphpを実行するなどの記述が欠けていて、それらは下記のようなconf.d/php.confにのみ書かれていた。

Dockerfile 命令説明

http://docs.docker.jp/engine/reference/builder.html

  • FROM
    • FROM 命令は、以降の命令で使う ベース・イメージ を指定します。あるいは、有効な Dockerfile は、1行めを FROM 命令で指定する必要があります。イメージとは、あらゆる有効なものが利用できます。 パブリック・リポジトリ から イメージを取得する 方法が一番簡単です。
  • WORKDIR
    • WORKDIR 命令セットは Dockerfile で RUN 、 CMD 、 ENTRYPOINT 、 COPY 、 ADD 命令実行時の作業ディレクトリ(working directory)を指定します。もし WORKDIR が存在しなければ、 Dockerfile 命令内で使用しなくてもディレクトリを作成します
  • RUN
    • RUN 命令は既存イメージ上の新しいレイヤで、あらゆるコマンドを実行し、その結果をコミットする命令です。コミットの結果得られたイメージは、 Dockerfile の次のステップで使われます。
  • ADD
    • ADD 命令は <ソース> にある新しいファイルやディレクトリをコピー、あるいはリモートの URL からコピーします。それから、コンテナ内のファイルシステム上にある 送信先 に指定されたパスに追加します。
  • EXPOSE
    • EXPOSE 命令は、特定のネットワーク・ポートをコンテナが実行時にリッスンすることを Docker に伝えます。 EXPOSE があっても、これだけではホストからコンテナにアクセスできるようにしません。アクセスするには、 -p フラグを使ってポートの公開範囲を指定するか、 -P フラグで全ての露出ポートを公開する必要があります。外部への公開時は他のポート番号も利用可能です。
  • CMD
    • Dockerfile で CMD 命令を一度だけ指定できます。複数の CMD がある場合、最も後ろの CMD のみ有効です。CMD の主な目的は、 コンテナ実行時のデフォルトを提供します 。 デフォルトには、実行可能なコマンドが含まれているか、あるいは省略されるかもしれません。省略時は ENTRYPOINT 命令で同様に指定する必要があります。

php.conf

#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
<IfModule prefork.c>
  LoadModule php7_module /usr/lib64/httpd/modules/libphp7.1.8.so
</IfModule>

#
# Cause the PHP interpreter to handle files with a .php extension.
#
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

#
# Allow php to handle Multiviews
#
AddType text/html .php

#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php

#
# Uncomment the following lines to allow PHP to pretty-print .phps
# files as PHP source code:
#
#<FilesMatch \.phps$>
#    SetHandler application/x-httpd-php-source
#</FilesMatch>

#
# Apache specific PHP configuration options
# those can be override in each configured vhost
#
php_value session.save_handler "files"
php_value session.save_path    "/var/lib/php/session"

名前付きイメージをビルド

$ docker build --tag myphpbrew .

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myphpbrew           latest              dbe59588f5ac        2 minutes ago       1.31GB
centos              6.9                 573de66f263e        4 months ago        195MB
  • 引数説明
    • -t, --tag list Name and optionally a tag in the 'name:tag' format

名前付きイメージに入る

$ docker run --interactive --tty myphpbrew bash

名前付きイメージを起動する

$ docker run --interactive --tty --rm --publish 80:80 --volume /Users/positrium/src/centos69/public/:/var/www/html/ myphpbrew
  • 引数説明
    • -i, --interactive Keep STDIN open even if not attached
    • -t, --tty Allocate a pseudo-TTY
    • --rm Automatically remove the container when it exits
    • -p, --publish list Publish a container's port(s) to the host
    • -v, --volume list Bind mount a volume

docker-machine ip <マシン名>などしてIPを調べたら、http://192.168.99.100/index.phpへアクセスするとphpinfo();の実行結果を得る。