- 投稿日:2020-06-26T22:38:05+09:00
書籍「テスト駆動開発」をPHPで写経するためのDocker環境構築手順
はじめに
会社でテスト駆動開発の輪読会をやることになり、
あわせて書籍の中に出てくるコード(書籍内ではJavaで記述されている)をPHPで写経して理解を深めようと考えていました。この勉強会のためだけに、自分のMacにcomposerをインストールするのは嫌だったので、
使い捨てのコンテナでcomposerおよびphpunitを動かす方法を調べました。同じことを考える人が少なくとも10人くらいはいると思うので、記録に残しておきます。
対象の方
- 環境構築に時間をかけずに、さっさとPHPで書籍「テスト駆動開発」の写経をはじめたい方
前提条件
- PHPおよびPHPUnitで写経したい
- ローカルPCにcomposerをインストールしたくない
- ローカルPCにDockerをインストール済み
各種バージョン
PHP 7.4.7 PHPUnit 9.2.5 Composer version 1.10.7手順
ご自身の環境にあわせて、適当なディレクトリを作り、手順を開始してください。
composer.json の作成
docker run --rm -it -v $PWD:/app composer:latest composer init ls # composer.json
phpunit のインストール
docker run --rm -it -v $PWD:/app composer:latest composer require --dev phpunit/phpunit ls # composer.json composer.lock vendor
コード用ディレクトリ作成
mkdir src mkdir test ls # composer.json composer.lock src test vendor
composer.json に autoload の記載を追加
vi composer.json記述例は以下の通りです。
{ "name": "root/app", "require": {}, "require-dev": { "phpunit/phpunit": "^9.2" }, "autoload": { "psr-4": { "App\\": "src" } } }composer dump-autoload の実行
docker run --rm -it -v $PWD:/app composer:latest composer dump-autoload ls vendor/autoload.php # autoload.php ファイルが作成されていることを確認する
phpunit.xml の作成
vi phpunit.xml<?xml version="1.0" encoding="UTF-8" ?> <phpunit colors="true" verbose="true" bootstrap="vendor/autoload.php"> <testsuites> <testsuite name="Sample"> <directory>test</directory> </testsuite> </testsuites> </phpunit>テストコード、テスト対象コードを書く
phpunit 実行
docker run --rm -it -v $PWD:/app composer:latest vendor/bin/phpunit
- 投稿日:2020-06-26T19:26:06+09:00
Docker toolbox on windows で Dドライブに移動する
記事を書いた経緯
普段から
Windows
を使っている人にとっては何だよそれだったので.
そもそもLinux
に慣れてないというのもあって,
Linux
でのマウント方法をググったり,
d:
とかcd /d d:
とかやって勝手に苦戦していました.結論
特別マウント作業などはいらず,これだけ.
最初から割り当てられている$ cd /d補足
下記のコマンドでなんのドライブが使えるか確認してください.
データ格納用のドライブがEドライブ
とかの人もいるので.
(自分は諸事情によりC:\Program Files
配下にDocker-Toolbox
をインストールしていないので,皆さんと少し表示が違うと思います.)$ mount C:/Users/ユーザ名/AppData/Local/Temp on /tmp type ntfs (binary,noacl,posix=0,usertemp) C:/Users/ユーザ名/AppData/Local/Programs/Git on / type ntfs (binary,noacl,auto) C:/Users/ユーザ名/AppData/Local/Programs/Git/usr/bin on /bin type ntfs (binary,noacl,auto) C: on /c type ntfs (binary,noacl,posix=0,user,noumount,auto) D: on /d type ntfs (binary,noacl,posix=0,user,noumount,auto)
- 投稿日:2020-06-26T19:07:30+09:00
Macのdocker上に構築したmysqlに、ホストマシンからlocalhost:3306でつながらないよ!
docker上にmysqlイメージをデフォルト(localhost:3306)で構築したのに、ホストマシンのコンソールからつながらないよ!ぴえん!ってなっている人はホスト名を127.0.0.1で試してみてください。
DockerfileFROM mysql:8.0 ENV TZ=UTC \ MYSQL_DATABASE=laravel_local \ MYSQL_USER=phper \ MYSQL_PASSWORD=secret \ MYSQL_ROOT_PASSWORD=secret COPY ./my.cnf /etc/my.cnf
$ mysql -u phper -psecret
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
こんな風に、何もしてないのにつながらないの!なんで!
それは、 -h オプションを省略しているからです。つながるよ
$ mysql -u phper -psecret -h 127.0.0.1 mysql>つながらないよ
$ mysql -u phper -psecret > ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)-h オプションを抜くと、デフォルトでmysql clientはlocalhost:3306を見に行きます。
dockerの127.0.0.1とlocalhostは異なる扱いなので気をつけてね!
- 投稿日:2020-06-26T18:54:14+09:00
100日後にエンジニアになるキミ - 98日目 - 開発環境 - Docker について4
昨日までのはこちら
100日後にエンジニアになるキミ - 95日目 - 開発環境 - Docker について
100日後にエンジニアになるキミ - 94日目 - 開発環境 - 仮想化について
100日後にエンジニアになるキミ - 91日目 - 運用 - 監視について
100日後にエンジニアになるキミ - 90日目 - 開発 - CIについて
100日後にエンジニアになるキミ - 88日目 - データ - データ転送について
100日後にエンジニアになるキミ - 86日目 - データベース - Hadoopについて
100日後にエンジニアになるキミ - 76日目 - プログラミング - 機械学習について
100日後にエンジニアになるキミ - 70日目 - プログラミング - スクレイピングについて
100日後にエンジニアになるキミ - 66日目 - プログラミング - 自然言語処理について
100日後にエンジニアになるキミ - 63日目 - プログラミング - 確率について1
100日後にエンジニアになるキミ - 59日目 - プログラミング - アルゴリズムについて
100日後にエンジニアになるキミ - 53日目 - Git - Gitについて
100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて
100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて
100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1
100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1
100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1
100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1
本日は
Dockerfile
についてです。Dockerfile
Dockerイメージをビルドする方法の手順が含まれるテキストファイルです。
これはバッチスクリプトに似ていて必要なプログラムのインストールや
ファイルのコピーなどの記述が、目的環境になるまで続きます。Dockerfileはアプリケーションの構成と
必要なリソースの詳細を記載します。簡単に言うとDockerfileは
・Dockerイメージの設計書
・Dockerfileと言う名称のテキストファイル
です。ここからはDockerfileの書き方を見ていきましょう。
サンプル
サンプルとして
getting-started
のイメージ用の
Dockerfileを記載します。こんな内容のファイルになっています。
# Install the base requirements for the app. # This stage is to support development. FROM python:alpine AS base WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt # Run tests to validate app FROM node:12-alpine AS app-base WORKDIR /app COPY app/package.json app/yarn.lock ./ RUN yarn install COPY app/spec ./spec COPY app/src ./src RUN yarn test # Clear out the node_modules and create the zip FROM app-base AS app-zip-creator RUN rm -rf node_modules && \ apk add zip && \ zip -r /app.zip /app # Dev-ready container - actual files will be mounted in FROM base AS dev CMD ["mkdocs", "serve", "-a", "0.0.0.0:8000"] # Do the actual build of the mkdocs site FROM base AS build COPY . . RUN mkdocs build # Extract the static content from the build # and use a nginx image to serve the content FROM nginx:alpine COPY --from=app-zip-creator /app.zip /usr/share/nginx/html/assets/app.zip COPY --from=build /app/site /usr/share/nginx/htmlファイルの命名規約
まずデフォルトのファイル名が
Dockerfile
になります。拡張子も無しです。コンテナの構築手順を記述する
docker-compose.yml
ファイルは、
デフォルトのファイル名docker-compose.yml
となっています。イメージのビルドコマンドは
docker build -t [イメージ名] -f [ファイル名] .
となっているので名称を変えた際は、ファイル名などを指定して実行できます。コメント
Dockerfile内のコメントは先頭に「#」をつけます
# コメント 命令 引数 # コメント
基本構文
命令(INSTRUCTION) 引数(arguments)
「命令」は慣例的に大文字で書くようです、小文字でも問題は無いようです。
FROM
生成するイメージの元となるDockerイメージを記述します。
FROM 命令 : ベースイメージ
FROM python:alpine AS baseFROMに指定するものはなるべく小さいイメージが良いようです。
初めのうちはubuntu
やalpine
などが良さそうです。RUN
ベースイメージに対して、何らかのコマンドを実行するときにはRUNを使用します。
RUN [実行したいコマンド]
RUN pip install -r requirements.txtdockerはRUNごとにイメージレイヤーと言うものを作っています。
RUN毎にレイヤーが重なっていくのをイメージして貰えば良いかと思います。そのためRUNをたくさん使用するとDockerイメージが肥大化していくようなので
RUNをなるべく少なくした方が良さそうです。Dockerのレイヤーを作るのは
RUN
,COPY
,ADD
になるようです。
これをうまく調整してやることで、レイヤーの数を抑えることができます。
&&
でコマンドを繋いだり、\
で改行を入れたりしてRUNが少なくなるようにします。Linuxでコマンドでインストールを実行するときはインタラクティブなアクションを求められたりします。
そんな時はYesを打ち込めないのでオプション-y
を付けて対応します。RUN apt-get update && RUN apt-get install -y curlADD
イメージにホスト上のファイルやディレクトリを追加します。
ADD ホストのファイルパス Dockerイメージのファイルパス
ADD add.txt.gz /tmpCOPY
イメージにホスト上のファイルをコピーします。
COPY ホストのファイルパス Dockerイメージのファイルパス
COPY app/package.json app/yarn.lock ./CMD
Dockerファイルで生成したイメージから起動したコンテナ内で
コマンドを実行するときに使います。Dockerfile内では1つだけ記述することができ
複数記述した場合は最後のCMDのみが有効になります。
CMD [実行したいコマンド]
CMD ["mkdocs", "serve", "-a", "0.0.0.0:8000"]Dockerファイルを作ったら、ビルドテストをして
うまくイメージができていたら成功です。まとめ
Dockerの話はここで終わりです。
Dockerに関してを全て抑えるには誌面が足りません。ここからはDockerについては、ご自身で少しづつ学習して行ってください。
君がエンジニアになるまであと02日
作者の情報
乙pyのHP:
http://www.otupy.net/Youtube:
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMwTwitter:
https://twitter.com/otupython
- 投稿日:2020-06-26T13:03:15+09:00
docker on raspberry pi
Introduction
Install
sudo apt-get update && sudo apt-get upgrade
curl -sSL https://get.docker.com | sh
Setting
Create the docker group.
sudo groupadd docker
Add a Non-Root User to the Docker Group
sudo usermod -aG docker [user_name]
sudo usermod -aG docker ${USER}
sudo usermod -aG docker pi
You would need to loog out and log back in so that your group membership is re-evaluated or type the following command:
su -s ${USER}
Verify
docker run hello-world
docker image pull nginx
docker image inspect nginx
Cheat sheet
Build
Build an image from the Dockerfile in the current directory and tag the image
docker build -t myimage:1.0 .
List all images that are locally stored with the Docker Engine
docker image ls
Delete an image from the local image store
docker image rm alpine:3.4
Run
Run a container from the Alpine version 3.9 image, name the running container “web” and expose port 5000 externally, mapped to port 80 inside the container.
docker container run --name web -p 5000:80 alpine:3.9
Stop a running container through SIGTERM
docker container stop web
Stop a running container through SIGKILL
docker container kill web
List the networks
docker network ls
List the running containers (add --all to include stopped containers)
docker container ls
Delete all running and stopped containers
docker container rm -f $(docker ps -aq)
Print the last 100 lines of a container’s logs
docker container logs --tail 100 web
Share
tutorial
- 投稿日:2020-06-26T10:23:23+09:00
Dockerの使い方(自分用)
Dockerとは ローカルにサーバーを立てるためのアプリケーション。 インストール方法 公式サイトからパッケージをダウンロードし、インストールする。 使い方 イメージ イメージの一覧を表示する docker images イメージを削除する docker rmi [イメージ名|イメージID] 使用していないイメージを一括削除する docker image prune コンテナ コンテナの一覧を表示する docker ps -a コンテナを起動する docker start [コンテナ名|コンテナID] コンテナを削除する docker rm [コンテナ名|コンテナID] 使用していないコンテナを一括削除する docker container prune コンテナでコマンドを実行する docker exec [コンテナ名|コンテナID] [コマンド] コンテナのシェルに接続する ※ attachはシェルからexitで抜けるとコンテナも落ちてしまうため、exec推奨 --user: ログインするユーザーを選択する docker exec -it --user root [コンテナ名|コンテナID] /bin/bash docker attach [コンテナ名|コンテナID] コンテナ群 コンテナ群を立ち上げる -d: バックグラウンドで起動する docker-compose up -d コンテナ群を落とす docker-compose down 特定のコンテナでコマンドを実行する --rm: 実行のために作成されるコンテナを終了後に削除する docker-compose run --rm {コンテナ名} {コマンド} その他 パイプなどを含むコマンドを実行したい場合 docker-compose run --rm {コンテナ名} sh -c "{コマンド} 単語集 関連サイト [Docker Hub(イメージライブラリ)] https://hub.docker.com/ [Composeファイルの書式] https://docs.docker.com/compose/compose-file/
- 投稿日:2020-06-26T08:57:14+09:00
Dockerファイルにおける RUN・CMD・ENTRYPOINT の使い分け
DockerファイルでのRUN・CMD・ENTRYPINTは似たような命令です。ですが、これらを使い分けることができると(セキュリティ的にも)大変便利です。
対象
- Dockerの概要が分かっている人
- Linuxにおけるシェルの概要が分かっている人
RUN
- Dockerイメージを作成するときに実行されるコマンド
- 1つのDokerfileに複数記載が可能
ENTRYPOINT
- シェルを介さずにコマンドを実行する
- 1つのDokerfileに1つしか記載できない
CMD
- コマンドを実行する
- 1つのDokerfileに1つしか記載できない
ENTRYPOINT + CMD
- Dockerイメージpushを上手に使うことで、ENTRYPOINTのみのDockerイメージとCMDのみの実行コンテナとに分けることができる
- 実行コンテナ作成の際に、ENTRYPOINTのみのDockerイメージをpullする
- ENTRYPOINTのみのDockerイメージで指定したコマンドが実行コンテナで実行される
- 作成されたコンテナの用途を限定できる ― pullされるDockerイメージ側で指定したコマンドしか実行できないため
pullされるDockerイメージ
ENTRYPOINT
でコマンドを指定する実行コンテナ
CMD
をENTRYPOINT
で指定したコマンドの補完となるよう指定する例
下記のdockerfileを基にしたDockerイメージをDockerHubに上げます。
FROM alpine:latest EXPOSE 80 RUN apk add --no-cache net-tools RUN apk add --no-cache nmap-nping ENTRYPOINT ["nping", "-c", "3", "--tcp", "-p", "80"]ここでは
{DockerID}/ping:latest
として上げています。DockerHubに上げる手順は以前の記事を参照してください。実際に動かすコンテナのdocerfileは以下になります。
FROM {DockerID}/ping:latest CMD ["www.google.co.jp"]コンテナを構築し、実行します。
docker image build -t sample/ping:latest . docker container run -p 80:80 --name ping sample/ping:latestコンテナ実行結果:
まとめ
Dockerfileの命令は深く踏み込むと少々複雑です。効果的に使い分けてください。
参考
- 投稿日:2020-06-26T08:50:33+09:00
Dockerイメージpush手順
ただ"docker image push ~"とコマンドを打つだけではうまくいきません。Dockerイメージをpushする手順を以下にまとめます。
対象
本などで"docker image push"の概要は知っているが、実践したら失敗した人
手順
以下のDocerfileを例にして説明します。
FROM alpine:latest EXPOSE 80 RUN apk add --no-cache net-tools RUN apk add --no-cache nmap-nping ENTRYPOINT ["nping", "-c", "3", "--tcp", "-p", "80"]
Dockerイメージをbuildする
docker image build -t sample/ping:latest .一旦コンテナまで作成し、そのコンテナを元にDockerイメージをcommitする
docker container run -p 80:80 --name ping sample/ping:latest www.google.co.jpコンテナ実行結果:
docker container commit ping {DockerID}/ping:latestDockerHubにログインする
-p オプションをつけるとパスワードが画面に表示されることになります。-p オプションはコマンド履歴を見ることのできる環境では使わないでください。
docker login -u {DockerID}Dockerイメージをpushする
パブリックリポジトリの場合、CLIからpushすると、リポジトリは自動的に作成されます。
docker image push {DockerID}/ping:latest終わりに
Dockerイメージをpushする手順をまとめました。効率的なコンテナ運用に役立てていただければ幸いです。
参考
- 投稿日:2020-06-26T08:47:54+09:00
Dockerコンテナとは何か改めて考える
Dockerコンテナについて少し詳しく解説をします。
対象
- Dockerの概要は知っているが、もう少し詳しく学びたい人
- 目的・戦略・戦術の違いが分かる人
目的 (Objective)
以下の問題の改善を目的としています。
- アプリケーションの実行環境が変わると、確実な実行が保証できない
- 環境構築に時間がかかる
戦略 (What)
以下の戦略をとっています。
- 複数システムが同居しても競合の問題を起こさない
- 各システムで独立した実行環境を構築する
戦術 (How)
仮想化によって、上記の戦略を実現しています。
特徴:
- アプリケーションとOS・ライブラリ・Tool等をワンパッケージで提供する
- 他の仮想化技術より早い起動を実現する
- カーネルをホストPCと共有することで、コンテナ実行の度にカーネルを読み込まずに済む
理由:
ディストリビューション(CentOS、Ubuntu等)が異なってもカーネルは共通である(Linuxとは本来、カーネル部分だけを指す)。
そのため、Linux上で動かすのであれば、カーネルをホストPCと共用しても問題ない。- 可搬性・冪等性を確保する
- 可搬性・冪等性を阻害する要因
- CPUアーキテクチャが異なる
- カーネルバージョンが異なる
- ダイナミックリンクライブラリを使用する
- dockerfile用DSL・DockerHubを用意することで、環境構築の手間を減らす
- アプリケーションデプロイに特化している
- 全てのアプリケーションがコンテナ化に向いているわけではない
コンテナは一旦破棄し、作り直すと、初期状態に戻る。そのため、ステートレスなアプリケーションと相性が良い。反面、ステートフルなアプリケーションは下記のような工夫が必要である。
- ホストPCとディレクトリを共有
- 永続化が必要な部分をストレージ用コンテナに分離
コンテナの仕様
OCIにて標準化が進められています。
コンテナ適用例
- 本番環境
- 開発環境と本番環境との差異を吸収する
- 開発メンバ間での開発環境の統一
- サンプル環境・サンプルコードの配布
- 実行環境ごと配布することになるので「動かない」可能性を減らせる
終わりに
コンテナの基本事項をまとめ直しました。コンテナ構築の際に役立てていただけたら幸いです。
参考
コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤
- 投稿日:2020-06-26T08:07:44+09:00
PHPStormからDockerのPHPコンテナでPHPUnitを実行する方法
はじめに
ローカル環境でDockerを利用しているときに、
PHPStormの画面上からPHPUnitを実行できるようにするための
設定方法を紹介します。大きく2つの設定が必要になります。
- PHP interpreterを設定
- PHPUnitのinterpreterを設定
PHP interpreterを設定
・「Settings」->「Languages & Frameworks」->「PHP」->「CLI Intepreter」->「...」をクリック
・左上の「+」->「From Docker, Vagrant, VM, WSL, Remote...]をクリック
・「Docker Compose」のラジオボタンを選択する
→「Configuration file」にdocker-compose.ymlのパスを設定
→「Service」でphp-fpmのコンテナを選択
→「OK」クリック
※「Docker」を選択すると、PHPUnitでDBコンテナを利用する際に接続できないので「Docker Compose」で設定する
PHPUnitのinterpreterを設定
・「Settings」->「Languages & Frameworks」->「PHP」->「Test Frameworks」->左上の「+」->「PHPUnit by Remote Interpreter」をクリック
・先ほど登録したDockerコンテナのInterpreterを選択
・「Path to script」にDockerコンテナのautoload.phpのパスを設定
・「Default configuration file」にphpunit.xmlのパスを設定
- 投稿日:2020-06-26T01:50:12+09:00
Docker Toolbox 起動エラー対処
Windows 10 Homeにdocker toolboxをインストールする手順にて下記エラーが発生する場合、対処法を示す
Docker インストール
手順は公式を参考 公式
エラー
Toolbox起動後、下記エラーが表示される
looks like something went wrong in step ́looking for vboxmanage.exe ́... press any key to continue
対処法
調べるとToolboxフォルダ内のstart.shでdocker-machine.exeを読み込むパスが主な原因らしい
start.shをデバックする
start.shをvscodeでもメモ帳でもいいから開き、docker-machine.exeのパスを確認する
次に、start.sh内の
DOCKER_MACHINE
パスを変更する
忘れがち
virtualBoxをインストールし忘れないように
- 投稿日:2020-06-26T01:28:01+09:00
Wordpressプラグイン開発のためのDocker Compose
人は不意に、何かを作りたくなる
というわけで、WordPressプラグインを作りたくなりました。今時なのでDockerで環境構築したいと思います。
ディレクトリ構成は以下の通りです。now_directory |_docker-compose.yml |_your_plugin_directory/ |_yourPlugin.php既にyourPlugin.phpには https://developer.wordpress.org/plugins/plugin-basics/header-requirements/ にあるヘッダー情報が適当に書き込まれていることとします。
先人の轍を踏め
http://docs.docker.jp/compose/wordpress.html にとても素晴らしいdocker-compose.ymlがありますので、これをコピってきて以下のように書き換えます。
とは言っても、wordpressコンテナにvolumesの項目を追加しただけですが。docker-compose.ymlversion: '3' services: db: image: mysql:5.7 volumes: - db_data:/var/lib/mysql restart: always environment: MYSQL_ROOT_PASSWORD: somewordpress MYSQL_DATABASE: wordpress MYSQL_USER: wordpress MYSQL_PASSWORD: wordpress wordpress: depends_on: - db image: wordpress:latest volumes: - ./your_plugin_directory/:/var/www/html/wp-content/plugins/your_plugin_directory/ ports: - "8000:80" restart: always environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress WORDPRESS_DB_PASSWORD: wordpress volumes: db_data:さあ、深淵を覗きこめ
ここでおもむろに
docker-compose up -d --build
を実行します。無事にコンテナが立ち上がったら、 http://localhost:8000/ をブラウザで開きましょう。
いつものセットアップは終わりましたか?終わりましたね。では、wordpressにログインした状態でプラグインを覗きにいきましょう。
さぁ、あなたのプラグインはそこにあったでしょうか?(あるはずです)おっと、忘れるところだったぜ
これは完全にプラグインのみの開発のためのものです。サイト自体も開発したいのならば、他の記事もお調べになる方がいいと思います。
などと言うものの、私もこれから初めてプラグインを作っていくのでこれでプラグインの開発が完璧なのかと言われるとちょっと自信が無いですが(特にDB回り)。