20190730のdockerに関する記事は10件です。

Docker学習メモ

Docker学習メモ

>>> 編集中

はじめに

アプリケーションを開発していく上で、開発環境のWindowsと本番環境のLinuxで差分が出てしまうのを
解決したかったので、Dockerを実際に使ってみました

それに伴いDockerの概要や使ってみた感想などをまとめてみました

Dockerについて

まず、Dockerとは仮想環境を提供するソフトウェアの事を指します
コンテナは隔離されたOSを持ち、その上でアプリケーションを稼働させることが出来ます
そしてアプリケーションを依存対象と共にカプセル化することが出来ます

またホストOSとリソースを共有出来ることが特徴です

Dockerの大まかな概要は下記を参照してください

公式, Dockerアーキテクチャ, コンテナについて

Dockerのデメリット

Dockerを利用する上での利点についてです

  • フレームワークやミドルウェアを自分で構築する必要がない

例えばLaravelを利用した開発を行う場合に、ホストOSにPHPをインストールしなくても
Bitnamiが提供するLaravelのイメージがDocker Hubと呼ばれるリポジトリに配布されているため
簡単に環境を構築できます

また新しいフレームワークや技術が登場しても、Docker Hubにイメージが配布されていれば、自分で環境構築をする必要はありません

  • 複数の開発環境の統一できる

DockerfileにOSやパッケージのバージョンを指定することが出来るため
開発環境ではUbuntuRHELなどのOSやRubyNodejsPHPGoなどの言語のバージョンを統一できます

またaptpipなどのパッケージマネージャで管理されていないライブラリをmsiをでいちいちインストールする必要もありません

僕の認識ではseleniumは、ChromeDriverを手でインストールする必要がありますが
コンテナの場合、その作業は必要なく、ホストの\\Program Files/opt/varなどの汚染を気にすることもありません

  • 開発環境と本番環境の差分を埋めることが出来る

アプリケーションやミドルウェアはDocker Engine上で稼働するため
開発環境、本番環境のホストOS上でDocker Engineプロセスさえ起動していれば、アプリケーションは差分なく稼働することが出来ます

  • VMと比べて早い

リンクを参照すると早いかもしれません
ゲストOSがない分、コンテナの起動が早くキャッシュを利用したコンテナの再ビルドはとても高速です
vagrant upに比べて体感速度レベルで起動速度が違います

Dockerのデメリット

  • セキュリティが弱い

  • 開発中なので、バグを踏む可能性がある

  • 依然として、VMに依存しているのでオーバヘッドなどの恩恵を100%受けることが出来ない

Dockerを理解する

基本的なDockerの操作についてです

まずDockerをホストにインストールする必要があります
Dockerのインストールについては、下記のリンクを参照してください

リンクリンク

インストールが終わったところで、簡単にコンテナでコマンドを実行する流れを紹介します
例えばCent OSコンテナでcat /etc/system-releaseコマンドを実行する場合は下記の手順を踏むことで処理を行えます

  • docker pull centosコマンドで、コンテナのひな形となるイメージファイルを取得する
  • docker run --name mycontainer centosコマンドで、イメージからコンテナを生成、起動する
  • コンテナログイン後、cat /etc/system-releaseコマンドで実行する
  • exitコマンドでコンテナから抜ける

CentOS Linux release 7.6.1810 (Core)が表示されれば処理成功です、バージョンは読み替えて下さい

補足ですが、docker runの引数に指定されたイメージがローカル環境に存在しない場合、Docker Hubから取得できるため
上記の作業はワンライナーで行えます

docker run -it --rm centos cat /etc/system-release

基本的な操作を理解したうえで、サブコマンドDockerアーキテクチャ
について確認してください

Docker + Laravel

ここでは具体的に下記の作業を行います

ここで掲載されている環境情報についてですが、PCはWindows 10 Pro
ターミナルはcmdgit bashを使用しています、>プロンプトはcmdで$プロンプトはgit bashです

  • Laravelをcomposerでインストールする
  • ホストOSからLaravelのTOPページが見えることを確認する
  • 開発環境でweb.phpを編集し、変更が反映されることを確認する

ディレクトリを作成します

> sh -c "mkdir -p work/app"

ディレクトリ階層

> tree /F /A | sh -c "egrep '^\s*[\||\\\\|+]'"
\---work    --- 親ディレクトリ
    \---app --- Laravel配置ディレクトリ

次にDockerfileを作成します

> sh -c "touch work/Dockerfile"

Dockerfileの詳細です、このDockerfileはcomposerコンテナとして使用します

FROM php

ENV COMPOSER_ALLOW_SUPERUSER 1

RUN apt update && apt install -y wget git unzip

RUN EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)" && \
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
    ACTUAL_SIGNATURE="$(php -r "echo hash_file('sha384', 'composer-setup.php');")" && \
    [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ] && { \
        >&2 echo 'ERROR: Invalid installer signature' && \
        rm composer-setup.php && \
        exit 1;\
    }; \
    php composer-setup.php --quiet && \
    mv ./composer.phar /usr/local/bin/composer

ENTRYPOINT ["composer"]

各パラメータについて説明します

Laravelのインストールのため、phpコンテナを使用します

FROM php

コンテナの操作する際のユーザはrootを使用していますが、Laravelをrootで起動すると
警告が出るため、一旦ここではroot起動を許可する設定を入れています

ENV COMPOSER_ALLOW_SUPERUSER 1

インストーラ取得時のwget、Laravelをインストールする際に必要なgitunzipをインストールします

RUN apt update && apt install -y wget git unzip

公式に従ってインストールを行います

RUN EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)" && \
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
    ACTUAL_SIGNATURE="$(php -r "echo hash_file('sha384', 'composer-setup.php');")" && \
    [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ] && { \
        >&2 echo 'ERROR: Invalid installer signature' && \
        rm composer-setup.php && \
        exit 1;\
    }; \
    php composer-setup.php --quiet && \
    mv ./composer.phar /usr/local/bin/composer

エントリポイントと呼ばれる起動シェルを指定します
このコンテナはLaravelをインストールするコンテナとして使用するため、値にはcomposerを使用します

ENTRYPOINT ["composer"]

用意が出来たので、Dockerfileの内容をイメージに固めます
イメージを固める際に-tオプションをつけてイメージに名前を付けておくと後で楽なので
composerとタグをつけます

$ cd work
$ docker build ./ -t composer

先ほどビルドしたイメージを使用して、Laravelのインストールを行います、下記コマンドを実行し
Application key set successfully.が標準出力に表示され、ホストのディレクトリにLaravel一式が作成された場合は、処理成功です

$ docker run -it --rm -v /`pwd`/app://app -w //app composer create-project --prefer-dist "laravel/laravel=5.8.*" .

コマンドオプションを見てみます
このコマンドでやりたいことは、ホストの./appディレクトリとコンテナの/appディレクトリをマウントさせた状態でLaravelを/appにインストールすることです

-i ホストの入力をコンテナの標準入力に繋げます
-t コンテナの標準出力をホストの標準出力に繋げます

--rm コンテナが処理を終了した場合、自動的に停止したコンテナを削除します

-v マウントオプションです、[ホストのパス]:[コンテナのパス]によって
ホストのファイルとコンテナのファイルの同期を行います

-w 作業ディレクトリの指定です

composer イメージの指定です

create-project --prefer-dist "laravel/laravel=5.8.*" . コンテナで実行するコマンドです

コマンドが成功したら、Laravelを起動してみます、下記コマンドを実行し
ブラウザからlocalhost:8000にアクセスし、LaravelのTOPページが表示されたら成功です

$ docker run -t --rm --name laravel -v /`pwd`/app://app -w //app -p 8000:8000 php php artisan serve --host=0.0.0.0

コマンドオプションを見てみます
このコマンドでやりたいことは、ホストの8000ポートとコンテナの8000を同期させた状態で
Laravelを起動することです

-t、--rm、-v、-w 省略

-p ポートフォワードの指定です、コンテナのポートとホストのポートを同期できます

--name コンテナ名の指定です

php イメージの指定です

php artisan serve --host=0.0.0.0 コンテナで実行するコマンドです

Laravelを立ちあげることが出来たら、Ctrl + Cでコンテナを停止させ、ソースの編集します

Controller作成

$ docker run -it --rm -v /`pwd`/app://app -w //app php php artisan make:controller TmpController

ルーティングを定義します

work/app/routes/web.php
<?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/

Route::get('/', function () {
    return view('welcome');
});

// 追加
Route::get('/tmp','TmpController@index');

Controllerを編集します

work/app/app/Http/Controllers/TmpController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TmpController extends Controller
{
    public function index() {
        return "Hello World";
    }
}

ブラウザからlocalhost:8000/tmpにアクセスし、Hello Worldが表示されれば成功です

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel+MySQL5.7+nginxをDockerで構築(browser-sync、docker-sync)

備忘録として、DockerでLaravelを環境構築、brouser-sync、docker-syncの導入手順をまとめます。

  • Docker for Macは速度が遅い。
  • browser-syncを使うと、体感5s~10sくらいはページリロードにかかる。

結果的にdocker-syncを導入して、以下のように改善しました。

  • ページのリロードがbrowser-sync込みでも体感1s以内
  • コンテナ環境内でのコマンドも爆速に

まずはLaravelをDockerで構築する手順からまとめていきます。

Laravel+MySQL5.7+nginxをDockerで構築

ディレクトリ構成、docker-compose.ymlDockerfileは以下を参考にしました。
Laravelの環境をDockerで構築するチュートリアル

ディレクトリの構成

$ tree -L 3
.
├── docker
│   ├── php
│   │   └── Dockerfile
│   └── web
│       └── default.conf
├── docker-compose.yml
Dockerfile
FROM php:7.2-fpm

# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install pdo_mysql pdo_pgsql

WORKDIR /var/www/html
docker-compose.yml
version: '3'
services:
  web:
    image: nginx:1.15.6
    ports:
      - "8000:80"
    depends_on:
      - app
    volumes:
      - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html
  app:
    build: ./docker/php
    depends_on:
      - mysql
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: sample
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
volumes:
  mysql-data:

次に、以下のコマンドを実行します。

# コンテナをバックグラウンドで起動
$ docker-compose up -d

# 環境内に入る
docker-compose exec app bash

# composerコマンドでLaravelプロジェクトを作成
composer create-project --prefer-dist laravel/laravel [プロジェクト名] 

nginxの設定ファイルを編集します。

default.conf
server {
    listen 80;

    root  /var/www/html/[プロジェクト名]/public;
    index index.php index.html index.htm;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass   app:9000;
          fastcgi_index  index.php;

          include        fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param  PATH_INFO $fastcgi_path_info;
      }
}

プロジェクト内にある.envを編集します。

.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=user
DB_PASSWORD=password
# コンテナを再起動
$ docker-compose restart

# appコンテナ内に入る
$ docker-compose exec app bash

# ここでartisanコマンドを実行する
$ php artisan migrate
# mysqlコンテナ内に入る場合は
$ docker-compose exec mysql bash

# DBに接続
mysql -u root -p
# DBを選択
> use sample;

以下のURLからアプリをブラウザに確認できる
http://localhost:8000/

個人的にdocker-composeと入力するのが面倒なのでエイリアスを設定しています。

~/.bashrc
alias dkcp='docker-compose'
# sourceコマンドで設定を反映
$ source ~/.bashrc

# 以下のように入力できるようになります
$ dkcp up -d

laravel mix

browser-syncを使うために、package.jsonを以下のようにします。

package.json
"devDependencies": {
    "axios": "^0.18",
    "bootstrap": "^4.1.0",
    "browser-sync": "^2.26.3", # 追記(コメントは削除する)
    "browser-sync-webpack-plugin": "2.0.1",  # 追記(コメントは削除する)
    "cross-env": "^5.1",
    "jquery": "^3.2",
    "laravel-mix": "^4.0.7",
    "lodash": "^4.17.5",
    "popper.js": "^1.12",
    "resolve-url-loader": "^2.3.1",
    "sass": "^1.15.2",
    "sass-loader": "^7.1.0",
    "vue": "^2.5.17",
    "vue-template-compiler": "^2.6.10"
}
$ cd [package.jsonがあるディレクトリ]

##############
# npmを使う場合
##############
$ npm install 

##############
# yarnを使う場合
##############
$ yarn 

webpack.mix.jsを編集。

webpack.mix.js
const mix = require('laravel-mix')

mix.browserSync('localhost:8000')
  .js('resources/js/app.js', 'public/js')
  .sass('resources/sass/app.scss', 'public/css')
  .version()
##############
# npmを使う場合
##############
# ビルド
$ npm run dev

# 監視する
$ npm run watch

# 以下のエラーが出た場合は参考にあるURLを見てください
# The Mix manifest does not exist when it does exist

##############
# yarnを使う場合
##############
# ビルド
$ yarn run dev

# 監視する
$ yarn run watch

docker-syncを使って、docker for Macの速度を改善する

事前準備

$ gem install docker-sync
$ brew install fswatch
$ brew install unison

docker-compose-dev.yml,docker-sync.ymlを新規に作成する。
docker-sync ドキュメント

ディレクトリの構成

$ tree -L 3
.
├── docker
│   ├── php
│   │   └── Dockerfile
│   └── web
│       └── default.conf
├── docker-compose-dev.yml
├── docker-compose.yml
├── docker-sync.yml
docker-compose-dem.yml
version: "3"
services:
  app:
    volumes:
      - sync-volume:/var/www/html:nocopy # nocopy is important

volumes:
  sync-volume:
    external: true
docker-sync.yml
version: '2'

syncs:
  sync-volume:
    src: '.'
# docker-syncで同期開始
$ docker-sync start

# コンテナを起動
$ docker-compose -f docker-compose.yml -f docker-compose-dev.yml up -d

ブラウザで確認
http://localhost:8000/


Permission denidがブラウザに表示される場合

ブラウザを確認しながら、適宜storage内のパーミッションを変更する。

$ chmod 777 hogehoge


file not foundとブラウザに表示される場合

ドキュメントルートを変更すると直るかもしれません。
nginxの設定ファイルのdefault.conf内にあるrootを変更する。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ローカル実行用の docker-compose.yml はバージョン 2 系で

バージョン 3 は Docker Swarm 用

バージョン 3 以降削除されている機能がありますので、ローカルのテスト環境構築などに使う場合はバージョン 2 系を使う方が便利なのでした。

詳しい話は反響次第で。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker のコマンド忘れやすいため

Docker コンテナを実行する。

docker container run イメージ名:タグ名
docker container run -d -p 9000:8080 example/echo:latest
  1. -i :起動時に標準入力をつなげっぱなし。
  2. -t :疑似端末を有効にする
  3. --rm :終了時コンテナ破棄
  4. -d :バックグラウンド実行
  5. -v :ホストトコンテナでディレクトリ共有
  6. -p :ホスト側ポート(省略可):コンテナ側ポート

docker の一覧表示用

docker container ls -q                                    // IDのみ抽出
docker container ls --fileter "name"                      // 名前でフィルタ
docker container ls --fileter "ancestor=example/echo"     // イメージ抽出
docker container ls -a                                    // 終了したコンテナを取得

削除系

docker container rm コンテナIDorコンテナ名                // コンテナの破棄
docker container rm -f コンテナIDorコンテナ名             // 実行中のコンテナも削除可
docker container prune                                    // コンテナを一括削除
docker image prune                                        // イメージを一括削除
docker system prune                                       // 利用されていないすべてのリソースを削除

docker image コマンド

docker image pull イメージ名:タグ名                                         // Dockerのイメージを取得する。
docker image build -t イメージ名:タグ名  Dockerfile配置ディレクトリのパス
docker image build -t example/echo:latest .                                 // docker イメージをbuildする。
docker image tag example/echo:latest example/echo:0.1.0                     // docker イメージにタグをつける。

その他

docker container restart コンテナIDorコンテナ名           // コンテナの再起動
docker container stop コンテナ名                          // コンテナの停止
docker container logs -f コンテナIDorコンテナ名           // 標準出力を取得し続ける( tail -f 的な)
docker container exec -it コンテナIDorコンテナ名 sh       // 実行中コンテナでコマンド実行(shコマンド)
docker container cp コンテナ名orコンテナID:ファイル名 .   // コンテナ上のファイルをホストにコピー
docker container cp ホストファイル名 コンテナ名:パス      // ホスト上のファイルをコンテナにコピー
docker container stats                                    // 利用状況の取得(top 的な)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel+MySQL5.7+nginxをDockerで構築(laravel.mix、docker-syncで速度改善)

未経験エンジニアのsongxunといいます。
初めての投稿です。間違い等あればご指摘いただけると幸いです。

備忘録として、DockerでLaravelを環境構築、brouser-sync、docker-syncの導入手順をまとめます。

環境はDocker for Mac
速度がめちゃくちゃ遅い。さらにbrowser-syncを使うと、体感5s~10sくらいはページリロードにかかってるかもしれません。

結果的にdocker-syncを導入して、以下のように改善しました。

  • ページのリロードがbrowser-sync込みでも体感1s以内
  • コンテナ環境内でのコマンドも爆速に

まずはLaravelをDockerで構築する手順からまとめていきます。

Laravel+MySQL5.7+nginxをDockerで構築

ディレクトリ構成、docker-compose.ymlDockerfileこちらを参考にさせていただきました。作成し終わったら、以下のコマンドを実行します。

# コンテナをバックグラウンドで起動
$ docker-compose up -d

# 環境内に入る
docker-compose exec app bash

# composerコマンドでLaravelプロジェクトを作成
composer create-project --prefer-dist laravel/laravel [プロジェクト名] 

プロジェクト内の.envファイルを以下のように編集します。

.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=user
DB_PASSWORD=password
# コンテナを再起動
$ docker-compose restart

# appコンテナ内に入る
$ docker-compose exec app bash

# ここでartisanコマンドを実行する
$ php artisan migrate
# mysqlコンテナ内に入る場合は
$ docker-compose exec mysql bash

# DBに接続
mysql -u root -p
# DBを選択
> use sample;

ブラウザにアクセス
http://localhost:8000/

個人的にdocker-composeと入力するのが面倒なのでエイリアスを設定しています。

~/.bashrc
alias dkcp='docker-compose'
# sourceコマンドで設定を反映
$ source ~/.bashrc

# 以下のように入力できるようになります
$ dkcp up -d

laravel mix

browser-syncを使うために、package.jsonを以下のようにします。

package.json
"devDependencies": {
    "axios": "^0.18",
    "bootstrap": "^4.1.0",
    "browser-sync": "^2.26.3",
    "browser-sync-webpack-plugin": "2.0.1",
    "cross-env": "^5.1",
    "jquery": "^3.2",
    "laravel-mix": "^4.0.7",
    "lodash": "^4.17.5",
    "popper.js": "^1.12",
    "resolve-url-loader": "^2.3.1",
    "sass": "^1.15.2",
    "sass-loader": "^7.1.0",
    "vue": "^2.5.17",
    "vue-template-compiler": "^2.6.10"
}
$ cd [package.jsonがあるディレクトリ]

##############
# npmを使う場合
##############
$ npm install 

##############
# yarnを使う場合
##############
$ yarn 

webpack.mix.jsを編集する。

webpack.mix.js
const mix = require('laravel-mix')

mix.browserSync('localhost:8000')
  .js('resources/js/app.js', 'public/js')
  .sass('resources/sass/app.scss', 'public/css')
  .version()
##############
# npmを使う場合
##############
# ビルド
$ npm run dev

# 監視する
$ npm run watch

# 以下のエラーが出た場合は参考にあるURLを見てください
# The Mix manifest does not exist when it does exist

##############
# yarnを使う場合
##############
# ビルド
$ yarn run dev

# 監視する
$ yarn run watch

docker-syncを使って、docker for Macの速度を改善する

事前準備

$ gem install docker-sync
$ brew install fswatch
$ brew install unison

docker-compose-dev.yml,docker-sync.ymlを追加。コチラを参考にさせていただきました。ymlのバージョンを変更する必要があるかもしれません。

# docker-syncで同期開始
$ docker-sync start

# コンテナを起動
$ docker-compose -f docker-compose.yml -f docker-compose-dev.yml up -d

Permission denidがブラウザに表示される場合

ブラウザを確認しながら、適宜storage内のパーミッションを変更する。

$ chmod 777 hogehoge

file not foundとブラウザに表示される場合

ドキュメントルートを変更すると直るかもしれません。
nginxの設定ファイルのdefault.conf内にあるrootを変更する。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel+MySQL5.7+nginxをDockerで構築(laravel.mix、docker-sync)

未経験エンジニアのsongxunといいます。
初めての投稿です。間違い等あればご指摘いただけると幸いです。

備忘録として、DockerでLaravelを環境構築、brouser-sync、docker-syncの導入手順をまとめます。

環境はDocker for Mac
速度がめちゃくちゃ遅い。さらにbrowser-syncを使うと、体感5s~10sくらいはページリロードにかかってるかもしれません。

結果的にdocker-syncを導入して、以下のように改善しました。

  • ページのリロードがbrowser-sync込みでも体感1s以内
  • コンテナ環境内でのコマンドも爆速に

まずはLaravelをDockerで構築する手順からまとめていきます。

Laravel+MySQL5.7+nginxをDockerで構築

ディレクトリ構成、docker-compose.ymlDockerfileこちらを参考にさせていただきました。作成し終わったら、以下のコマンドを実行します。

# コンテナをバックグラウンドで起動
$ docker-compose up -d

# 環境内に入る
docker-compose exec app bash

# composerコマンドでLaravelプロジェクトを作成
composer create-project --prefer-dist laravel/laravel [プロジェクト名] 

プロジェクト内の.envファイルを以下のように編集します。

.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=user
DB_PASSWORD=password
# コンテナを再起動
$ docker-compose restart

# appコンテナ内に入る
$ docker-compose exec app bash

# ここでartisanコマンドを実行する
$ php artisan migrate
# mysqlコンテナ内に入る場合は
$ docker-compose exec mysql bash

# DBに接続
mysql -u root -p
# DBを選択
> use sample;

ブラウザにアクセス
http://localhost:8000/

個人的にdocker-composeと入力するのが面倒なのでエイリアスを設定しています。

~/.bashrc
alias dkcp='docker-compose'
# sourceコマンドで設定を反映
$ source ~/.bashrc

# 以下のように入力できるようになります
$ dkcp up -d

laravel mix

browser-syncを使うために、package.jsonを以下のようにします。

package.json
"devDependencies": {
    "axios": "^0.18",
    "bootstrap": "^4.1.0",
    "browser-sync": "^2.26.3",
    "browser-sync-webpack-plugin": "2.0.1",
    "cross-env": "^5.1",
    "jquery": "^3.2",
    "laravel-mix": "^4.0.7",
    "lodash": "^4.17.5",
    "popper.js": "^1.12",
    "resolve-url-loader": "^2.3.1",
    "sass": "^1.15.2",
    "sass-loader": "^7.1.0",
    "vue": "^2.5.17",
    "vue-template-compiler": "^2.6.10"
}
$ cd [package.jsonがあるディレクトリ]

##############
# npmを使う場合
##############
$ npm install 

##############
# yarnを使う場合
##############
$ yarn 

webpack.mix.jsを編集する。

webpack.mix.js
const mix = require('laravel-mix')

mix.browserSync('localhost:8000')
  .js('resources/js/app.js', 'public/js')
  .sass('resources/sass/app.scss', 'public/css')
  .version()
##############
# npmを使う場合
##############
# ビルド
$ npm run dev

# 監視する
$ npm run watch

# 以下のエラーが出た場合は参考にあるURLを見てください
# The Mix manifest does not exist when it does exist

##############
# yarnを使う場合
##############
# ビルド
$ yarn run dev

# 監視する
$ yarn run watch

docker-syncを使って、docker for Macの速度を改善する

事前準備

$ gem install docker-sync
$ brew install fswatch
$ brew install unison

docker-compose-dev.yml,docker-sync.ymlを追加。コチラを参考にさせていただきました。ymlのバージョンを変更する必要があるかもしれません。

# docker-syncで同期開始
$ docker-sync start

# コンテナを起動
$ docker-compose -f docker-compose.yml -f docker-compose-dev.yml up -d

Permission denidがブラウザに表示される場合

ブラウザを確認しながら、適宜storage内のパーミッションを変更する。

$ chmod 777 hogehoge

file not foundとブラウザに表示される場合

ドキュメントルートを変更すると直るかもしれません。
nginxの設定ファイルのdefault.conf内にあるrootを変更する。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel+MySQL5.7+nginxをDockerで構築(browser-sync、docker-sync)

未経験エンジニアのsongxunといいます。
初めての投稿です。間違い等あればご指摘いただけると幸いです。

備忘録として、DockerでLaravelを環境構築、brouser-sync、docker-syncの導入手順をまとめます。

  • Docker for Macは速度が遅い。
  • browser-syncを使うと、体感5s~10sくらいはページリロードにかかる。

結果的にdocker-syncを導入して、以下のように改善しました。

  • ページのリロードがbrowser-sync込みでも体感1s以内
  • コンテナ環境内でのコマンドも爆速に

まずはLaravelをDockerで構築する手順からまとめていきます。

Laravel+MySQL5.7+nginxをDockerで構築

ディレクトリ構成、docker-compose.ymlDockerfileは以下を参考にしました。
Laravelの環境をDockerで構築するチュートリアル

ディレクトリの構成

$ tree -L 3
.
├── docker
│   ├── php
│   │   └── Dockerfile
│   └── web
│       └── default.conf
├── docker-compose.yml
Dockerfile
FROM php:7.2-fpm

# install composer
RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer
RUN apt-get update \
&& apt-get install -y \
git \
zip \
unzip \
vim

RUN apt-get update \
    && apt-get install -y libpq-dev \
    && docker-php-ext-install pdo_mysql pdo_pgsql

WORKDIR /var/www/html
docker-compose.yml
version: '3'
services:
  web:
    image: nginx:1.15.6
    ports:
      - "8000:80"
    depends_on:
      - app
    volumes:
      - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html
  app:
    build: ./docker/php
    depends_on:
      - mysql
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: sample
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
volumes:
  mysql-data:

次に、以下のコマンドを実行します。

# コンテナをバックグラウンドで起動
$ docker-compose up -d

# 環境内に入る
docker-compose exec app bash

# composerコマンドでLaravelプロジェクトを作成
composer create-project --prefer-dist laravel/laravel [プロジェクト名] 

nginxの設定ファイルを編集します。

default.conf
server {
    listen 80;

    root  /var/www/html/[プロジェクト名]/public;
    index index.php index.html index.htm;

    access_log /var/log/nginx/access.log;
    error_log  /var/log/nginx/error.log;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass   app:9000;
          fastcgi_index  index.php;

          include        fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param  PATH_INFO $fastcgi_path_info;
      }
}

プロジェクト内にある.envを編集します。

.env
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=user
DB_PASSWORD=password
# コンテナを再起動
$ docker-compose restart

# appコンテナ内に入る
$ docker-compose exec app bash

# ここでartisanコマンドを実行する
$ php artisan migrate
# mysqlコンテナ内に入る場合は
$ docker-compose exec mysql bash

# DBに接続
mysql -u root -p
# DBを選択
> use sample;

以下のURLからアプリをブラウザに確認できる
http://localhost:8000/

個人的にdocker-composeと入力するのが面倒なのでエイリアスを設定しています。

~/.bashrc
alias dkcp='docker-compose'
# sourceコマンドで設定を反映
$ source ~/.bashrc

# 以下のように入力できるようになります
$ dkcp up -d

laravel mix

browser-syncを使うために、package.jsonを以下のようにします。

package.json
"devDependencies": {
    "axios": "^0.18",
    "bootstrap": "^4.1.0",
    "browser-sync": "^2.26.3", # 追記(コメントは削除する)
    "browser-sync-webpack-plugin": "2.0.1",  # 追記(コメントは削除する)
    "cross-env": "^5.1",
    "jquery": "^3.2",
    "laravel-mix": "^4.0.7",
    "lodash": "^4.17.5",
    "popper.js": "^1.12",
    "resolve-url-loader": "^2.3.1",
    "sass": "^1.15.2",
    "sass-loader": "^7.1.0",
    "vue": "^2.5.17",
    "vue-template-compiler": "^2.6.10"
}
$ cd [package.jsonがあるディレクトリ]

##############
# npmを使う場合
##############
$ npm install 

##############
# yarnを使う場合
##############
$ yarn 

webpack.mix.jsを編集。

webpack.mix.js
const mix = require('laravel-mix')

mix.browserSync('localhost:8000')
  .js('resources/js/app.js', 'public/js')
  .sass('resources/sass/app.scss', 'public/css')
  .version()
##############
# npmを使う場合
##############
# ビルド
$ npm run dev

# 監視する
$ npm run watch

# 以下のエラーが出た場合は参考にあるURLを見てください
# The Mix manifest does not exist when it does exist

##############
# yarnを使う場合
##############
# ビルド
$ yarn run dev

# 監視する
$ yarn run watch

docker-syncを使って、docker for Macの速度を改善する

事前準備

$ gem install docker-sync
$ brew install fswatch
$ brew install unison

docker-compose-dev.yml,docker-sync.ymlを新規に作成する。
docker-sync ドキュメント

ディレクトリの構成

$ tree -L 3
.
├── docker
│   ├── php
│   │   └── Dockerfile
│   └── web
│       └── default.conf
├── docker-compose-dev.yml
├── docker-compose.yml
├── docker-sync.yml
docker-compose-dem.yml
version: "3"
services:
  app:
    volumes:
      - sync-volume:/var/www/html:nocopy # nocopy is important

volumes:
  sync-volume:
    external: true
docker-sync.yml
version: '2'

syncs:
  sync-volume:
    src: '.'
# docker-syncで同期開始
$ docker-sync start

# コンテナを起動
$ docker-compose -f docker-compose.yml -f docker-compose-dev.yml up -d

ブラウザで確認
http://localhost:8000/


Permission denidがブラウザに表示される場合

ブラウザを確認しながら、適宜storage内のパーミッションを変更する。

$ chmod 777 hogehoge


file not foundとブラウザに表示される場合

ドキュメントルートを変更すると直るかもしれません。
nginxの設定ファイルのdefault.conf内にあるrootを変更する。

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

自分の勉強記録を分析しよう!~新米エンジニアの個人開発~

自分の勉強記録を分析しよう!~新米エンジニアの個人開発~

プログラマー歴1年目のじょーだいです。

プログラマーになって一年、そろそろ新しいことを学んでみたかったので、使ったことのない技術を使用して簡単なwebアプリケーションを開発してみました。

どんなアプリ?

僕は勉強したことをTwitterでつぶやいています。

他にも多くの方々が自分の勉強したことをつぶやいているのをよく見かけます。

せっかく勉強しているならその記録をしっかり残したい。。。

そこで今回は自分の勉強を記録しておくことのできる「Stacker」というアプリを開発しました。

使用している技術は?

  • Laravel
  • Vue.js
  • Chart.js
  • MySQL
  • Docker
  • XSERVER
  • Git

各画面の説明

ダッシュボード

01.png

この画面の作成が一番時間をとられました。

上部に1週間のグラフ、下部に日毎の入力したデータが表示されます。

また右上のボタンによって、1週間のグラフを総合計のグラフに切り替えることでカテゴリーごとの合計時間を知ることができます。

勉強している日、してない日がすぐわかるので結構気に入ってます。

カテゴリ―毎の詳細

02.png

ダッシュボードの左側のカテゴリー一覧からカテゴリ―を選択すると画像のような画面が開きます。

今まで入力したコメントが一覧表示されるので、どんなことを勉強してきたのか一目瞭然です。

カテゴリ―詳細ページは他のユーザーが覗くこともできます。

知らない語句や勉強の順序、気になるエンジニアがどんなことを学んでいるのかを知ることができます。

ホーム

02.png

各ユーザーの投稿が一覧表示されています。

とても簡易的なSNSのような感じです。

フォロー機能等は実装していませんが、他のユーザーの勉強量を知ることで、モチベーションを上げることができます。

現在会社の後輩とこのアプリを使用しているのですが、とても会話が盛り上がります。

特に相手が何を勉強しているのかがわかるので、気になったことをすぐに聞けるし、話のきっかけづくりにもなります。

感想

一応完成はしたものの、まだまだ実装したい機能が盛りだくさんです。
例えば
 フォロー機能
 、円グラフでの分析
 、カテゴリ―毎の表示順序、色の切り替え
など、他にも細かいところでまだまだたくさんあります。

他にもリファクタリングやテストコードの作成などすることは盛りだくさん。

これからも勉強を記録していくためにこのアプリを使用し、改善を続けていきます。

自分自身が毎日使用していくので、改善、メンテナンスを無理なく続けていくことができると思います。

個人開発でも作りっぱなしではなく、しっかりと運用していくので、よければ皆様も使ってみてください。

一言

コードが汚すぎる。リーダブルコード読んだはずなんだけどな~

➡Stackerはこちら

➡Twitterはこちら

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

OpenFaceを試しに触れてみる

OpenFaceとは

顔の座標点や視線推定,頭の姿勢推定,Action Unitの強度やバイナリなどを抽出する顔解析ツール.

詳しい内容はこちらの論文を参照してください.
https://www.cl.cam.ac.uk/research/rainbow/projects/openface/wacv2016.pdf

OpenFaceを試すための手順(概要)

OpenFaceを試すために,Dockerを用いたやり方について説明していきます.
※Dockerを用いなくてもできますが,環境設定がとても大変だと思います.

以下の手順で進めていきます.
※Dockerを既にインストールしている方は2から始めてもらって問題ないです.

  1. Dockerをインストール
  2. OpenFaceを試す

今回試した環境は以下の通りです.
OS: Ubuntu 18.04 LTS
CPU: i3-4130 3.40GHz
メモリ: 16GB

1. Dockerをインストール

Dockerのインストールはこちらの記事が分かりやすかったです.
https://qiita.com/myyasuda/items/cb8e076f4dba5c41afbc

Dockerをインストールして,versionが確認できたらおkです.

2. OpenFaceを試す

まず,端末を開いて以下のコードでDockerを立ち上げます.

端末1
$ docker run -it --rm algebr/openface:latest

最初にこのコードを入力すると,DockerのimageをDownloadするので少し時間がかかると思います.

次にもう1つ端末を開いてDockerのCONTAINER IDを確認します.

端末2
$ docker ps
CONTAINER ID        IMAGE                    COMMAND             CREATED             STATUS              PORTS               NAMES
f5fb6414204f        algebr/openface:latest   "/bin/bash"         11 seconds ago      Up 10 seconds                           clever_taussig

確認できたら,適当なサンプルを用意して以下のコードを実行します.
※今回はOpenFaceのsamplesにあったsample1.jpgファイルを使用しています.必要があれば適宜こちらからDownloadしてください.
https://github.com/TadasBaltrusaitis/OpenFace

端末2
$ docker cp sample1.jpg f5fb6414204f:/home/openface-build

ここで大切なのが,自身のCONTAINER IDと対応付けを行うことを意識してください.

次にDockerを立ち上げた端末に戻って,以下のコードを実行します.

端末1
$ build/bin/FaceLandmarkImg -f sample1.jpg

成功したら,「processed」というディレクトリが出来ているので,もう1つの端末に戻ってcsvやjpgファイルを自身の環境にコピーしてやります.

端末2
$ docker cp f5fb6414204f:/home/openface-build/processed/sample1.csv .
$ docker cp f5fb6414204f:/home/openface-build/processed/sample1.jpg . 

※この状態だと元々のsample1.jpgが上書きされるので,必要があれば適宜名前を変更してください.

結果はこんな感じです.
sample1.jpg
sample1-result.jpg

おまけ

先程は画像を取り上げましたが,動画でも動くようです.

端末1
$ build/bin/FaceLandmarkVidMulti -f multi_face.avi

※私が実行したときは「FaceLandmarkVid」ではうまく出来なかったので,「FaceLandmarkVidMulti」を取り上げています.1人だけでもマルチで問題なく出来たことを確認しました.

参考文献

https://qiita.com/nonbiri15/items/d9be1bd4baeaa2e8ab61
https://github.com/TadasBaltrusaitis/OpenFace/wiki#quickstart-usage-of-openface-with-docker-thanks-edgar-aroutiounian
https://github.com/TadasBaltrusaitis/OpenFace
https://qiita.com/nekkoneko/items/21784837a6434c160ebe

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker コンテナの監視ツールについて

Docker コンテナのリソース消費状況などを知りたいとき、ありますよね。今回はそれぞれのツールの立ち位置を整理がてら、記事にしていきたいと思います。

組み込みツール docker stats を使う

$ docker stats

上記のコマンドを実行すると、以下のように各コンテナのリソース消費状況を確認できます:

CONTAINER ID        NAME                 CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
4d6670c8c134        Slightly Gray        0.02%               19.15MiB / 1.733GiB   1.08%               14.7kB / 3.19kB     91.8MB / 0B         8
6d4bf5c43dac        Blue Garage          0.05%               53.67MiB / 1.733GiB   3.03%               5.03kB / 1.55kB     86.6MB / 61.4kB     8
1731729e82b1        Orange Lobby         6.78%               21.63MiB / 1.733GiB   1.22%               1.4kB / 0B          62.8MB / 0B         9

リダイレクトを利用してログファイルに出力することもできます。以下のコマンドは中止するまで stats.txt にリソース消費状況を追記し続けます(出典):

$ while true; do docker stats -a --no-stream >> stats.txt; done

用途によってはこれでも十分かもとは思いますが、いろいろと味気がない分かりづらいので何かしらの可視化ツールが欲しくなりますね。

Dockerコンテナの監視を行うサービスを使う

すぐさまZabbixなど既存の監視ツールとかを使いたくなってくるのですが、そう上手くはいきません。だいぶ古めの資料ですが……

既存の監視ツールはサーバが固定で存在することを前提としており、Immutable(Disposable) Computing環境のように生成と廃棄を繰り返す状態は想定していない。
クラスタリングのために同一サーバを廃棄後に生成した場合は監視を継続する必要があるが、コンテナの場合はIPアドレスも変わるため、どのコンテナを継続監視すべきかの判定を行う必要がある。
(中略)
Docker環境の監視も行えるSaaSの利用が、非常に有効な解決策である。

ということらしいです。既存のものをそのまま使おうとするとしんどいので SaaS にまるっと投げてしまおうという発想ですね。上記記事の中で挙げられた SaaS は以下の通りです:

  1. New Relic
  2. AppDynamics
  3. sysdig cloud
  4. DATADOG
  5. SignalFx
  6. Librato
  7. Scout Monitoring
  8. Mackerel

とはいえ SaaS に投げるコストが惜しかったり、そもそも外部に投げちゃいけなかったりする場合のほうが多いかもしれません。僕自身も利用できたことはありません。ということで、Docker コンテナの可視化に最適化されたツールをセルフホスティングしよう!という方向になってきます。

Zabbix + Zabbix Docker Monitoring を使う

Zabbix Docker Monitoring はホスト上のコンテナを自動で検出してモニタリング対象とし、Zabbix エージェントとして働いてくれるツールです。コンテナではなくホストにインストールするだけでいいので、コンテナに手を加える必要はありません。これ自身も Docker コンテナとして動かすことができます:

$ docker run \
  --name=dockbix-agent-xxl \
  --net=host \
  --privileged \
  -v /:/rootfs \
  -v /var/run:/var/run \
  --restart unless-stopped \
  -e "ZA_Server=[ZABBIX SERVER IP/DNS NAME/IP_RANGE]" \
  -e "ZA_ServerActive=[ZABBIX SERVER IP/DNS NAME]" \
  -d monitoringartist/dockbix-agent-xxl-limited:latest

基本的には Docker ホストとは別に Zabbix サーバを立てることになるので、単一ホストなどミニマルな運用をしたい場合は以後のツールが検討対象になります。

cAdvisor を使う

Dcoker ホスト上の Docker コンテナのリソース消費状況を監視してくれるツールです。Kubernetes の一部を構成しており、 Google によって開発が進められてきました。これ自身も Docker コンテナとして動かすことができます:

$ docker run \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --privileged \
  google/cadvisor:latest

Docker ホストのポート 8080 にアクセスすると cAdvisor の WebUI が表示され、リソースの消費状況を確認することができます。cAdvisor の欠点としてデータを RAM 上にしか保持しないため、データ永続化には他ツールとの併用が必要になります。

cAdvisor + InfluxDB を使う

InfluxDBは時系列DBの一種で、cAdvisor が吐いた情報を永続化できます。これ自身も Docker コンテナとして動かすことができます:

$ docker run -d -p 8086:8086 -v /var/lib/influxdb:/var/lib/influxdb influxdb

InfluxDB コンテナが起動したら、以下の要領で初期設定を行います:

$ docker exec -it influxdb bash # InfluxDB コンテナに入る
# hostname -i                   # IP アドレスを調べる
# influx                        # InfluxDB と対話
> CREATE DATABASE cadvisor      # cAdvisor 用の DB を作成

なお、DB 作成はAPI リファレンスを参考に WebAPI 経由で行うこともできます。

次に、cAdvisor コンテナにオプションを添えて起動します:

$ docker run -d \
  --volume=/var/run:/var/run:rw\
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true --privileged \
  google/cadvisor:latest \
  --log_dir=/ \
  --storage_driver=influxdb \
  --storage_driver_host=[influxDB コンテナの IP アドレス]:8086 \
  --storage_driver_user=root \
  --storage_driver_user=root \
  --storage_driver_password=root \
  --storage_driver_secure=False

InfluxDB の WebAPI を叩けば、cAdvisor が保存したリソース消費状況の履歴が確認できるはずです。

cAdvisor + InfluxDB + Grafana を使う

……が、これでは当初の目的となる可視化ができていないので、 Grafana という Kibana派生のグラフ描画ツールを利用して可視化します。これ自身も Docker コンテナとして動かすことができます:

$ docker run -d -p 3000:3000 grafana/grafana

Docker ホストのポート 3000 にアクセスすると Grafana の WebUI が表示されます。データソースとして http://[influxDB コンテナの IP アドレス]:8086 を指定すると可視化できます。

cAdvisor with InfluxDB をダッシュボードにインポートすれば、すぐにリソース監視に入ることができるでしょう。

cAdvisor + InfluxDB + Grafana を docker-compose.yml で使う

毎度 hostname -i したりするのは非現実的なので docker-compose.yml で一括成型します:

version: '2'
services:
 influxdb:
   image: influxdb
   volumes:
     - ~/influxdb:/var/lib/influxdb
   ports:
     - 8086:8086
 cadvisor:
   image: google/cadvisor:latest
   ports:
     - "8080:8080"
   volumes:
     - /var/run:/var/run:rw
     - /sys:/sys:ro
     - /var/lib/docker/:/var/lib/docker:ro
   command: --log_dir=/ --storage_driver=influxdb --storage_driver_host=influxdb:8086 --storage_driver_user=root --storage_driver_user=root --storage_driver_password=root --storage_driver_secure=False
   depends_on:
     - "influxdb"
 grafana:
   image: grafana/grafana
   ports:
     - 3000:3000

ホスト名で名前解決ができるようになっているので、Grafana のデータソース指定では http://influxdb:8086 と入力します。

cAdvisor + Prometheus + ( | Grafana | Zabbix ) を使う

Prometheus はプル型の監視ツールです。Zabbix などのプッシュ型の監視ツールは監視対象にエージェントをインストールする必要がありますが、Prometheus はこちらから監視対象にアクセスを行って各種データを取得します。

Prometheus はすぐれた監視ツールですが、UI が複雑ですので、Grafana や Zabbix に可視化をまかせる構成も考えられるでしょう。

Grafanaでの可視化を行う場合、cAdvisor と Grafana の間には InfluxDB と Prometheus のいずれを挟むべきなのでしょうか。Prometheus 公式の Comparison to alternatives のページでは以下のように述べられています:

Where InfluxDB is better:

    If you're doing event logging.
    Commercial option offers clustering for InfluxDB, which is also better for long term data storage.
    Eventually consistent view of data between replicas.

Where Prometheus is better:

    If you're primarily doing metrics.
    More powerful query language, alerting, and notification functionality.
    Higher availability and uptime for graphing and alerting.

ということなので、自分の用途に合った方を選びましょう。

ちなみに、Grafana のダッシュボードストアに掲載されているダッシュボードの数だと cAdvisor + InfluxDB より Prometheus のほうがかなり多いようです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む