Closed37

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

イメージの情報は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 )

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 だと標準で入っている?

CMD命令の主目的は、コンテナの実行時のデフォルト処理を設定することです。

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

あくまでデフォルト処理

RUNCMDを混同しないようにしてください。RUNは実際にコマンドが実行されて、結果を確定させます。 一方CMDはイメージビルド時には何も実行しません。

Alpine ってよくみるやつは Linux の軽量ディストリビューションらしい

centos から alpine に変えて yum を apk に変えておこうと思う

composer で install できる超軽いものないかな

try and error を phpunit でやるのは重い...

vendor はどうやってホスト側と共有する領域に持ってくるんだ?

もしかして build ではなくて Dockerfile では composer の用意までで、composer install はコンテナ立ててからやるのか?

php cli のコンテナと composer のコンテナを分けてみたけど、composer 自体の install に php が必要

composer をコンテナをビルドする時に php cli のコンテナの php を指定する...??

COPY --from=composer:2.0 /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:mysqlCMD ["mysqld"]とかが入ってた

最後に images を見て消す / alpine 化する

runのあと docker ps に出るかは-dあたりで把握

このスクラップは2021/04/15にクローズされました
作成者以外のコメントは許可されていません