- 投稿日:2019-07-30T19:00:49+09:00
Docker学習メモ
Docker学習メモ
>>> 編集中
はじめに
アプリケーションを開発していく上で、開発環境のWindowsと本番環境のLinuxで差分が出てしまうのを
解決したかったので、Dockerを実際に使ってみましたそれに伴いDockerの概要や使ってみた感想などをまとめてみました
Dockerについて
まず、Dockerとは仮想環境を提供するソフトウェアの事を指します
コンテナは隔離されたOSを持ち、その上でアプリケーションを稼働させることが出来ます
そしてアプリケーションを依存対象と共にカプセル化することが出来ますまたホストOSとリソースを共有出来ることが特徴です
Dockerの大まかな概要は下記を参照してください
Dockerのデメリット
Dockerを利用する上での利点についてです
- フレームワークやミドルウェアを自分で構築する必要がない
例えばLaravelを利用した開発を行う場合に、ホストOSにPHPをインストールしなくても
Bitnamiが提供するLaravelのイメージがDocker Hubと呼ばれるリポジトリに配布されているため
簡単に環境を構築できますまた新しいフレームワークや技術が登場しても、Docker Hubにイメージが配布されていれば、自分で環境構築をする必要はありません
- 複数の開発環境の統一できる
DockerfileにOSやパッケージのバージョンを指定することが出来るため
開発環境ではUbuntu
、RHEL
などのOSやRuby
、Nodejs
、PHP
、Go
などの言語のバージョンを統一できますまた
apt
、pip
などのパッケージマネージャで管理されていないライブラリを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
で
ターミナルはcmd
とgit 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をインストールする際に必要なgit
、unzip
をインストールしますRUN apt update && apt install -y wget git unzipRUN 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
が表示されれば成功です
- 投稿日:2019-07-30T17:43:29+09:00
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.yml
、Dockerfile
は以下を参考にしました。
Laravelの環境をDockerで構築するチュートリアルディレクトリの構成
$ tree -L 3 . ├── docker │ ├── php │ │ └── Dockerfile │ └── web │ └── default.conf ├── docker-compose.ymlDockerfileFROM 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/htmldocker-compose.ymlversion: '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.confserver { 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
を編集します。.envDB_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
と入力するのが面倒なのでエイリアスを設定しています。~/.bashrcalias dkcp='docker-compose'# sourceコマンドで設定を反映 $ source ~/.bashrc # 以下のように入力できるようになります $ dkcp up -dlaravel 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.jsconst 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 watchdocker-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.ymldocker-compose-dem.ymlversion: "3" services: app: volumes: - sync-volume:/var/www/html:nocopy # nocopy is important volumes: sync-volume: external: truedocker-sync.ymlversion: '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を変更する。参考
- 投稿日:2019-07-30T16:07:39+09:00
ローカル実行用の docker-compose.yml はバージョン 2 系で
- 投稿日:2019-07-30T13:50:58+09:00
Docker のコマンド忘れやすいため
Docker コンテナを実行する。
docker container run イメージ名:タグ名 docker container run -d -p 9000:8080 example/echo:latest
- -i :起動時に標準入力をつなげっぱなし。
- -t :疑似端末を有効にする
- --rm :終了時コンテナ破棄
- -d :バックグラウンド実行
- -v :ホストトコンテナでディレクトリ共有
- -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 的な)
- 投稿日:2019-07-30T11:16:24+09:00
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.yml
、Dockerfile
はこちらを参考にさせていただきました。作成し終わったら、以下のコマンドを実行します。# コンテナをバックグラウンドで起動 $ docker-compose up -d # 環境内に入る docker-compose exec app bash # composerコマンドでLaravelプロジェクトを作成 composer create-project --prefer-dist laravel/laravel [プロジェクト名]プロジェクト内の
.env
ファイルを以下のように編集します。.envDB_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
と入力するのが面倒なのでエイリアスを設定しています。~/.bashrcalias dkcp='docker-compose'# sourceコマンドで設定を反映 $ source ~/.bashrc # 以下のように入力できるようになります $ dkcp up -dlaravel 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.jsconst 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 watchdocker-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 -dPermission denidがブラウザに表示される場合
ブラウザを確認しながら、適宜
storage
内のパーミッションを変更する。$ chmod 777 hogehogefile not foundとブラウザに表示される場合
ドキュメントルートを変更すると直るかもしれません。
nginxの設定ファイルのdefault.conf
内にあるrootを変更する。参考
- 投稿日:2019-07-30T11:16:24+09:00
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.yml
、Dockerfile
はこちらを参考にさせていただきました。作成し終わったら、以下のコマンドを実行します。# コンテナをバックグラウンドで起動 $ docker-compose up -d # 環境内に入る docker-compose exec app bash # composerコマンドでLaravelプロジェクトを作成 composer create-project --prefer-dist laravel/laravel [プロジェクト名]プロジェクト内の
.env
ファイルを以下のように編集します。.envDB_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
と入力するのが面倒なのでエイリアスを設定しています。~/.bashrcalias dkcp='docker-compose'# sourceコマンドで設定を反映 $ source ~/.bashrc # 以下のように入力できるようになります $ dkcp up -dlaravel 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.jsconst 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 watchdocker-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 -dPermission denidがブラウザに表示される場合
ブラウザを確認しながら、適宜
storage
内のパーミッションを変更する。$ chmod 777 hogehogefile not foundとブラウザに表示される場合
ドキュメントルートを変更すると直るかもしれません。
nginxの設定ファイルのdefault.conf
内にあるrootを変更する。参考
- 投稿日:2019-07-30T11:16:24+09:00
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.yml
、Dockerfile
は以下を参考にしました。
Laravelの環境をDockerで構築するチュートリアルディレクトリの構成
$ tree -L 3 . ├── docker │ ├── php │ │ └── Dockerfile │ └── web │ └── default.conf ├── docker-compose.ymlDockerfileFROM 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/htmldocker-compose.ymlversion: '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.confserver { 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
を編集します。.envDB_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
と入力するのが面倒なのでエイリアスを設定しています。~/.bashrcalias dkcp='docker-compose'# sourceコマンドで設定を反映 $ source ~/.bashrc # 以下のように入力できるようになります $ dkcp up -dlaravel 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.jsconst 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 watchdocker-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.ymldocker-compose-dem.ymlversion: "3" services: app: volumes: - sync-volume:/var/www/html:nocopy # nocopy is important volumes: sync-volume: external: truedocker-sync.ymlversion: '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を変更する。参考
- 投稿日:2019-07-30T08:05:56+09:00
自分の勉強記録を分析しよう!~新米エンジニアの個人開発~
自分の勉強記録を分析しよう!~新米エンジニアの個人開発~
プログラマー歴1年目のじょーだいです。
プログラマーになって一年、そろそろ新しいことを学んでみたかったので、使ったことのない技術を使用して簡単なwebアプリケーションを開発してみました。
どんなアプリ?
僕は勉強したことをTwitterでつぶやいています。
他にも多くの方々が自分の勉強したことをつぶやいているのをよく見かけます。
せっかく勉強しているならその記録をしっかり残したい。。。
そこで今回は自分の勉強を記録しておくことのできる「Stacker」というアプリを開発しました。
使用している技術は?
- Laravel
- Vue.js
- Chart.js
- MySQL
- Docker
- XSERVER
- Git
各画面の説明
ダッシュボード
この画面の作成が一番時間をとられました。
上部に1週間のグラフ、下部に日毎の入力したデータが表示されます。
また右上のボタンによって、1週間のグラフを総合計のグラフに切り替えることでカテゴリーごとの合計時間を知ることができます。
勉強している日、してない日がすぐわかるので結構気に入ってます。
カテゴリ―毎の詳細
ダッシュボードの左側のカテゴリー一覧からカテゴリ―を選択すると画像のような画面が開きます。
今まで入力したコメントが一覧表示されるので、どんなことを勉強してきたのか一目瞭然です。
カテゴリ―詳細ページは他のユーザーが覗くこともできます。
知らない語句や勉強の順序、気になるエンジニアがどんなことを学んでいるのかを知ることができます。
ホーム
各ユーザーの投稿が一覧表示されています。
とても簡易的なSNSのような感じです。
フォロー機能等は実装していませんが、他のユーザーの勉強量を知ることで、モチベーションを上げることができます。
現在会社の後輩とこのアプリを使用しているのですが、とても会話が盛り上がります。
特に相手が何を勉強しているのかがわかるので、気になったことをすぐに聞けるし、話のきっかけづくりにもなります。
感想
一応完成はしたものの、まだまだ実装したい機能が盛りだくさんです。
例えば
フォロー機能
、円グラフでの分析
、カテゴリ―毎の表示順序、色の切り替え
など、他にも細かいところでまだまだたくさんあります。他にもリファクタリングやテストコードの作成などすることは盛りだくさん。
これからも勉強を記録していくためにこのアプリを使用し、改善を続けていきます。
自分自身が毎日使用していくので、改善、メンテナンスを無理なく続けていくことができると思います。
個人開発でも作りっぱなしではなく、しっかりと運用していくので、よければ皆様も使ってみてください。
一言
コードが汚すぎる。リーダブルコード読んだはずなんだけどな~
- 投稿日:2019-07-30T01:31:13+09:00
OpenFaceを試しに触れてみる
OpenFaceとは
顔の座標点や視線推定,頭の姿勢推定,Action Unitの強度やバイナリなどを抽出する顔解析ツール.
詳しい内容はこちらの論文を参照してください.
https://www.cl.cam.ac.uk/research/rainbow/projects/openface/wacv2016.pdfOpenFaceを試すための手順(概要)
OpenFaceを試すために,Dockerを用いたやり方について説明していきます.
※Dockerを用いなくてもできますが,環境設定がとても大変だと思います.以下の手順で進めていきます.
※Dockerを既にインストールしている方は2から始めてもらって問題ないです.
- Dockerをインストール
- OpenFaceを試す
今回試した環境は以下の通りです.
OS: Ubuntu 18.04 LTS
CPU: i3-4130 3.40GHz
メモリ: 16GB1. Dockerをインストール
Dockerのインストールはこちらの記事が分かりやすかったです.
https://qiita.com/myyasuda/items/cb8e076f4dba5c41afbcDockerをインストールして,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が上書きされるので,必要があれば適宜名前を変更してください.
おまけ
先程は画像を取り上げましたが,動画でも動くようです.
端末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
- 投稿日:2019-07-30T00:24:57+09:00
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 は以下の通りです:
とはいえ 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:latestDocker ホストのポート 8080 にアクセスすると cAdvisor の WebUI が表示され、リソースの消費状況を確認することができます。cAdvisor の欠点としてデータを RAM 上にしか保持しないため、データ永続化には他ツールとの併用が必要になります。
cAdvisor + InfluxDB を使う
InfluxDBは時系列DBの一種で、cAdvisor が吐いた情報を永続化できます。これ自身も Docker コンテナとして動かすことができます:
$ docker run -d -p 8086:8086 -v /var/lib/influxdb:/var/lib/influxdb influxdbInfluxDB コンテナが起動したら、以下の要領で初期設定を行います:
$ 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=FalseInfluxDB の WebAPI を叩けば、cAdvisor が保存したリソース消費状況の履歴が確認できるはずです。
cAdvisor + InfluxDB + Grafana を使う
……が、これでは当初の目的となる可視化ができていないので、 Grafana という Kibana派生のグラフ描画ツールを利用して可視化します。これ自身も Docker コンテナとして動かすことができます:
$ docker run -d -p 3000:3000 grafana/grafanaDocker ホストのポート 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 のほうがかなり多いようです。