20200120のdockerに関する記事は15件です。

docker

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

Dockerを使ってRuby2.7&Rails6を構築

はじめに

2020/01/20時点での最新安定版のrails開発環境の構築の記事がなかったので。

【Imagemagick対応】Dockerを利用して、Rails環境を作成

基本上記の記事のままです。
ただ、上記の記事はRuby2.6&Rails5.2.2で、そのままバージョンを書き換えるだけではうまく動作しなかったので、動作できるようにしたインストール資材を記載しておきます。
参考までに上記記事からの変更点も記載しておきます。

コンテナ立ち上げ以降は参考記事の手順のまま実施できます。

インストール資材

Dockerfile

Dockerfile
FROM 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.yml
version: '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

Gemfile
source 'https://rubygems.org'

gem 'rails', '~> 6.0.2', '>= 6.0.2.1'

Imagemagickは使用しないのでGemfileから削除しています。

Gemfile.lock

Gemfile.lock

こちらは空のまま。

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

【初学者向け】セキュリティ対策入門②〜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 --build

DB準備

今回はDBを使うので、そのあたりの準備を行っていきます。

http://localhost:8888

にアクセスしてログインしましょう。

そしてtestという名前のDBを作りましょう。

次に以下のようなuserテーブルを作成しましょう。

スクリーンショット 2020-01-15 22.12.40.png

ブラウザアクセス

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カラムに挿入されたというわけです。

参考文献

独習PHP 第3版

今回の内容は以上です。最後までご覧いただきありがとうございました。

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

Docker MySQLのバージョン変更する方法

はじめに

Docker MySQLのバージョンを 8.0 から 5.7 に下げる際に苦戦したので、一連の流れをまとめました。

Laradockを用いてDocker上でLaravelを動かす環境を作成しました。

docker-image.png

MySQLバージョンを変更する一連の流れ

laradockにあるファイルのMySQLのバージョンを 5.7 に変更します。

.env
### MYSQL #################################################
MYSQL_VERSION=5.7

コンテナを停止し、statusexited になっているのを確認。
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

最後に statusup になっているか。
なっていれば mysql のバージョンを確認し 5.7系になっていればOK。

$ docker ps -a
$ docker-composer exec mysql mysql --version

以上で、動くはずです。

Dockerを勉強し始めたばかりで、説明が大雑把なので
わかりにくい箇所や、疑問点など。
また、勉強する上で参考になったサイトや技術書など教えていただけると幸いです。

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

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にインストールし、地道に開発環境を仮想マシン上に手作業で構築する方法で落ち着きました。

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

Laradockを使ってLaravel環境を試した

はじめに

今更感満載ですが、 流行りの LaravelLaradock を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)m

Laradockとは?

こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。

前提

下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。

Laradockのインストール

プロジェクト用ディレクトリ作成

まずは下記コマンドで、プロジェクト用のディレクトリを作成します。

% mkdir ~/workspace/laravel_sample
% cd ~/workspace/laravel_sample

githubからの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=beanstalkd

dockerコンテナの実行

これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例では 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/cache

nginxのドキュメントルートの設定

このままだと nginx が別のディレクトリを参照しているため、
laradockディレクトリ内の default.conf を修正して、ドキュメントルートを設定します。

vim /var/www/laradock/nginx/sites/default.conf

13行目あたりにある、 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 にアクセスし、下記画面が表示されることを確認します。
スクリーンショット 2020-01-20 18.31.42.png

これでLaravelが立ち上がりました!簡単!

まとめ

Laradock を使用すると、 Laravel の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。

今回の記事では触れませんでしたが、
ホストの Laravel プロジェクトと Docker 内の Laravel プロジェクトをマウントすることで、
ホスト側を修正すると Laravel プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする

Docker 便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!

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

Laradockを使ってLaravel環境を構築した

はじめに

今更感満載ですが、 流行りの LaravelLaradock を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)m

Laradockとは?

こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。

前提

下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。

Laradockのインストール

プロジェクト用ディレクトリ作成

まずは下記コマンドで、プロジェクト用のディレクトリを作成します。

% mkdir ~/workspace/laravel_sample
% cd ~/workspace/laravel_sample

githubからの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=beanstalkd

dockerコンテナの実行

これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例では 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/cache

nginxのドキュメントルートの設定

このままだと nginx が別のディレクトリを参照しているため、
laradockディレクトリ内の default.conf を修正して、ドキュメントルートを設定します。

vim /var/www/laradock/nginx/sites/default.conf

13行目あたりにある、 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 にアクセスし、下記画面が表示されることを確認します。
スクリーンショット 2020-01-20 18.31.42.png

これでLaravelが立ち上がりました!簡単!

まとめ

Laradock を使用すると、 Laravel の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。

今回の記事では触れませんでしたが、
ホストの Laravel プロジェクトと Docker 内の Laravel プロジェクトをマウントすることで、
ホスト側を修正すると Laravel プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする

Docker 便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!

共に働くWebエンジニアを募集しています!

不動産SHOPナカジツでは自社サービスを作っていく仲間を募集しています。
詳しくはWantedlyからお問い合わせください。
お待ちしております!

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

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/"
}
}

参考情報

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

GitBucketをMysql8で立ち上げるdocker-composeファイル

GitBucketを立てる

とりあえずバージョン管理をしたいのでGitBucketを立ち上げます。
オープンソースのgitサーバにGitLabというのもありますが
鬼のようにスペックを要求されるのでGitBucketさんを立ち上げます。

セキュリティ意識は低いスクリプトなので間違っても外部サイト向けに公開ではしないでください。

献立

Docker for Windows 1くっじらー
GitBucket4 1バケツ
MySQL8 1人

手順1

フォルダ作って以下をコピペ
作る際にいきなり-dをつけるのではなく火加減を見る為に
docker-compouse up
でログを表示させるといいコックになれます。

docker-compouse.yml
version: '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上の表示
image.png

書き換える場所

立ち上がったらdocker-compouse.ymlが存在する場所にgitbucket-dataあるので移動する。
image.png

database.confを書き換える(参考 https://takezoe.hatenablog.com/entry/2016/07/16/025154)

TODO 下書き気分で投稿したら上げてた模様。
立ち上がり次第記載予定

database.conf
db {
  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を使っている。
このままでいいとは思っていないが、簡単だから使ってしまう。
オラクルの有料化警戒を強めます。

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

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 builddocker-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

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

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!!


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

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_64

Dockerイメージのダウンロード

まずはDocker HubからDockerイメージをダウンロードします。Docker Hubで公開されているDockerイメージは、自由にダウンロード、保存することができます。

$ docker pull ubuntu:18.04

Dockerコンテナのデプロイ

保存済みの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-dev

pipを使用してOpenCVをインストールします。

# pip3 install opencv-python

画像表示プログラムを作成

OpenCVを使用して画像を表示する基本的なプログラムを作成しておきます。

open_image.py
import 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をインポートできません。このエラーは、libsm6libxext6libxrender-devのインストール[4]により解決できます。

# apt-get install -y libsm6 libxext6 libxrender-dev

インストール後、もう一度OpenCVをインポートできるかテストしてみます。

# python3
>>> import cv2

OKですね!

トラブル2:画像を表示できない

先程作成したopen_image.pyを実行してみましょう。

# python3 open_image.py
No protocol specified
: cannot connect to X server :1

PCとのディスプレイ接続に失敗しているようです。ホスト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
1

OKですね!三度目の正直です。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

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

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_64

Dockerイメージのダウンロード

まずはDocker HubからDockerイメージをダウンロードします。Docker Hubで公開されているDockerイメージは、自由にダウンロード、保存することができます。

$ docker pull ubuntu:18.04

Dockerコンテナのデプロイ

保存済みの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-dev

pipを使用してOpenCVをインストールします。

# pip3 install opencv-python

画像表示プログラムを作成

OpenCVを使用して画像を表示する基本的なプログラムを作成しておきます。

open_image.py
import 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をインポートできません。このエラーは、libsm6libxext6libxrender-devのインストール[4]により解決できます。

# apt-get install -y libsm6 libxext6 libxrender-dev

インストール後、もう一度OpenCVをインポートできるかテストしてみます。

# python3
>>> import cv2

OKですね!

トラブル2:画像を表示できない

先程作成したopen_image.pyを実行してみましょう。

# python3 open_image.py
No protocol specified
: cannot connect to X server :1

PCとのディスプレイ接続に失敗しているようです。ホスト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
1

OKですね!三度目の正直です。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

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

ラズパイ・ウェブ地図の作り方

私が出せる現時点最新版の、ラズパイ・ウェブ地図の作り方をまとめてみました。

2019年台風19号の都幾川地区のデータを表示するウェブ地図をラズパイでホストするもので、Raspbian 上に Docker を入れて、その上に国連ベクトルタイルツールキットとデータを入れるものです。

kawagoe

セットアップ

kawagoe 入り MicroSD カードの作り方(経験者向け概要版)

実行

演習(経験者向け概要版)

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

【docker alpine linux】でbashの使用方法

docker alpine linuxでbashを使用するために

結論

以下のコマンドを叩くとbashが使用できるようになります。

apk add bash

alpine 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
test

P.S: shは既にインストール済みなので#!/bin/shで記載されたスクリプトなどは動かせます。

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