- 投稿日:2020-01-20T23:27:00+09:00
docker
起動時のファイル共有がうまくいったのでメモ
$ docker run -itd --name nuxt4 -v ~/work/:/work -p 80:80 nuxt-image参考
https://qiita.com/y_kawase/items/1de690b40553ef76acb3
https://www.bravesoft.co.jp/blog/archives/3942
https://qiita.com/momoto/items/1992d68de8baa7e29bb5
https://qiita.com/nimusukeroku/items/72bc48a8569a954c7aa2
http://kouji1981.hatenablog.com/entry/2014/09/22/%E3%80%90Docker%E3%80%91_%E3%83%9B%E3%82%B9%E3%83%88%E3%81%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%85%B1%E6%9C%89%E3%81%99%E3%82%8B
- 投稿日:2020-01-20T22:30:18+09:00
Dockerを使ってRuby2.7&Rails6を構築
はじめに
2020/01/20時点での最新安定版のrails開発環境の構築の記事がなかったので。
【Imagemagick対応】Dockerを利用して、Rails環境を作成
基本上記の記事のままです。
ただ、上記の記事はRuby2.6&Rails5.2.2で、そのままバージョンを書き換えるだけではうまく動作しなかったので、動作できるようにしたインストール資材を記載しておきます。
参考までに上記記事からの変更点も記載しておきます。コンテナ立ち上げ以降は参考記事の手順のまま実施できます。
インストール資材
Dockerfile
DockerfileFROM ruby:2.7 ENV RUNTIME_PACKAGES="linux-headers libxml2-dev libxslt-dev make gcc libc-dev nodejs tzdata postgresql-dev postgresql" \ DEV_PACKAGES="build-base curl-dev" \ HOME="/myapp" WORKDIR $HOME # Counter Measure to Error:"Autoprefixer doesn’t support Node v4.8.2. Update it" RUN curl -sL https://deb.nodesource.com/setup_10.x | bash - \ && apt-get install -y nodejs # yarnパッケージ管理ツールインストール RUN apt-get update && apt-get install -y curl apt-transport-https wget && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \ apt-get update && apt-get install -y yarn RUN apt-get update && \ apt-get install -y default-mysql-client \ postgresql-client \ sqlite3 \ --no-install-recommends && \ rm -rf /var/lib/apt/lists/* ADD Gemfile $HOME/Gemfile ADD Gemfile.lock $HOME/Gemfile.lock RUN bundle install ADD ./ $HOME COPY ./ $HOME CMD ["rails", "server", "-b", "0.0.0.0"]変更点①:ruby2.6⇒2.7
変更点②:mysql-client⇒default-mysql-client
mysql-client
はインストールできなくなっていたので、代わりにdefault-mysql-client
をインストールします。
mysql-client
がインストールできない理由は以下の記事が参考になります。Circle CI で mysql-client が apt-get install できなくなってCI環境が壊れた話
変更点③:yarnを追加でインストール
エラーメッセージは控えていませんでしたが、参考記事のままインストールしようとしたら
yarn
がないと怒られました。そのため、# yarnパッケージ管理ツールインストール
のところでインストールしています。docker-compose.yml
docker-compose.ymlversion: '3' services: db: container_name: db image: postgres:latest environment: POSTGRES_USER: root POSTGRES_PASSWORD: password POSTGRES_INITDB_ARGS: "--encoding=UTF-8" web: container_name: app build: . command: bundle exec rails s -p 3000 -b '0.0.0.0' volumes: - .:/myapp ports: - "3000:3000" depends_on: - db変更点①:passwordありユーザーの設定
セキュリティ的にpasswordありユーザーがほしかったので、
environment
のところでrootユーザにpasswordを付与しています。Gemfile
Gemfilesource 'https://rubygems.org' gem 'rails', '~> 6.0.2', '>= 6.0.2.1'Imagemagickは使用しないのでGemfileから削除しています。
Gemfile.lock
Gemfile.lockこちらは空のまま。
- 投稿日:2020-01-20T21:33:55+09:00
【初学者向け】セキュリティ対策入門②〜SQLインジェクション編〜
前提
確認環境
以下と同様です。
【初学者向け】セキュリティ対策入門⓪〜環境構築編〜本シリーズの目的
以下と同様です。
【初学者向け】セキュリティ対策入門⓪〜環境構築編〜本記事の目標
SQLインジェクションの概要、原因、対策について理解することです。
本記事を読み進める上での必要事項
以下の内容を終えていることです。
【初学者向け】セキュリティ対策入門⓪〜環境構築編〜また、DB及びテーブルの作成ができることと、プログラミング言語を用いてDBにアクセスする処理の流れをおおまかに理解していることです。
概要
SQLインジェクションとは
不正にSQL文を実行させることです。エンドユーザが入力した内容を元にSQLを実行するようなWebアプリケーション全般で行われる可能性があります。
これだけだとわかりにくいと思いますので実際に見てみましょう。
実際に体験してみよう
リポジトリ更新
【初学者向け】セキュリティ対策入門⓪〜環境構築編〜投稿時から本記事投稿の間にリポジトリを更新しているので、以下コマンドを参考にローカルリポジトリを更新しておいてください。
cd tutorial-php-security git pull origin masterまた、
docker-compose.yml
も更新されているのでDockerコンテナ起動時は以下のように--build
を付与して起動を行ってください。docker-compose up -d --buildDB準備
今回はDBを使うので、そのあたりの準備を行っていきます。
にアクセスしてログインしましょう。
そして
test
という名前のDBを作りましょう。次に以下のような
user
テーブルを作成しましょう。ブラウザアクセス
http://localhost:8080/sql_injection/bad.php?name=j&address=kanagawa
にアクセスしてみましょう。『データが作成されました。』と表示されたら成功です。
phpMyAdminを見てみるとレコードが1件追加されていることが確認できると思います。ソースコードは
tutorial-php-security/www/html/sql_injection/bad.php
にあります。tutorial-php-security/www/html/sql_injection/bad.php<?php // 略 $name = ($_GET['name']) ? $_GET['name'] : ''; $address = ($_GET['address']) ? $_GET['address'] : ''; // 略でクエリストリングスを取得し、その値を使って
tutorial-php-security/www/html/sql_injection/bad.php<?php // 略 try { $db = getDb(); $stmt = $db->prepare("INSERT INTO user(name, address) VALUES('{$name}', '{$address}')"); $stmt->execute(); echo 'データが作成されました。'; } catch(PDOException $e) { echo $e->getMessage(); }
user
テーブルにレコードを挿入する処理が記載されています。では次に
http://localhost:8080/sql_injection/bad.php?name=namebadtest&address=');DELETE FROM user;--
にアクセスしてみましょう。phpMyAdminを見てみるとレコードが削除されてしまっていることが確認できると思います。
何が起きているか確認するために上記パラメータで生成されるSQL文を解説します。
INSERT INTO user(name, address) VALUES('namebadtest', '');DELETE FROM user;--')
というSQL文が作られます。わかりやすいように改行も入れます。INSERT INTO user(name, address) VALUES('namebadtest', ''); DELETE FROM user; --')ここまで整理すれば
user
テーブルのレコードが削除されてしまった理由がわかると思います。DELETE文が実行されてしまっているわけです。SQLインジェクションの恐ろしさが伝わりましたでしょうか?
user
テーブルが、とあるWebサービスの会員情報を保持しているものだとしたら会員情報が全て消えてしまいます。大きなサービスでこんなことが起きれば新聞に載ります。原因
SQLエスケープをしていないことです。原因がシンプルですね。なので、対策もシンプルです。
対策
SQLエスケープを行うことです。
具体的に確認していきましょう。
http://localhost:8080/sql_injection/good.php?name=namebadtest&address=');DELETE FROM user;--
にアクセスしてみましょう。今度はレコードが挿入されたことが確認できたと思います。
address
カラムには');DELETE FROM user;--
という文字列が入っています。つまり、DELETE文が実行されていないわけです。
good.php
ではある処理を追加しています。それを次に確認しましょう。tutorial-php-security/www/html/sql_injection/good.php<?php // 略 try { $db = getDb(); $stmt = $db->prepare('INSERT INTO user(name, address) VALUES(:name, :address)'); $stmt->bindValue(':name', $name); $stmt->bindValue(':address', $address); $stmt->execute(); echo 'データが作成されました。'; } catch(PDOException $e) { echo $e->getMessage(); }DB接続について学習されている方にとっては見慣れた処理の流れになっているかと思いますが、
bindValue
メソッドを使っています。こうすることでSQLエスケープを行うことができます。具体的に先ほどの例で実行されるSQLを確認します。以下のようなSQL文が構築されます。INSERT INTO user(name, address) VALUES('namebadtest', ''');DELETE FROM user;--')わかりやすいように改行を入れます。
INSERT INTO user(name, address) VALUES('namebadtest', ' '');DELETE FROM user;-- ')2行目の
'
が''
になっているのがポイントです。SQLエスケープを行うことで実現される具体例な処理がこれです。''
は単なる'
という文字だと見なされ、SQL文の中で特別な意味を持って使われる'
とは別ものと見なされます。こういったことが内部で行われているため、
');DELETE FROM user;--
という単なる文字列としてaddress
カラムに挿入されたというわけです。参考文献
今回の内容は以上です。最後までご覧いただきありがとうございました。
- 投稿日:2020-01-20T20:54:40+09:00
Docker MySQLのバージョン変更する方法
はじめに
Docker MySQLのバージョンを 8.0 から 5.7 に下げる際に苦戦したので、一連の流れをまとめました。
Laradockを用いてDocker上でLaravelを動かす環境を作成しました。
MySQLバージョンを変更する一連の流れ
laradockにあるファイルのMySQLのバージョンを 5.7 に変更します。
.env### MYSQL ################################################# MYSQL_VERSION=5.7コンテナを停止し、status が exited になっているのを確認。
mysqlのコンテナを削除。$ docker-compose stop $ docker ps -a $ docker rm コンテナID(mysql)MYSQLのバージョンを変更する場合は、 DATA_PATH_HOST で設定したフォルダを削除して、イメージを作成し直す必要があるらしい。
そのフォルダは下記コマンドで参照出来る。$ cat .env | grep DATA_PATH_HOST DATA_PATH_HOST=~/.laradock-アプリ名/data (人によってバラバラ。)そのフォルダを削除。
$ rm -rf ~/.laradock-アプリ名/data次にイメージを削除するのだが、
「dataが削除されますがよろしいですか?」 的な確認文が恐らく出てくるので良ければ y で enter。$ docker images $ docker rmi イメージID(laradock_mysql) -fキャッシュを消し再度ビルド。
$ docker-compose build --no-cache mysql最後に status が up になっているか。
なっていれば mysql のバージョンを確認し 5.7系になっていればOK。$ docker ps -a $ docker-composer exec mysql mysql --version以上で、動くはずです。
Dockerを勉強し始めたばかりで、説明が大雑把なので
わかりにくい箇所や、疑問点など。
また、勉強する上で参考になったサイトや技術書など教えていただけると幸いです。
- 投稿日:2020-01-20T19:46:35+09:00
Laravelの開発環境3つとそれぞれのメリット、デメリット
PHPのWebアプリケーションフレームワークであるLaravelを学習しようと思って調べた際の開発環境について記載します。
ローカル環境はMacOSを想定しています。Laravel開発環境
Laradock
Laradockは、Laravelの開発環境をDocker Containerに閉じ込めた開発環境です。
公式: https://laradock.io/メリット
Dockerなので、後に記載する仮想マシンとは違い実行時のオーバーヘッドが小さくなりマシンリソースを省力化出来パフォーマンスが良いです。
また、Docker上に全てを配置するためローカル環境を汚さずにクリーンに保てます。デメリット
Dockerの扱いをある程度は把握していないと、おかしくなった開発環境を破棄して再構築するなどの操作が出来なくて困ると思いますので、Dockerの予習が必要な点に注意しましょう。
Homestead
Homesteadは、Laravelの開発環境をVagrant BOXとして配布されている開発環境です。
公式: https://laravel.com/docs/6.x/homesteadメリット
VirtualBox等の仮想マシンとして開発環境を構築するものの為、従来からある仮想化に慣れているならすぐにとっつきやすい面があるかなと思います。
Laradockと同じく仮想マシン上に全てを配置するためローカル環境を汚さずにクリーンに保てます。デメリット
Vagrantの扱いをある程度は把握していないと、Laradockと同じく制御に困ることになると思います。
また、Laradockと違い仮想化するソリューションである為、仮想化によるオーバーヘッドが発生する為パフォーマンスは若干悪い事もデメリットかなと思います。Valet
Valetは、Laravelの開発環境をローカル環境であるMacへhomebrewを用いて直接インストールする開発環境です。
メリット
Homesteadのように仮想化しないためオーバーヘッドが小さくなりパフォーマンスが良いです。
homebrewのみが分かれば良いので、敷居は比較的低いかと思います。デメリット
ローカルに直接インストールするため、ローカル環境が汚れます。
LaradockやVagrantのように、環境を壊してしまった場合は環境を破棄して再構築ということが簡単には出来ず、丁寧にエラーを修正したり場合によっては再インストールが必要になります。まとめ
どの方法も一長一短ありますが、個人的にはValetは避けたいかなと思いました。
やはりローカル環境が汚れてしまうのはよろしくないかなと思っています。
LaradockとHomesteadは優れたソリューションだと思いますが、Laravelの開発環境構築は理解しておりその後の開発そのものを学習したい場合に良いソリューションだと判断しました。
私自身に関してで恐縮ですが、Laravelの開発環境構築そのもののプロセスから学びたいという気持ちがあり、ここをショートカットしたくはなかったので、上記ソリューションを調べつつも結局はどれも採用せず、Vagrant経由でUbuntuをVirtualBoxにインストールし、地道に開発環境を仮想マシン上に手作業で構築する方法で落ち着きました。
- 投稿日:2020-01-20T18:37:29+09:00
Laradockを使ってLaravel環境を試した
はじめに
今更感満載ですが、 流行りの
Laravel
をLaradock
を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)mLaradockとは?
こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。前提
下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。
- Docker
参考記事: DockerをMacにインストールする- git
参考記事: 購入直後のMacでGitコマンドを使えるようになるまでLaradockのインストール
プロジェクト用ディレクトリ作成
まずは下記コマンドで、プロジェクト用のディレクトリを作成します。
% mkdir ~/workspace/laravel_sample % cd ~/workspace/laravel_samplegithubからのclone
下記コマンドで、githubから
Laradock
をダウンロードします。% git clone https://github.com/Laradock/laradock.git Cloning into 'laradock'... remote: Enumerating objects: 10007, done. remote: Total 10007 (delta 0), reused 0 (delta 0), pack-reused 10007 Receiving objects: 100% (10007/10007), 8.99 MiB | 3.30 MiB/s, done. Resolving deltas: 100% (5432/5432), done..envファイルの修正
クローンした
Laradock
ディレクトリ内にある、env-example
をコピーして 設定定義用の.env
を作成します。% cd laradock % cp env-example .env % ls -l .env -rw-r--r-- 1 member group 27511 1 20 17:35 .envその後、
.env
ファイルに、下記を追加します。DB_HOST=mysql REDIS_HOST=redis QUEUE_HOST=beanstalkddockerコンテナの実行
これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例ではnginx
mysql
redis
を実行しています。
サポートされているミドルウェアについては、 公式ページ をご確認ください。docker-compose up -d nginx mysql redis workspace
dockerコンテナの起動確認
下記コマンドでコンテナが起動していることを確認します。
% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 359efff2066b laradock_nginx "/bin/bash /opt/star…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp laradock_nginx_1 e920c68c0061 laradock_php-fpm "docker-php-entrypoi…" 2 minutes ago Up 2 minutes 9000/tcp laradock_php-fpm_1 192ebe58ccea laradock_workspace "/sbin/my_init" 2 minutes ago Up 2 minutes 0.0.0.0:2222->22/tcp laradock_workspace_1 84fbc83b3730 docker:dind "dockerd-entrypoint.…" 2 minutes ago Up 2 minutes 2375-2376/tcp laradock_docker-in-docker_1 28c432f44127 laradock_mysql "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp laradock_mysql_1 1722ae0554b7 laradock_redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:6379->6379/tcp laradock_redis_1このまま
http://localhost
にアクセスすると、nginxの404ページが表示されると思います。Laravelプロジェクトの作成
まずは下記コマンドを実行し、
laradock_workspace
のイメージから作られたコンテナの中に入ります。docker exec -it laradock_workspace_1 bash root@192ebe58ccea:/var/www#プロジェクト作成
下記コマンドで
Laravel
プロジェクトを実際に作成します。composer create-project laravel/laravel laravel_sample権限変更
webサーバーから書き込みを許可するために、権限を変更する必要があるため、
下記コマンドをstorage
bootstrap/cache
に対して実行します。cd laravel_sample chmod 766 storage chmod 766 bootstrap/cachenginxのドキュメントルートの設定
このままだと
nginx
が別のディレクトリを参照しているため、
laradockディレクトリ内のdefault.conf
を修正して、ドキュメントルートを設定します。vim /var/www/laradock/nginx/sites/default.conf13行目あたりにある、
root
の部分を、
laravel
プロジェクトのpublic
ディレクトリに修正します。12 server_name localhost; 13 root /var/www/laravel_sample/public; # この部分を修正。laravel_sampleはプロジェクト名。 14 index index.php index.html index.htm;ここまで全て完了したら、dockerコンテナから出ます。
root@192ebe58ccea:/var/www# exit exit
設定の反映
設定を反映するために、下記コマンドを実行し、コンテナの再起動を行います。
(コンテナIDはlaradock_nginx
のものを指定します。)docker restart 359efff2066b起動確認
ブラウザから
http://localhost
にアクセスし、下記画面が表示されることを確認します。
これでLaravelが立ち上がりました!簡単!
まとめ
Laradock
を使用すると、Laravel
の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。今回の記事では触れませんでしたが、
ホストのLaravel
プロジェクトとDocker
内のLaravel
プロジェクトをマウントすることで、
ホスト側を修正するとLaravel
プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする
Docker
便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!
- 投稿日:2020-01-20T18:37:29+09:00
Laradockを使ってLaravel環境を構築した
はじめに
今更感満載ですが、 流行りの
Laravel
をLaradock
を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)mLaradockとは?
こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。前提
下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。
- Docker
参考記事: DockerをMacにインストールする- git
参考記事: 購入直後のMacでGitコマンドを使えるようになるまでLaradockのインストール
プロジェクト用ディレクトリ作成
まずは下記コマンドで、プロジェクト用のディレクトリを作成します。
% mkdir ~/workspace/laravel_sample % cd ~/workspace/laravel_samplegithubからのclone
下記コマンドで、githubから
Laradock
をダウンロードします。% git clone https://github.com/Laradock/laradock.git Cloning into 'laradock'... remote: Enumerating objects: 10007, done. remote: Total 10007 (delta 0), reused 0 (delta 0), pack-reused 10007 Receiving objects: 100% (10007/10007), 8.99 MiB | 3.30 MiB/s, done. Resolving deltas: 100% (5432/5432), done..envファイルの修正
クローンした
Laradock
ディレクトリ内にある、env-example
をコピーして 設定定義用の.env
を作成します。% cd laradock % cp env-example .env % ls -l .env -rw-r--r-- 1 member group 27511 1 20 17:35 .envその後、
.env
ファイルに、下記を追加します。DB_HOST=mysql REDIS_HOST=redis QUEUE_HOST=beanstalkddockerコンテナの実行
これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例ではnginx
mysql
redis
を実行しています。
サポートされているミドルウェアについては、 公式ページ をご確認ください。docker-compose up -d nginx mysql redis workspace
dockerコンテナの起動確認
下記コマンドでコンテナが起動していることを確認します。
% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 359efff2066b laradock_nginx "/bin/bash /opt/star…" 2 minutes ago Up 2 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp laradock_nginx_1 e920c68c0061 laradock_php-fpm "docker-php-entrypoi…" 2 minutes ago Up 2 minutes 9000/tcp laradock_php-fpm_1 192ebe58ccea laradock_workspace "/sbin/my_init" 2 minutes ago Up 2 minutes 0.0.0.0:2222->22/tcp laradock_workspace_1 84fbc83b3730 docker:dind "dockerd-entrypoint.…" 2 minutes ago Up 2 minutes 2375-2376/tcp laradock_docker-in-docker_1 28c432f44127 laradock_mysql "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp laradock_mysql_1 1722ae0554b7 laradock_redis "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:6379->6379/tcp laradock_redis_1このまま
http://localhost
にアクセスすると、nginxの404ページが表示されると思います。Laravelプロジェクトの作成
まずは下記コマンドを実行し、
laradock_workspace
のイメージから作られたコンテナの中に入ります。docker exec -it laradock_workspace_1 bash root@192ebe58ccea:/var/www#プロジェクト作成
下記コマンドで
Laravel
プロジェクトを実際に作成します。composer create-project laravel/laravel laravel_sample権限変更
webサーバーから書き込みを許可するために、権限を変更する必要があるため、
下記コマンドをstorage
bootstrap/cache
に対して実行します。cd laravel_sample chmod 766 storage chmod 766 bootstrap/cachenginxのドキュメントルートの設定
このままだと
nginx
が別のディレクトリを参照しているため、
laradockディレクトリ内のdefault.conf
を修正して、ドキュメントルートを設定します。vim /var/www/laradock/nginx/sites/default.conf13行目あたりにある、
root
の部分を、
laravel
プロジェクトのpublic
ディレクトリに修正します。12 server_name localhost; 13 root /var/www/laravel_sample/public; # この部分を修正。laravel_sampleはプロジェクト名。 14 index index.php index.html index.htm;ここまで全て完了したら、dockerコンテナから出ます。
root@192ebe58ccea:/var/www# exit exit
設定の反映
設定を反映するために、下記コマンドを実行し、コンテナの再起動を行います。
(コンテナIDはlaradock_nginx
のものを指定します。)docker restart 359efff2066b起動確認
ブラウザから
http://localhost
にアクセスし、下記画面が表示されることを確認します。
これでLaravelが立ち上がりました!簡単!
まとめ
Laradock
を使用すると、Laravel
の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。今回の記事では触れませんでしたが、
ホストのLaravel
プロジェクトとDocker
内のLaravel
プロジェクトをマウントすることで、
ホスト側を修正するとLaravel
プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする
Docker
便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!共に働くWebエンジニアを募集しています!
不動産SHOPナカジツでは自社サービスを作っていく仲間を募集しています。
詳しくはWantedlyからお問い合わせください。
お待ちしております!
- 投稿日:2020-01-20T17:32:17+09:00
FIWARE Orion を Raspberry Pi 4 で動かしてみた
準備
Raspberry Pi 4 (4GB) に Ubuntu 19.10 (64Bit), Docker Engine, Docker Compose をインストールする。
起動
以下の docker-compose.yaml を作成して、
docker-compose up -d
で起動する。version: "3" services: orion: image: fisuda/orion:2.3.0 ports: - "1026:1026" depends_on: - mongo command: -dbhost mongo mongo: image: mongo:3.6 command: --nojournal確認
curl localhost:1026/version
で Orion のバージョンを取得して、起動したことを確認する。$ uname -a Linux raspberrypi4 5.3.0-1015-raspi2 #17-Ubuntu SMP Thu Dec 5 04:58:47 UTC 2019 aarch64 aarch64 aarch64 GNU/Linux $ curl localhost:1026/version { "orion" : { "version" : "2.3.0", "uptime" : "0 d, 0 h, 6 m, 13 s", "git_hash" : "764f44bff1e73f819d4e0ac52e878272c375d322", "compile_time" : "Sun Jan 19 04:41:20 UTC 2020", "compiled_by" : "root", "compiled_in" : "c6d3814adf4c", "release_date" : "Sun Jan 19 04:41:20 UTC 2020", "doc" : "https://fiware-orion.rtfd.io/en/2.3.0/" } }参考情報
- 投稿日:2020-01-20T15:11:32+09:00
GitBucketをMysql8で立ち上げるdocker-composeファイル
GitBucketを立てる
とりあえずバージョン管理をしたいのでGitBucketを立ち上げます。
オープンソースのgitサーバにGitLabというのもありますが
鬼のようにスペックを要求されるのでGitBucketさんを立ち上げます。セキュリティ意識は低いスクリプトなので間違っても外部サイト向けに公開ではしないでください。
献立
Docker for Windows 1くっじらー
GitBucket4 1バケツ
MySQL8 1人手順1
フォルダ作って以下をコピペ
作る際にいきなり-dをつけるのではなく火加減を見る為に
docker-compouse up
でログを表示させるといいコックになれます。docker-compouse.ymlversion: '3.1' services: gitbucket-db: image: mysql:8.0.16 restart: always command: --default-authentication-plugin=mysql_native_password ports: - "3306:3306" volumes: - ./mysql_init:/docker-entrypoint-initdb.d - ./mysql_data:/var/lib/mysql environment: TZ: Asia/Tokyo MYSQL_ROOT_PASSWORD: qawsedrftgyhujikolp MYSQL_DATABASE: gitbucket MYSQL_USER: gitbucket MYSQL_PASSWORD: 1q2w3e4r5t6y7u8i9 gitbucket: image: gitbucket/gitbucket:4 restart: always ports: - 3000:3000 - 8080:8080 - 29418:29418 environment: TZ: Asia/Tokyo volumes: - ./gitbucket-data:/gitbucket depends_on: - gitbucket-db手順2
立ち上がったらおもむろにWebでアクセスする
URL localhost:8080ログイン
ID root
Pass root手順3
デフォルトDBのH2からMySQLのSettingを修正する
参考図 Web上の表示
書き換える場所
立ち上がったらdocker-compouse.ymlが存在する場所にgitbucket-dataあるので移動する。
database.confを書き換える(参考 https://takezoe.hatenablog.com/entry/2016/07/16/025154)
TODO 下書き気分で投稿したら上げてた模様。
立ち上がり次第記載予定database.confdb { url = "jdbc:mysql://localhost/gitbucket?useUnicode=true&characterEncoding=utf8" user = "gitbucket" password = "1q2w3e4r5t6y7u8i9" # connectionTimeout = 30000 # idleTimeout = 600000 # maxLifetime = 1800000 # minimumIdle = 10 # maximumPoolSize = 10 }余談
Windowsでも永続化が簡単なのでMySQLを使っている。
このままでいいとは思っていないが、簡単だから使ってしまう。
オラクルの有料化警戒を強めます。
- 投稿日:2020-01-20T15:03:33+09:00
Makefileで長いコマンドをシンプルに
なぜMakefile?
長いコマンドを打ちたくない。
Docker使うときのマイグレーションとか、Seedとかは基本コマンド長すぎるから面倒です。
そんなときにこのMakefileが役立ちます。Makefile
書き方
<変数宣言> <タスク名>: <実行したいshell> <タスク名>:<必要ファイル名> <実行したいshell>下記記事より引用
2016年だけどMakefileを使ってみる - Qiita完成したサンプルMakefile
DC = docker-compose DE = docker exec -it MYSQL = mysql -u root -phogehoge GO_CONTAINER = go_container DB_CONTAINER = db_container # コンテナ操作基本コマンド build: @$(DC) build up: @$(DC) up -d stop: @$(DC) stop re: @$(DC) stop @$(DC) start # マイグレーション、Seedデータ投入 create/dev_db: @$(DE) $(GO_CONTAINER) sql-migrate up --env=docker @$(DE) $(DB_CONTAINER) $(MYSQL) test_db -e"$$(cat db/seed/seed.sql);"使い方
例えば上記の例でいうと、
make build
でdocker-compose build
のコマンドを実行していることになります。
make create/dev_db
を実行すると、マイグレーション、初期のSeedデータが投入されるようになります。@って?
上記Makefileを見ると、
@$(DC) build
のような書き方になっています。
このコマンドのなかの@
g¥が意味するところは、実行する際にシェルを出力するか、しないかの違いだけです。
ローカル環境で使用する場合は、基本的に必要ないと思うので、@
をつけています。実行すると実行するシェルが出力されてしまうので、鬱陶しい場合は@を先頭につける。
2016年だけどMakefileを使ってみる - Qiitaタブ
Makefileは、スペースではなく、タブで管理する必要があります。
VSCodeを使用「している場合は、下記を参考に一気に変換しちゃいましょう。
VS Code でタブをスペースに変換する手順とショートカット - Qiita起こるエラー
[make] missing separator エラー
Makefileでmake時に 「*** missing separator. Stop.」 と出たときの対処法参考記事
DockerのMakefile(2) ライブラリ
Makefileを使ってスマート?にDocker+Railsの開発をしようとした
Dockerの操作をMakefileで楽にする
2016年だけどMakefileを使ってみる - Qiita
- 投稿日:2020-01-20T11:48:05+09:00
Dockerコンテナ環境のMySQLデータベースがSequelProに反映されない
結論
・コンテナのMySQLのホストなどががローカル環境のMySQLと同じだった。
→SequelProにログインする際にローカルのMySQLがSequelProに反映されていたので
コンテナのMySQLデータベースが反映されなかった。なぜそうなったか
・ローカルのMySQLを自動起動に設定していたから。
対策
①以下の記事を参考に自動起動を停止
MySQLの自動起動を無効に自動起動を設定しているサービスのリストを確認
$ brew services list Name Status User Plist redis stopped mysql stopped mysql@5.6 started username /Users/username/Library/LaunchAgents/homebrew.mxcl.mysql@5.6.plist chromedriver stopped自動起動設定を無効にする
自動起動設定を無くしたいサービスの名前(今回は、mysql@5.6)を次のコマンドの最後に設定します。$ brew services stop mysql@5.6(この部分は止めたいサービス名を入力してください) ==> Successfully stopped `mysql@5.6` (label: homebrew.mxcl.mysql@5.6)きちんとできたか確認
$ brew services list Name Status User Plist redis stopped mysql stopped mysql@5.6 stopped chromedriver stopped②コンテナの依存を更新して再度SequelProにログイン。
、、、、success!!
- 投稿日:2020-01-20T08:55:08+09:00
Dockerとディスプレイを接続して画像を表示
はじめに
Docker上でOpenCV等のビジョン系ライブラリを使用する時は、DockerコンテナとローカルPCのディスプレイを接続する必要がありますが、この方法が分からず結構な時間を要してしまいましたので、途中で遭遇したトラブルとその解決策を含めてまとめていきたいと思います!
開発環境
Ubuntuです!詳細は下記コマンドでチェックしておきます!
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS" $ arch x86_64Dockerイメージのダウンロード
まずはDocker HubからDockerイメージをダウンロードします。Docker Hubで公開されているDockerイメージは、自由にダウンロード、保存することができます。
$ docker pull ubuntu:18.04Dockerコンテナのデプロイ
保存済みのDockerイメージを用いて、Dockerコンテナを立ち上げます。Dockerコンテナをデプロイする際、様々なオプションがあります[1][2]。
今回使用するオプションは、-it
、--privileged
、--env
、--volume
、--name
です。
まず-it
により、Dockerコンテナに対して擬似端末(pseudo terminal)を割り当てることで、Dockerコンテナ上でBashを使用できるようにします。
続いて--privileged
により、全てのデバイスに対するアクセスを許可します。
--env
では、Dockerコンテナ内で使用する環境変数を指定します。
--volume
では、ホストOSのディレクトリをゲストOSにマウントすることができます[3]。
--name
ではコンテナ名を指定することができます。$ docker run -it \ --privileged \ --env="DISPLAY=$DISPLAY" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ --volume="$HOME/ws/:/home/" \ --name="ubuntu_cv2" \ ubuntu:18.04パッケージのインストール
まずはUbuntuお決まりのアップデート、アップグレードです。
# apt-get update# apt-get upgrade続いて、エディタとしてVimをインストールしておきます。
# apt-get install vimプログラミング言語にはPythonを使用します。
# apt-get install python3.6 \ python3-dev \ python3-pip \ libffi-dev \ libssl-devpipを使用してOpenCVをインストールします。
# pip3 install opencv-python画像表示プログラムを作成
OpenCVを使用して画像を表示する基本的なプログラムを作成しておきます。
open_image.pyimport cv2 # Load an color image img = cv2.imread('test.jpg') # Show the image cv2.imshow('image',img) # Stop when 0 pressed cv2.waitKey(0) cv2.destroyAllWindows()トラブル1:OpenCVを正しくインポートできない
まずPythonを実行して、OpenCVが正しくインポートできるかテストしてみます。
# python3 >>> import cv2 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.6/dist-packages/cv2/__init__.py", line 3, in <module> from .cv2 import * ImportError: libSM.so.6: cannot open shared object file: No such file or directory案の定、エラーによりOpenCVをインポートできません。このエラーは、
libsm6
、libxext6
、libxrender-dev
のインストール[4]により解決できます。# apt-get install -y libsm6 libxext6 libxrender-devインストール後、もう一度OpenCVをインポートできるかテストしてみます。
# python3 >>> import cv2OKですね!
トラブル2:画像を表示できない
先程作成した
open_image.py
を実行してみましょう。# python3 open_image.py No protocol specified : cannot connect to X server :1PCとのディスプレイ接続に失敗しているようです。ホストPC側で、ゲストPCからのホストPCディスプレイへの接続要求を拒否していることが理由でした。別のターミナルを開けて、ホストPC側で下記コマンドを実行すると、ディスプレイへの接続を許可[5][6][7]することができます。
$ xhost + access control disabled, clients can connect from any host再度Dockerコンテナを実行していたターミナルに戻り、
open_image.py
を実行してみましょう。# python3 open_image.py X Error: BadAccess (attempt to access private resource denied) 10 Extension: 130 (MIT-SHM) Minor opcode: 1 (X_ShmAttach) Resource id: 0x247 ...別のエラーが出てきました。エラー原因を調査したところ、環境変数に
QT_X11_NO_MITSHM=1
を追加することで解決できるそうです。まずは.bashrc
ファイルをVimで開きます。# vim ~/.bashrc続いて、環境変数
QT_X11_NO_MITSHM=1
を追記します。export QT_X11_NO_MITSHM=1
.bashrc
ファイルを保存した後、環境変数の追加を反映させるため、source
コマンド[8]を実行します。# source ~/.bashrc
echo
コマンドを使用して、環境変数が正しく追加されているか確認してみましょう。# echo $QT_X11_NO_MITSHM 1OKですね!三度目の正直です。
open_image.py
を実行してみましょう!# python3 open_image.py画像が表示されました!!!
おわりに
様々なトラブルがありましたが、無事にDockerコンテナとPCディスプレイを接続して、OpenCVにより画像を表示させることができました。今回の検証より、Dockerコンテナをデプロイする際には、下記のように環境変数
QT_X11_NO_MITSHM=1
を追加しておくと良いことも分かりました。$ docker run -it \ --privileged \ --env="DISPLAY=$DISPLAY" \ --env="QT_X11_NO_MITSHM=1" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ --volume="$HOME/ws/:/home/" \ --name="ubuntu_cv2" \ ubuntu:18.04これからDockerマスターを目指して頑張っていこうと思います!
読んで頂いた方々、ありがとうございます!!!参考文献
[1] Docker run options, https://docs.docker.com/v17.12/edge/engine/reference/commandline/run/
[2] Example of docker run, https://qiita.com/tnarihi/items/275c009e9dec1306893f
[3] How to mount on docker, https://docs.docker.com/v17.09/engine/admin/volumes/bind-mounts/
[4] How to solve opencv import error, https://github.com/NVIDIA/nvidia-docker/issues/864
[5] Open X server, https://unix.stackexchange.com/questions/121716/unable-to-open-x-server
[6] Allowing computers access, https://www.stitson.com/pub/book_html/node72.html
[7] About xhost, https://wiki.archlinux.jp/index.php/Xhost
[8] Source command, https://bash.cyberciti.biz/guide/Source_command
- 投稿日:2020-01-20T08:55:08+09:00
Docker x 可視化がうまくいかずハマったのでまとめてみた!
はじめに
Docker上でOpenCV等のビジョン系ライブラリを使用する時は、DockerコンテナとローカルPCのディスプレイを接続する必要がありますが、この方法が分からず結構な時間を要してしまいましたので、途中で遭遇したトラブルとその解決策を含めてまとめていきたいと思います!
開発環境
Ubuntuです!詳細は下記コマンドでチェックしておきます!
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.3 LTS" $ arch x86_64Dockerイメージのダウンロード
まずはDocker HubからDockerイメージをダウンロードします。Docker Hubで公開されているDockerイメージは、自由にダウンロード、保存することができます。
$ docker pull ubuntu:18.04Dockerコンテナのデプロイ
保存済みのDockerイメージを用いて、Dockerコンテナを立ち上げます。Dockerコンテナをデプロイする際、様々なオプションがあります[1][2]。
今回使用するオプションは、-it
、--privileged
、--env
、--volume
、--name
です。
まず-it
により、Dockerコンテナに対して擬似端末(pseudo terminal)を割り当てることで、Dockerコンテナ上でBashを使用できるようにします。
続いて--privileged
により、全てのデバイスに対するアクセスを許可します。
--env
では、Dockerコンテナ内で使用する環境変数を指定します。
--volume
では、ホストOSのディレクトリをゲストOSにマウントすることができます[3]。
--name
ではコンテナ名を指定することができます。$ docker run -it \ --privileged \ --env="DISPLAY=$DISPLAY" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ --volume="$HOME/ws/:/home/" \ --name="ubuntu_cv2" \ ubuntu:18.04パッケージのインストール
まずはUbuntuお決まりのアップデート、アップグレードです。
# apt-get update# apt-get upgrade続いて、エディタとしてVimをインストールしておきます。
# apt-get install vimプログラミング言語にはPythonを使用します。
# apt-get install python3.6 \ python3-dev \ python3-pip \ libffi-dev \ libssl-devpipを使用してOpenCVをインストールします。
# pip3 install opencv-python画像表示プログラムを作成
OpenCVを使用して画像を表示する基本的なプログラムを作成しておきます。
open_image.pyimport cv2 # Load an color image img = cv2.imread('test.jpg') # Show the image cv2.imshow('image',img) # Stop when 0 pressed cv2.waitKey(0) cv2.destroyAllWindows()トラブル1:OpenCVを正しくインポートできない
まずPythonを実行して、OpenCVが正しくインポートできるかテストしてみます。
# python3 >>> import cv2 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python3.6/dist-packages/cv2/__init__.py", line 3, in <module> from .cv2 import * ImportError: libSM.so.6: cannot open shared object file: No such file or directory案の定、エラーによりOpenCVをインポートできません。このエラーは、
libsm6
、libxext6
、libxrender-dev
のインストール[4]により解決できます。# apt-get install -y libsm6 libxext6 libxrender-devインストール後、もう一度OpenCVをインポートできるかテストしてみます。
# python3 >>> import cv2OKですね!
トラブル2:画像を表示できない
先程作成した
open_image.py
を実行してみましょう。# python3 open_image.py No protocol specified : cannot connect to X server :1PCとのディスプレイ接続に失敗しているようです。ホストPC側で、ゲストPCからのホストPCディスプレイへの接続要求を拒否していることが理由でした。別のターミナルを開けて、ホストPC側で下記コマンドを実行すると、ディスプレイへの接続を許可[5][6][7]することができます。
$ xhost + access control disabled, clients can connect from any host再度Dockerコンテナを実行していたターミナルに戻り、
open_image.py
を実行してみましょう。# python3 open_image.py X Error: BadAccess (attempt to access private resource denied) 10 Extension: 130 (MIT-SHM) Minor opcode: 1 (X_ShmAttach) Resource id: 0x247 ...別のエラーが出てきました。エラー原因を調査したところ、環境変数に
QT_X11_NO_MITSHM=1
を追加することで解決できるそうです。まずは.bashrc
ファイルをVimで開きます。# vim ~/.bashrc続いて、環境変数
QT_X11_NO_MITSHM=1
を追記します。export QT_X11_NO_MITSHM=1
.bashrc
ファイルを保存した後、環境変数の追加を反映させるため、source
コマンド[8]を実行します。# source ~/.bashrc
echo
コマンドを使用して、環境変数が正しく追加されているか確認してみましょう。# echo $QT_X11_NO_MITSHM 1OKですね!三度目の正直です。
open_image.py
を実行してみましょう!# python3 open_image.py画像が表示されました!!!
おわりに
様々なトラブルがありましたが、無事にDockerコンテナとPCディスプレイを接続して、OpenCVにより画像を表示させることができました。今回の検証より、Dockerコンテナをデプロイする際には、下記のように環境変数
QT_X11_NO_MITSHM=1
を追加しておくと良いことも分かりました。$ docker run -it \ --privileged \ --env="DISPLAY=$DISPLAY" \ --env="QT_X11_NO_MITSHM=1" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ --volume="$HOME/ws/:/home/" \ --name="ubuntu_cv2" \ ubuntu:18.04これからDockerマスターを目指して頑張っていこうと思います!
読んで頂いた方々、ありがとうございます!!!参考文献
[1] Docker run options, https://docs.docker.com/v17.12/edge/engine/reference/commandline/run/
[2] Example of docker run, https://qiita.com/tnarihi/items/275c009e9dec1306893f
[3] How to mount on docker, https://docs.docker.com/v17.09/engine/admin/volumes/bind-mounts/
[4] How to solve opencv import error, https://github.com/NVIDIA/nvidia-docker/issues/864
[5] Open X server, https://unix.stackexchange.com/questions/121716/unable-to-open-x-server
[6] Allowing computers access, https://www.stitson.com/pub/book_html/node72.html
[7] About xhost, https://wiki.archlinux.jp/index.php/Xhost
[8] Source command, https://bash.cyberciti.biz/guide/Source_command
- 投稿日:2020-01-20T06:26:43+09:00
ラズパイ・ウェブ地図の作り方
私が出せる現時点最新版の、ラズパイ・ウェブ地図の作り方をまとめてみました。
2019年台風19号の都幾川地区のデータを表示するウェブ地図をラズパイでホストするもので、Raspbian 上に Docker を入れて、その上に国連ベクトルタイルツールキットとデータを入れるものです。
セットアップ
kawagoe 入り MicroSD カードの作り方(経験者向け概要版)
実行
- 投稿日:2020-01-20T00:44:19+09:00
【docker alpine linux】でbashの使用方法
docker alpine linuxでbashを使用するために
結論
以下のコマンドを叩くとbashが使用できるようになります。
apk add bashalpine linuxのshell
alipine linuxでは、デフォルトのshellに
ash
が使用されています。
bash
を使う場合は、事前にapk add bash
を叩いておく必要があります。$ docker run -it alpine:latest apk add bash && bash -c "echo test" fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz (1/5) Installing ncurses-terminfo-base (6.1_p20191130-r0) (2/5) Installing ncurses-terminfo (6.1_p20191130-r0) (3/5) Installing ncurses-libs (6.1_p20191130-r0) (4/5) Installing readline (8.0.1-r0) (5/5) Installing bash (5.0.11-r1) Executing bash-5.0.11-r1.post-install Executing busybox-1.31.1-r9.trigger OK: 15 MiB in 19 packages testP.S:
sh
は既にインストール済みなので#!/bin/sh
で記載されたスクリプトなどは動かせます。