Docker 入門
書いた
- docker hub 以外の方法
- テストの実行
- REPL
yum はわけない
レイヤーが分かれると遅くなる
yum install -y java wget
wget https://downloads.apache.org/tomcat/tomcat-9/v9.0.41/bin/apache-tomcat-9.0.41.tar.gz
tar zxf apache-tomcat-9.0.41.tar.gz
centos のイメージに php をインストールする手作業
$ docker pull centos:centos7
$ docker run -it -d --name centos7 -v "$(pwd)"/src:/src centos:centos7
$ docker exec -it centos7 /bin/bash
# yum install -y epel-release
# yum install -y --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd
Dockerfile の INSTRUCTION
イメージの情報はinspect
で
$ docker inspect centos7 | jq '.[].Config.Labels'
{
"org.label-schema.build-date": "20201113",
"org.label-schema.license": "GPLv2",
"org.label-schema.name": "CentOS Base Image",
"org.label-schema.schema-version": "1.0",
"org.label-schema.vendor": "CentOS",
"org.opencontainers.image.created": "2020-11-13 00:00:00+00:00",
"org.opencontainers.image.licenses": "GPL-2.0-only",
"org.opencontainers.image.title": "CentOS Base Image",
"org.opencontainers.image.vendor": "CentOS"
}
CMD
は絶対必要 ( もしくはENTRYPOINT
)
phpunit のバージョンは適当にこの辺をみて決めた
php との対応表
バージョン一覧
yum install -y wget
wget https://phar.phpunit.de/phpunit-7.5.9.phar
chmod +x phpunit-7.5.9.phar
mv phpunit-7.5.9.phar /usr/local/bin/phpunit
# phpunit --version
PHPUnit 7.5.9 by Sebastian Bergmann and contributors.
手作業での構築はできたんだけど、以下がわからん
- Dockerfile による volume は named mount だけ?
- src を共有するための bind mount は? コマンドライン引数指定か docker-compose ?
- CMD で何をするの? ずっと立っていてほしい
- エディタの PHP / PHPUnit の実態パスとして指定するには
-
php -a
をするには
build がイメージの作成
run がイメージからの起動
RUN はイメージの作り方を
ENTRYPOINT はイメージの起動時の挙動を
指定している
FROM centos:centos7
LABEL desc="php sandbox"
RUN yum install -y epel-release
RUN yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
RUN yum update -y
RUN yum install -y --enablerepo=epel,remi,remi-php73 php php-{mbstring}
ENTRYPOINT php -a
$ docker build -t php .
$ docker run --rm -it php
build は基本的に一回
run はすぐ
PHP Docker を入れないとだめ
特にそういう記述はなかったけど、PHP Storm だと標準で入っている?
build は Dockerfile を
CMD
命令の主目的は、コンテナの実行時のデフォルト処理を設定することです。
あくまでデフォルト処理
RUN
とCMD
を混同しないようにしてください。RUN
は実際にコマンドが実行されて、結果を確定させます。 一方CMD
はイメージビルド時には何も実行しません。
Alpine ってよくみるやつは Linux の軽量ディストリビューションらしい
centos から alpine に変えて yum を apk に変えておこうと思う
composer で install できる超軽いものないかな
try and error を phpunit でやるのは重い...
-f path と path は意味違うのか
-f は Dockerfile のパス
Dockerfile の中のパスは path の方が起点
vendor はどうやってホスト側と共有する領域に持ってくるんだ?
もしかして build ではなくて Dockerfile では composer の用意までで、composer install はコンテナ立ててからやるのか?
php cli のコンテナと composer のコンテナを分けてみたけど、composer 自体の install に php が必要
composer をコンテナをビルドする時に php cli のコンテナの php を指定する...??
COPY /usr/bin/composer /usr/bin/composer
参考にしてるやつは composer 自体の調達に php を使ってない感じなのかな
とりあえずコンテナの中身自体はワンパス通ればあとで変えられるので、php のインストール自体をして composer を入れる
IntelliJ から php-sandbox:cli と php-sandbox:composer それぞれを指定して、IntelliJ から composer install を実行
ホストから見える場所に vendor ができてるので、しばし待ち
あー、やっぱ Makefile で composer install をコンテナに向けて命じてるから、composer install 自体はホスト側でやってるのか
その場合 autoload.php か bin/phpunit がホストから見える vendor にできるはず
ここまで類似コマンドでできているのに、IntelliJ から phpunit が認識できない
あと何が違うんだ
vagrant みたいに立てっぱなしにしておいて fabric みたいにコマンドを ssh 先に送りつけるイメージではない
docker image history php-sandbox:mysql
にCMD ["mysqld"]
とかが入ってた
最後に images を見て消す / alpine 化する
run
のあと docker ps に出るかは-d
あたりで把握
name と id
すっきり〜〜