20201010のdockerに関する記事は24件です。

DockerのBuildKitを有効化する (mac)

Docker for Macの「Preferences」を開き、「Docker Engine」のConfigureを以下のように変更する

{
  "debug": true,
  "experimental": true,
  "features": {
    "buildkit": true
  }
}

スクリーンショット 2020-10-10 23.43.07.png

変更したら右下の「Apply & Restart」を押して反映する

.bashrcもしくは.zshrcに以下の環境変数を追加する

export DOCKER_BUILDKIT=1
export COMPOSE_DOCKER_CLI_BUILD=1

シェルを再起動する
これでdocker build及びdocker-compose buildでBuildKitが有効になる

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

【俺得】SAM CLIでデプロイする迄

AWS CLIインストール

pythonとpipのpath追記 ※前段作業

・pythonとpipのPath確認方法
エクスプローラで確認

pythonのpath確認方法.PNG

・pathの追記
コマンドプロンプトから下記を開いていく
システムとセキュリティ→システム→システムの詳細設定→環境変数
システム環境変数の一覧からPathを選択し、編集をクリック

pythonのpath追加.PNG

pythonとpipのPathがなければ新規にて作成

AWS CLIインストール

C:\Users\USER>pip install awscli
Defaulting to user installation because normal site-packages is not writeable
Collecting awscli
  Downloading awscli-1.18.157-py2.py3-none-any.whl (3.4 MB)
     |████████████████████████████████| 3.4 MB 504 kB/s

Installing collected packages: six, python-dateutil, jmespath, urllib3, botocore, PyYAML, pyasn1, rsa, s3transfer, colorama, docutils, awscli
  WARNING: The scripts pyrsa-decrypt.exe, pyrsa-encrypt.exe, pyrsa-keygen.exe, pyrsa-priv2pub.exe, pyrsa-sign.exe and pyrsa-verify.exe are installed in 'C:\Users\USER\AppData\Roaming\Python\Python37\Scripts' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Successfully installed PyYAML-5.3.1 awscli-1.18.157 botocore-1.18.16 colorama-0.4.3 docutils-0.15.2 jmespath-0.10.0 pyasn1-0.4.8 python-dateutil-2.8.1 rsa-4.5 s3transfer-0.3.3 six-1.15.0 urllib3-1.25.10
WARNING: You are using pip version 20.1.1; however, version 20.2.3 is available.
You should consider upgrading via the 'c:\program files (x86)\microsoft visual studio\shared\python37_64\python.exe -m pip install --upgrade pip' command.

WARNINGの一つ目はPathが通っていないため追記が必要
追加するPathはWARNINGに記載あり

WARNINGの二つ目は単純なpipのupgradeで最新版にできるという案内

AWS CLI設定

C:\Users\USER>aws configure --profile IoT
AWS Access Key ID [None]: ###
AWS Secret Access Key [None]: ###
Default region name [None]: ap-northeast-1
Default output format [None]: json

設定後の確認
ec2の確認

aws ec2 describe-instances --instance-ids ${instance-id} --profile IoT

S3の確認

C:\Users\USER>aws s3 ls --profile IoT
2020-10-10 14:46:01 test7712121

AWS SAM CLIインストール

Dockerのインストール ※前段作業

まずはタスクマネージャー→パフォーマンスタブ→CPUの
右下の「仮想」の欄が有効になっていることを確認。

仮想の有効確認.png

Dockerのを入れるにあたりWindows10HomeではDokcer Desktop for Windows が入らないため
今回は代わりにDocker Toolboxをインストールすることにしました。
下記サイトから「Install Docker Toolbox for Windows」からv19.03.1をインストール
https://docs.docker.com/toolbox/overview/

screencapture-docs-docker-toolbox-overview-2020-10-10-15_28_55.png

特に内容は変更せずインストールを行いました。
docker導入.PNG

Dockerのインストールの途中で下記がインストールが表示された場合はインストールする。
docker_2.PNG

AWS SAM CLIインストール

以下よりインストーラをダウンロード
https://github.com/awslabs/aws-sam-cli/releases/download/v0.6.2/AWS_SAM_CLI_64_PY3.msi

バージョンの確認コマンド

C:\Users\USER>sam --version
SAM CLI, version 0.6.2

initが考えていた挙動とは違い指定等ができなかったが
buildをしようとするとできない状態が発生!!

実はインストーラのバージョンが古い為だと判明したため、
最新のSAMをインストールすると無事解決!

ビルドとデプロイ

まずはsam initでAWS SAM テンプレートを使用して
サーバーレスアプリケーションを初期化します。
ちなみにプロジェクトを変える時などの初回時だけで大丈夫。

今回の設定は
       : 1 - AWS Quick Start Templates
言語     : 8 - python3.7
Project name  : test2
templates   : 1 - Hello World Example

C:\Users\USER\test>sam init
Which template source would you like to use?
        1 - AWS Quick Start Templates
        2 - Custom Template Location
Choice: 1

Which runtime would you like to use?
        1 - nodejs12.x
        2 - python3.8
        3 - ruby2.7
        4 - go1.x
        5 - java11
        6 - dotnetcore3.1
        7 - nodejs10.x
        8 - python3.7
        9 - python3.6
        10 - python2.7
        11 - ruby2.5
        12 - java8.al2
        13 - java8
        14 - dotnetcore2.1
Runtime: 8

Project name [sam-app]: test2

Cloning app templates from https://github.com/awslabs/aws-sam-cli-app-templates.git

AWS quick start application templates:
        1 - Hello World Example
        2 - EventBridge Hello World
        3 - EventBridge App from scratch (100+ Event Schemas)
        4 - Step Functions Sample App (Stock Trader)
Template selection:
Template selection: 1

-----------------------
Generating application:
-----------------------
Name: test2
Runtime: python3.7
Dependency Manager: pip
Application Template: hello-world
Output Directory: .

Next steps can be found in the README file at ./test2/README.md

今回は思っていた通り指定等ができたので
初回に必要な--guided オプションをつけて実行し、
biludしdeploy開始した結果がこちらなんですが、またもエラーが・・・

C:\Users\USER\sam_test>sam build
Building codeuri: hello_world/ runtime: python3.7 metadata: {} functions: ['HelloWorldFunction']
Running PythonPipBuilder:ResolveDependencies
Running PythonPipBuilder:CopySource

Build Succeeded

Built Artifacts  : .aws-sam\build
Built Template   : .aws-sam\build\template.yaml

Commands you can use next
=========================
[*] Invoke Function: sam local invoke
[*] Deploy: sam deploy --guided
sam deploy --guided --profile IoT

Configuring SAM deploy
======================

        Looking for config file [samconfig.toml] :  Not found

        Setting default arguments for 'sam deploy'
        =========================================
        Stack Name [sam-app]: sam_test
        AWS Region [us-east-1]: ap-northeast-1
        #Shows you resources changes to be deployed and require a 'Y' to initiate deploy
        Confirm changes before deploy [y/N]: N
        #SAM needs permission to be able to create roles to connect to the resources in your template
        Allow SAM CLI IAM role creation [Y/n]: Y
        HelloWorldFunction may not have authorization defined, Is this okay? [y/N]: y
        Save arguments to configuration file [Y/n]: Y
        SAM configuration file [samconfig.toml]:
        SAM configuration environment [default]:

        Looking for resources needed for deployment: Not found.
        Creating the required resources...
        Successfully created!


Initiating deployment
=====================
HelloWorldFunction may not have authorization defined.
Uploading to sam_test/25efe53b4bac655770621572b615acba.template  1132 / 1132.0  (100.00%)
Error: Failed to create changeset for the stack: sam_test, An error occurred (ValidationError) when calling the CreateChangeSet operation: 1 validation error detected: Value 'sam_test' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*|arn:[-a-zA-Z0-9:/._+]*

実際には簡単なミスでstackName に 「_」を使用できないためのエラーだったので
samconfig.tomlのファイルの中身を編集して解決した。
修正後、buildしdeployしてみると成功。

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

昨今のエンジニアのインフラ技術を料理で無理矢理例えてみた。

はじめに

この記事の想定対象者は
- 自分はエンジニア(開発者)ではありません
- でも、エンジニアと関わります。(企画とかマネジメントとか)
- そのため、最低限エンジニアのインフラ知識ないとエンジニアの皆様に『そんなことも知らねーのかよ勉強して出直せ』と怒られます
- でも、少しググったけど何もわからないんです
という人々です

人類どんな人がいようと食べない人はいないだろうということで、無理矢理料理で例える努力をしてみました。

ので、日頃サーバー触っているエンジニアの方々はあまり対象ではありません
もしかしたらプログラミングはできるけどインフラ周り何もわからないっていう人の助けにはなるかもしれません。
ならないかもしれません。

具体的な技術について

  • クラウド(いわゆるパブリッククラウド。AWS/Azure/GCP...)
  • コンテナ(Docker)
  • Kubernetes

についてかるーく触れます
雰囲気が伝わることをめざしています。ので超厳密にいうと少し違うかもしれません。
ご了承ください

嘘は書いてないつもりです。ここ違うよ!ってところがあればコメントいただけますと幸いです。

本題

では、本題です。

1. 従来

あなたは料理人です(エンジニア)
料理をします(コーディング/プログラミング)
ただそれだけだとお客様に提供がきません(デプロイできません)
まず、テーブル(物理サーバ)を用意して、お皿(ライブラリ等)を用意して、そこに料理(コード)を盛り付けて初めて提供できます(デプロイ)

なので、毎回テーブルお皿を用意しなければいけません.。
特にテーブルを毎回用意するのは面倒です。重いし高いし。

2. クラウド

そこで生まれたのがクラウドです
クラウドとは、テーブル(物理サーバ)を1000台以上並べた上に、でっかい真っ白なテーブルクロスを引いたものです
なので中身はテーブルの集合ですが、上から見たら真っ白な巨大なテーブルでしかありません

その巨大テーブルに仕切りを作って、1つ1つの空間に切り分けます。以後この1つの空間をテーブル(仮)とします。(仮想サーバ/EC2インスタンス)。ちょっとイメージしにくいかもしれませんが、テーブル(仮)は物理的なテーブルだと思ってください。
それを料理人に提供します。「いくつテーブル(仮)が必要ですか」「ここはあなたのテーブル(仮)です」「好きに使ってください」「レンタル料は1テーブル(仮)あたり1ヶ月いくらです」って貸し出すのがクラウド事業者(AWS/Azure/GCP…)です

ただ、結局そのテーブル(仮)上にお皿(ライブラリ等)は用意しなければいけません。複数のテーブル(仮)に提供したい場合は、それごとにお皿(ライブラリ等)を買ってきて置いて、その上でそれぞれ料理(コード)を並べることになります。綺麗な盛り付けも必要です。面倒です。

3. コンテナ

そこで生まれたのがコンテナです
コンテナとは、出前用の箱だと思ってください。岡持ちです。その箱の中にお皿料理を詰めます。綺麗な盛り付けもここで終わらせます。
ので、一度岡持ちを作ってしまえば、それをテーブルの上に置くだけで済みます。

(コンテナ自体は物理サーバでも仮想サーバでも動きます。なぜこの順番で説明しているかは一番下の番外編をご覧ください)

そして、ここからが現実と違うところですが、この岡持ちは全く同じものが複製できます。
ここいい例え思いつきませんでした。この岡持ちに入ったら超科学で3dプリンターが使えるとか思ってください。

ので、複数のテーブルに提供したい場合も、その複製した岡持ちごとおけば全て解決します。毎回お皿(ライブラリ等)を買って来る必要はありません。

このコンテナという技術のうち一番有名なものがDockerと呼ばれますコンテナです。

しかし、ここでも問題があります。それは、テーブルが壊れれば(割れるとか足が折れるとか)、その上においてある岡持ち(コンテナ)は当然一緒に落ちる、ということです
例えば、そこがバイキング/ビュッフェとかだったら一大事。

常に料理をお客様に提供しなければならないのに、壊れてしまったら、別のテーブルの上にまた岡持ち(コンテナ)を置くまで料理の提供ができなくなります。

(そんな簡単に壊れねーだろと思うかもしれませんが、壊れた時が本当に一大事なので絶対に避けたいのがインフラエンジニアの方々だったりします)

4. Kubernetes

そこで生まれたのがKubernetesです。(略してk8s)
Kubernetesは、なんか、ウエイターです。スーパーウエイターです。

ウエイターは自分の店内にある全てのテーブル(物理/仮想サーバー)を常に見ています。
そして、料理人(エンジニア)ウエイターに置きたい料理が入った岡持ち(コンテナ)を渡します。
例えば「この野菜炒めの岡持ちを置いて欲しい」とかです。
ウエイターは「かしこまりました」と言い、1つのテーブルの上に野菜炒めの岡持ちを置きます。

そこで、そのテーブルが壊れたとしましょう。当然野菜炒めは落ちます。食べられません。
従来なら、料理人が時間差で気づき、慌てて他の空きのあるテーブルの上に新しい「野菜炒めの岡持ち」を置いてお客様に提供するところです。
(この壊れてから新しいテーブルの上に岡持ちを置くまで=お客様に料理を提供できていない時間がダウンタイムです。いわゆるシステム障害と呼ばれWebサービス等に接続できない状態のことを指します。エンジニアからすると恐怖ですね。絶対に嫌です。)

しかしスーパーウエイター(kubernetes)はそんな手を煩わせません。ウエイターが即座に気づき、自動的に空きのあるテーブルを探し、そこに新しい「野菜炒めの岡持ち」を置きます。そのため、そのままお客様に提供し続けることが可能になります。
そうすることで、料理人料理に集中できるのです。

番外編: オートスケール

ちなみに、たまに聞くかもしれない「オートスケール」とは、2で出てきたテーブル(仮)が,あらかじめ用意していた分では足らなくなった時、勝手に新しいテーブル(仮)を用意してくれる仕組みのことです。
これがクラウドという超巨大テーブルの最大の強みの1つだったりします。

ので、例えば4のウエイター(kubernetes)がとあるテーブル(仮想サーバ)が壊れていることに気づき、「野菜炒めの岡持ち(コンテナ)」を別のテーブルに置きたいけど空きのあるテーブルがない!やばい!どうしよう!ってなった時。
オートスケール機能をつけておけば、なんとびっくり。新しいテーブル(仮)が自動的に使えるようになります。
ので、晴れてウエイターは新しいテーブル(仮)に「野菜炒めの岡持ち」を置くことができるのです。

そのため、kubernetesとクラウドを同時に使われることが多い(と勝手に思ってる)のです

終わりに

いかがだったでしょうか。
この記事は、弊社で最近 Kubernetes! Kubernetes! と叫ばれることが多く、開発者ではない大先輩の方々が「Kubernetesとはなんじゃ...」と思っている節があり、そういう人たちが少しでもイメージしやすくなるといいなと思って書きました

割と勢いで書きました。正直お酒飲んでます
ので、あんまり批判が多かったら冷静になった僕が消すかもしれません

兎にも角にも、ここまで読んでくださりありがとうございました。

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

VagrantでOracleLinux(7.x)にDockerをセットアップする

目的

VagrantでOracleLinux(7.x)を立ち上げて、ついでにDockerのインストールと起動までやりたい。
(ホストはWindows10 HomeEdition。Vagrant、VirtualBoxはセットアップ済み)

Vagrant Boxの情報を調べる

以下のサイトで確認。Oracle Linux Vagrant boxのURLを確認。

Oracle Linux Vagrant boxes
https://yum.oracle.com/boxes/

今回はOracle Linux 7.x想定なので
https://oracle.github.io/vagrant-projects/boxes/oraclelinux/7.json
を使用する。

Oracle Linux へのDockerのインストール情報を調べる

Oracle Linux DockerではDocker-docs-jaに翻訳があるが、1.13.RCであり、現在はYumリポジトリの設定が異なりこの部分は参考にならない。
https://docs.docker.jp/engine/installation/linux/oracle.html

Dockerマニュアル(英語)のインストールマニュアルをみるとLinuxのディストリビューションの章からOracleLinuxがなくなっている。
https://docs.docker.com/engine/install/

以下blogにOracleLinuxのOracle yum repositoryの設定について言及がある。

A Simple Guide to docker installation on Oracle Linux 7.5 [Updated Oct 2019]
https://blogs.oracle.com/blogbypuneeth/a-simple-guide-to-docker-installation-on-oracle-linux-75

2020/10時点では、上記Boxで取得したOracleLinuxのyum repositoryの設定として「ol7_latest」「ol7_addons」がデフォルトで有効であり、特に追加で設定変更は不要であった。上記blogにある「ol7_UEKR4」は無効のままでも問題なかった。

Vagrantfile

Vagrantfileの例

Vagrant.configure("2") do |config|
  config.vm.box = "oraclelinux/7"
  config.vm.box_url = "https://oracle.github.io/vagrant-projects/boxes/oraclelinux/7.json"
  config.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2210
  config.vm.provider "virtualbox" do |vb|
   vb.memory = "8196"
  end
  config.vm.provision "shell", inline: <<-SHELL
i=1; while [ $i -le 10 ]; do echo $i;yum -y --disablerepo=* --enablerepo=ol7_addons,ol7_latest  install docker-engine;if [ $? -eq 0 ];then break;fi;i=$(expr $i + 1);done
systemctl start docker.service
systemctl enable docker.service
SHELL
end

ちょっと説明。

  • config.vm.network :forwarded_port, id: "ssh", guest: 22, host: 2210
    • SSHポートフォワーディングを22→2210で設定。ホストのlocahostに2210ポートでssh接続。
  • vb.memory = "8196"
    • 割り当てメモリを8GBに。お好みで。
  • i=1; while [ $i -le 10 ]; do echo $i;yum -y --disablerepo=* --enablerepo=ol7_addons,ol7_latest install docker-engine;if [ $? -eq 0 ];then break;fi;i=$(expr $i + 1);done
    • 「yum -y docker-engine」 だけでよいはず。ここでは、yumのupdateに時間がかかるので必要なレポジトリのみに絞る。また一度ではなぜか成功せず何度かやると成功することがあったので、成功するまで(リトライ上限10回)繰り返しとした。
  • systemctl start docker.service  
  • systemctl enable docker.service
    • Dockerサービスの起動と自動起動の有効化

Vagrant 起動

> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'oraclelinux/7'...
<中略>

> vagrant ssh

Welcome to Oracle Linux Server release 7.8 (GNU/Linux 4.14.35-2025.400.8.el7uek.x86_64)

The Oracle Linux End-User License Agreement can be viewed here:

  * /usr/share/eula/eula.en_US

For additional packages, updates, documentation and community help, see:

  * https://yum.oracle.com/

[vagrant@localhost ~]$ sudo su -
[root@localhost ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.11-ol
 API version:       1.40
 Go version:        go1.14.7
 Git commit:        78418d7
 Built:             Tue Aug 18 22:46:21 2020
 OS/Arch:           linux/amd64
 Experimental:      false
<以下略>

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

【0からDockerに挑戦】③DockerとDocker-composeを使ってRuby on Rails・MYSQLの開発環境をつくる (part2)

DockerとDocker-composeを使ってRuby on Rails・MYSQLの開発環境をつくる

前回の続きになります。もし見てなければ先にそちらをみていただけたらと思います。

【前回の記事】
【0からDockerに挑戦】②DockerとDocker-composeを使ってRuby on Rails・MYSQLの開発環境をつくる (part1)

ちなみに前回までで下記手順②まで終了しています。なので今回は③からの手順になります。
 ①ローカルPC上に必要なディレクトリ・ファイルをつくる
 ②そのうちDockerfile、docker-compose.yml、Gemfileに必要な記述を書く
 ③docker-composeをビルド・実行させる
 ④コンテナ上でrails newを実行し必要なファイルを作成する。
 ⑤コンテナ上でデータを作成・起動する

それでは早速再開しましょう!!!


③docker-composeをビルド・実行させる

前回までで必要なファイルの記述が完了しましたので、さっそくターミナルでdocker-composeを実行しましょう。
まずはターミナルでDockerファイルのある場所(今回の場合は/Desktop/test-product)まで移動します。
そしたら下記コマンドを実行します。

ターミナル
user@user test-product % docker-compose up -d

そうすると2~3分程度で、さきほど用意したdocker-compose.ymlとDockerfileを基にコンテナが立ち上がります。もし記述に誤りがある場合は途中で処理が止まりますので、エラー文をみてファイルを修正しましょう。ちなみに「-d」はディタッチオプションといい、「-d」をつけることでバックグラウンドで実行することができます。

ちなみに下記のように、成功した後に「docker-compose ps」とターミナルで入力するとちゃんとコンテナができていることが確認できます。

ターミナル
user@user test-product % docker-compose ps

    Name                 Command             State           Ports         
---------------------------------------------------------------------------
test-product_db_1    docker-entrypoint.sh mysqld   Up      3306/tcp              
test-product_web_1   irb                           Up      0.0.0.0:3000->3000/tcp


④コンテナ上でrails newを実行し必要なファイルを作成する。

では出来上がったコンテナの中に入り、railsに必要なファイルを生成します。コンテナの中を操作するには下記のコマンドを入力します。

ターミナル
user@user test-product % docker-compose exec web bash
root@f206189dc19b:/test-product#

簡単に説明するとコマンドは、「exec(実行する)」、「web(コンテナの名前)」、「bash(場所はコンテナ内のシェル)」という意味です。つまりコンテナ内に入りbashを起動するということになります。「root@・・・・」と表示されていたらOKです。

そしてコンテナの中に入れたので「rails new」を実行し、必要なファイルを実行しましょう。

ターミナル
root@f206189dc19b:/test-product# rails new . --force --database=mysql --skip-bundle 

newのあとの「.」はカレントディレクトリを示します。「--force」はファイルを無理やり上書きすることを示します。rails newを実行するとGemfileも作らるのですが、今回ファイル自体はすでに作ってあるので--forceをつけることでGemfileを改めて作ります。(railsのバージョンは最初に指定したものになります)。「--database=mysql」はデータベースの指定です。そして最後の「--skip-bundle 」はコンテナ立ち上げ時にbundleをしたので、スキップを指定しました。これで必要なファイルは揃うのですが、1つ問題があります。それはdatabase.ymlの設定です。(おそらくファイルの生成には問題ないがbundle install時にエラーが起こる)。生成したファイルのconfig/database.ymlを開き、docker-compose.ymlの内容にあわせて下記のように編集しましょう。

ターミナル



(省略)
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: <%= ENV.fetch("DATABASE_PASSWORD")%>
  host: db


変更箇所はusernameとpasswordとhost名です。これで設定は問題ありません。

⑤コンテナ上でデータを作成・起動する

最後に「rails db:create」と「rails s」すれば終わりと行きたいところですが、このまま実行するとエラーがでます。理由はrails6.0から標準装備されたwebpackerがインストールされていないからです(rails5.0であればそのままでもエラー起きません)。なのでwebpackerをインストールしましょう。

ターミナル
root@f206189dc19b:/test-product# rails webpacker:install

問題なくインストールできるはずです。(もしエラーがおこるのであればDockerfileのyarnのインストールの指定の仕方を見直してください。前の記事に書いてあります)。これで準備ができたので「rails db:create」をしましょう成功するです。そして最後に下記のように[rails s」でサーバーを立ち上げましょう。ここでもしかしたらyarnに関するエラーがでるかもしれません。エラーが出た場合は「yarn upgrade」で解決できるはずです。

ターミナル
root@f206189dc19b:/test-product# rails s -b 0.0.0.0

ローカルの環境では自分のホスト内で完結していたため、特に指定なしで問題ありませんでした。しかしコンテナの場合、自分のPCからコンテナで立ち上げたサーバーへのアクセスは外部からのアクセス扱いになるので、指定が必要です。今回は0.0.0.0を指定して外部からのアクセスを許可しています。
【参照】
RailsアプリケーションをLAN内に公開する

これでブラウザにlocalhost:3000と記載すればrailsの初期画面が表示されるはずです。

まとめ

以上でdockerによる開発環境構築完了です。このあとはいつもどおりgitとrailsを用いいた開発になります。もし「バージョンを変えたい」や「環境系のエラー起きた」などがあっても、Dockerfileをいじり、新しくコンテナを立ち上げればすぐに対応できるでしょう(私も開発に取り組んでdokcerの凄さを実感しました)。dockerはまだまだ奥深く、勉強することがたくさんありそうですので、引き続き私もdockerの勉強がんばります。
しばらくあとになりますが、AWS環境(本番環境)でdockerを使ってみたり、dockerとCircleCIを用いてCICDパイプラインを作るという記事も書く予定です。

【前回までの記事】
【0からDockerに挑戦】①Dockerの概要と用語
【0からDockerに挑戦】②DockerとDocker-composeを使ってRuby on Rails・MYSQLの開発環境をつくる (part1)

参考になった教材

「米国AI開発者がゼロから教えるDocker講座」 
https://www.udemy.com/course/aidocker/
→初心者がDockerを学ぶならこれ!!!めちゃくちゃわかりやすい!!!linuxの基礎からDockerでの環境構築を網羅しています。
今回の環境構築もこの教材をベースにしています(もちろんrailsのバージョンとかdbなど自分なりに変えているので同じではないです)
もしDocker全然わかないという人はこの講座をぜひ買ってみてください。

「いまさらだけどDockerに入門したので分かりやすくまとめてみた」 
https://qiita.com/gold-kou/items/44860fbda1a34a001fc1
→すごく細かく網羅しているのでとてもわからなくなったらよく見ています。リファラル的によくみさせていただいてます。

「Docker/Kubernetes 実践コンテナ開発入門 --著 山田 明憲」 
→実践的な書籍、あまりにも初学者だと少しむずかしいかも。 → 基礎覚え得たあとに見返したら非常に良かったです!

「たった1日で基本が身に付く! Docker/Kubernetes超入門 --著」
→初学者が書籍で学びたい場合はこれがとっかかりやすい。

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

ざっくりすぎるdocker-composeでのRails5+MySQL8.0+top-level volumesの環境構築

丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)
とほぼ同じ内容です。
なので詳しく知りたい方はそちらへどうぞー
mysqlのバージョンが異なっていたり、top-level volumesを使っているなど少し異なりますー

環境

  • MacOS 10.15.7
  • Docker Desktop for Mac
  • Ruby 2.7.1
  • Rails 5.2.4.4
  • MySQL 8.0.21
$ mkdir rails_docker
$ cd rails_docker
$ vi Dockerfile
Dockerfile
FROM ruby:2.7.1

RUN apt-get update -qq && \
    apt-get install -y build-essential \
                       libpq-dev \
                       nodejs \
    && rm -rf /var/lib/apt/lists/*

RUN mkdir /recruit_web
ENV APP_ROOT /recruit_web
WORKDIR $APP_ROOT

ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock

RUN bundle install
ADD . $APP_ROOT
$ vi Gemfile
Gemfile
source 'https://rubygems.org'
gem 'rails',  '~> 5.2.4', '>= 5.2.4.4'
$ touch Gemfile.lock
$ vi docker-compose.yml
docker-compose.yml
version: '3'
services:
  db:
    image: mysql:8.0.21
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - rails_docker_network
    environment:
        MYSQL_DATABASE: root
        MYSQL_ROOT_PASSWORD: password
    # mysql8.0の認証プラグイン(caching_sha2_password)をmysql_native_passwordに変更
    command: --default-authentication-plugin=mysql_native_password
    container_name: rails_db_container
  web:
    build: .
    depends_on:
      - db
    command: rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/recruit_web
    networks:
      - rails_docker_network
    ports:
      - "3000:3000"
    container_name: rails_web_container

volumes:
  db_data:

networks:
  rails_docker_network:
    name: rails_docker_network
$ docker-compose run web rails new . --force --database=mysql --skip-bundle
$ vi /confing/database.yml
database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root # 追加
  password: password # 追加
  host: db # 追加
$ docker-compose build
$ docker-compose up -d

以下のコマンドを実行するとデータベースが作られてlocalhost:3000でアクセスできると思いますー

$ docker-compose run web rails db:create

詰まったところ

docker-compose.yml
version: '3'
services:
  db:
    image: mysql:8.0.21
    volumes:
      - db_data:/var/lib/mysql
    environment:
        MYSQL_DATABASE: root
        MYSQL_ROOT_PASSWORD: password
    # 以下を指定していたらエラーが出た
    ports:
      - "3306:3306 

  web:
    build: .
    command: rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/app_sample
    ports:
      - "3000:3000"
    # 以下を指定していたらエラーが出た(非推奨+なくても名前解決されるので必要なかった)
    links:
      - db

volumes:
  db_data:

なぜかlinks と db の公開ポートを指定していると

Mysql2::Error::ConnectionError: Access denied for user 'root'@'172.19.0.4' (using password: YES)

と怒られかなり躓きました。。。

とりあえず、ポートは必要ないと気づき削除
ドキュメントよりlinksは非推奨でなくても名前解決できるそうなので削除
https://docs.docker.com/compose/networking/

何か改善点あればよろしくおねがいしますー

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

Reactの開発環境をDockerで作る

動機

React/Reduxの開発環境をDockerで作成した際の備忘録。

環境

macOS Catalina 10.15.5
Docker version 19.03.13
docker-compose version 1.27.4

Dockerfile

From node:latest
WORKDIR /usr/src/app
RUN npm install -g create-react-app

docker-compose

docker-compose.yml
version: '3'
services:
 node:
  build:
   context: .
   dockerfile: Dockerfile
  tty: true
  environment:
   - NODE_ENV=production
  volumes:
   - ./:/usr/src/app
  command: sh -c "cd project_name && yarn start"
  ports:
   - "3000:3000"
項目 意味
version docker-composeのversion
services 構築サービス
build Dockerfileのディレクトリとファイルを指定
tty コンテナを起動し続けるかを決定
environment 環境変数を設定
volumes ローカルのディレクトリが接続(マウント)する作業ディレクトリを指定
command コンテナないで実行するコマンド
ports 外部に対して公開するポート

NODE_ENV

動作環境を設定する
本番環境:production
開発環境:development

command

イメージのbuild

docker-compose build

アプリケーションの作成

docker-compose run --rm node sh -c "create-react-app project_name"

docker-compose runで先ほど作成したイメージを起動し、sample-projectでアプリケーションを作っていきます。runはコンテナを一度だけ起動する。

Redux、Expressライブラリのインストールします。

npm install redux --save
npm install react-redux --save
npm install express --save

インストール確認

npm list --depth=0

コンテナの起動

docker-compose up -d

バックグラウンドで起動。

コンテナの停止

docker-compose down

オプションに-vをつけると、Compose ファイルの volumes セクションの名前付きボリュームを削除する。

Command

動いているコンテナの確認

docker-compose ps

コンテナの削除

docker rm <コンテナID>

イメージの削除

docker rmi <イメージID>

Docker hubへpush

docker imageにタグづけする

docker tag <baseのimage名> <DockerhubID>/<image名>:タグ名

Dockerhubへのログイン

docker login

docker hubにpush

docker push <DockerhubID>/<image名>:タグ名

これでDockerhubのレポジトリに/が追加される。

自動ビルド設定

GitHubと連携する手順を示す。事前にGitHubにレポジトリを用意する必要がある。

Dockerhubから対象のrepositoryを選択 → 「Builds」 → 「Link to GitHub」
スクリーンショット 2020-10-11 9.39.33.png

連携するRepositoryを選択
スクリーンショット 2020-10-11 9.41.43.png

Repositoryを選択すると下の選択画面が開く。AUTESTをOffにすると自動ビルドされないので、それ以外を選択。REPOSITORY LINKSはお好きに。BUILD RULESは自動ビルドの詳細設定。デフォルトでよければこれで。
作成当初はSave and Buildで。
スクリーンショット 2020-10-11 9.47.03.png

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

Reactの開発環境をDockerで作る。イメージの作成→コンテナ起動→DockerHubにpush

動機

React/Reduxの開発環境をDockerで作成した際の備忘録。

環境

macOS Catalina 10.15.5
Docker version 19.03.13
docker-compose version 1.27.4

Dockerfile

From node:latest
WORKDIR /usr/src/app
RUN npm install -g create-react-app

docker-compose

docker-compose.yml
version: '3'
services:
 node:
  build:
   context: .
   dockerfile: Dockerfile
  tty: true
  environment:
   - NODE_ENV=production
  volumes:
   - ./:/usr/src/app
  command: sh -c "cd project_name && yarn start"
  ports:
   - "3000:3000"
項目 意味
version docker-composeのversion
services 構築サービス
build Dockerfileのディレクトリとファイルを指定
tty コンテナを起動し続けるかを決定
environment 環境変数を設定
volumes ローカルのディレクトリが接続(マウント)する作業ディレクトリを指定
command コンテナないで実行するコマンド
ports 外部に対して公開するポート

NODE_ENV

動作環境を設定する
本番環境:production
開発環境:development

command

イメージのbuild

docker-compose build

アプリケーションの作成

docker-compose run --rm node sh -c "create-react-app project_name"

docker-compose runで先ほど作成したイメージを起動し、sample-projectでアプリケーションを作っていきます。runはコンテナを一度だけ起動する。

Redux、Expressライブラリのインストールします。

npm install redux --save
npm install react-redux --save
npm install express --save

インストール確認

npm list --depth=0

コンテナの起動

docker-compose up -d

バックグラウンドで起動。

コンテナの停止

docker-compose down

オプションに-vをつけると、Compose ファイルの volumes セクションの名前付きボリュームを削除する。

Command

動いているコンテナの確認

docker-compose ps

コンテナの削除

docker rm <コンテナID>

イメージの削除

docker rmi <イメージID>

Docker hubへpush

docker imageにタグづけする

docker tag <baseのimage名> <DockerhubID>/<image名>:タグ名

Dockerhubへのログイン

docker login

docker hubにpush

docker push <DockerhubID>/<image名>:タグ名

これでDockerhubのレポジトリに/が追加される。

自動ビルド設定

GitHubと連携する手順を示す。事前にGitHubにレポジトリを用意する必要がある。

Dockerhubから対象のrepositoryを選択 → 「Builds」 → 「Link to GitHub」
スクリーンショット 2020-10-11 9.39.33.png

連携するRepositoryを選択
スクリーンショット 2020-10-11 9.41.43.png

Repositoryを選択すると下の選択画面が開く。AUTESTをOffにすると自動ビルドされないので、それ以外を選択。REPOSITORY LINKSはお好きに。BUILD RULESは自動ビルドの詳細設定。デフォルトでよければこれで。
作成当初はSave and Buildがいいっぽい。
スクリーンショット 2020-10-11 9.47.03.png

これでGitHubにpushされると、DockerHubは自動ビルドになる。

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

CI/CD Docker コンテナのモニタリング

起動中コンテナのリソース消費状況を表示

$ docker stats --no-stream
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
a5ed2facaadd        webcentos           0.00%               2.398MiB / 12.37GiB   0.02%               1.31kB / 0B         0B / 0B             2
e3a96695d263        docker_mysql_1      0.12%               187.5MiB / 12.37GiB   1.48%               1.05kB / 0B         0B / 0B             27
cc761f675b3b        docker_nginx_1      0.00%               4.309MiB / 12.37GiB   0.03%               956B / 0B           0B / 0B             2

フォーマットして表示

$ docker stats --no-stream --format "{{.Name}},{{.MemPerc}},{{.CPUPerc}}"   #コンテナ名, メモリ使用率, CPU使用率
webcentos,0.02%,0.00%
docker_mysql_1,1.48%,0.12%
docker_nginx_1,0.03%,0.00%

監視バッチ

1分毎に実行して使用率閾値(80%)を超過したら通知メッセージを飛ばす

#!/bin/bash

# 閾値(%)
LIMIT=90

# コンテナのSTATS取得
CHECK_STATS=$(docker stats --no-stream --format "{{.Name}},{{.MemPerc}},{{.CPUPerc}}") #コンテナ名, メモリ使用率, CPU使用率

while read row; do
  name=`echo ${row} | cut -d , -f 1`     #コンテナ名
  memPer=`echo ${row} | cut -d , -f 2`   #メモリ使用率
  memPer_i=`echo ${memPer%%.*}`
  cpuPer=`echo ${row} | cut -d , -f 3`   #CPU使用率
  cpuPer_i=`echo ${cpuPer%%.*}`

  # メモリ使用率閾値チェック
  if [ $memPer_i -ge $LIMIT ]; then
     message="Container:${name} Memory alert ${memPer}"
     curl -X POST --data-urlencode 'payload={"channel": "#alert", "username": "admin", "text": "${message}"}' <webhook URL>
  fi

  # CPU使用率閾値チェック
  if [ $cpuPer_i -ge $LIMIT ]; then
     message="Container:${name} CPU alert ${cpuPer}"
     curl -X POST --data-urlencode 'payload={"channel": "#alert", "username": "admin", "text": "${message}"}' <webhook URL>
  fi
done < echo "$CHECK_STATS"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

grafanaとpostgresを連携してみた【docker-compose】

起動方法

git clone https://github.com/guedim/grafana-postgres.git
docker-compose up -d

grafanaへログイン

ブラウザから http://localhost:3000/ へアクセス
user : admin
password: foobar
でログインする。
(grafana-postgres/grafana/dashboard/post.sh にて設定してある)

grafanaのGUIでの設定方法

Add data sourceを押して、postgresを設定する
一番難しいところが以下の設定場所。Host名がlocalhost:5432ではなくて、postgres:5432に設定する

grafana_postres_setting.png
入力後、Save & Testを押してDatabase Connection OKが出れば連携完了。

テーブルを可視化

dashboard > table > edit でsql文を書ける画面が出てくる。
https://github.com/guedim/grafana-postgres.git には元々データが入っているので、そのデータを表示した。
tableのeditを選んでsql文を書いた.png

postgres のデータをみる

docker-compose exec postgres bash
su postgres
psql
\d #テーブル一覧表示
\l #database一覧を表示
\d account_metrics #カラム一覧を表示 カラムなのでデータベースを指定してから 
\q #exit
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DockerでPostgreSQLの環境構築(セットアップから開発直前まで)

進め方について

  • 一通りコマンドを叩いて開発直前の工程まで進め、細かい設定は参考サイトを見て調整するスタイル
  • 動かせる環境を作ることを目的としてガンガン進める感じです
  • djangoを動かすための環境構築の一部としてやっているため、postgreSQLのをパスワード未設定で動かすための記述やpostgreSQL以外も若干あります

前提

  • Dockerのインストールが完了していること
    • 苦労した記憶がないので、公式ページなり参考ページなりを見てサクッと入れたと思います
    • 参考までに公式ページへのリンクです
  • mac環境(10.14.6)で実行しています

手順

dockerファイルの準備

特になし。

docker-composeファイルの準備

docker-compose.yml
version: '3'

services:
  db:
    image: postgres
    environment:
        POSTGRES_HOST_AUTH_METHOD: 'trust'
    volumes:
      - ./database:/var/lib/postgresql/data

postgresqlの各種設定

docker上での動作確認のため、事前にDocker上のPostgreSQLを起動してbashを起動した状態にしておく。
ターミナルで以下のコマンドを実行。

# コンテナを起動させる(「-d」をつけてバックグラウンドで実行させる)
docker-compose up -d
# コンテナ名を確認
docker ps
# コンテナへ接続
docker exec -it {postgreSQLのコンテナ名} bash
# postgreSQLへログイン
psql -U postgres
  • ユーザー作成
-- ユーザを作成
create role {role name} with login password '{password}';
-- 作成結果の確認
\du

ロールの付与は別途行う想定ですが、この記事では触れません。
こちらのページを参考に、必要に応じて作成してください。
https://www.dbonline.jp/postgresql/role/index2.html#section1
https://www.dbonline.jp/postgresql/role/index3.html

  • データベース作成
-- データベースの作成
create database {database name};
-- データベース一覧の表示
\l
  • スキーマ作成
-- スキーマの作成
CREATE SCHEMA {schema name};
create schema anpi;

-- スキーマ一覧
\dn
  • テーブルの作成
-- テーブルの作成
create table {schema name}.{table name};

-- テーブル一覧
\dt {schema name}.*;

参考サイト

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

たぶん動くから!Docker でイメージを作成して共有してみよう!

はじめに

この記事では Docker で簡単なコンテナイメージを作成し、Docker Hub で共有してみるまでを記しています。
初心者の記事ですので間違っていたら指摘等いただけると幸いです。

環境

  • macOS Catalina version 10.15.6
  • Docker version 19.03.13
  • Visual Studio Code version 1.42.1

前提条件

Docker をインストールしていること。
インストールしていない場合は以下のリンクを参考にインストールしてみてください。
たぶん動くから!Docker始めてみよう!

コンテナイメージのビルド

コンテナイメージを作成するためにはコンテナの中身となる Dockerfile を作成する必要があります。
以下のコードを書いて Dockerfile という名前で保存します。

Docekrfile
FROM ubuntu:20.04
CMD ["echo", "hello Docker!!"]

コードの内容はオペレーティングシステムである ubuntu を呼び出し、 hello Docker!! と出力しています。

ターミナルで Dockerfile のディレクトリへ移動し、 docker build コマンドを叩きます。

$ docker build -t hellodoc .

-t オプションはイメージ名を指定できます。
.Dockerfile が配置されているパスを示しています。Dockerfileの配置されたディレクトリでコマンドを打っているので . ですね。

ビルド処理が終わったらコンテナイメージを動かしてみます。

$ docker run hellodoc
hello Docker!!

うまく動きましたね!

ローカルのコンテナイメージ一覧は docker images コマンドで確認できます。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hellodoc            latest              32d0a84555ac        2 weeks ago         72.9MB

コンテナイメージの共有

コンテナイメージの動作が確認できたらhello Docker!! と表示されるだけのクソコンテナイメージを Docker Hub で共有してみます。

Docker Hub への登録

Docker Hub は名前からお分かりの通り、Git HubDocker の様なもの(個人的な認識です)で、様々なコンテナイメージが公開されています。

Docker Hub のアカウントを持っていない人は Docker Hub のサインアップページ にアクセスし、サインアップします。

ターミナルから Docker Hub にログインします。

$ docker login -u ■■■■■■■■■
Password: ************
Login Succeeded

■には登録したユーザーアカウントを、*にはパスワードを入力します。

コンテナイメージの共有

コンテナイメージを共有するための形式でビルドします。

docker build -t ■■■■■■■■■/hellodoc:1.0.0 .

共有するためにはイメージ名の命名規則にルールがあります。
* イメージ名の前に自分の Docker Hub アカウント名の配下に配置する。(■の部分を各自のDocker Hubアカウント名に変えてください。)
* イメージ名の後に : とバージョンを記入する。

docker push コマンドでコンテナイメージを登録します。

$ docker push ■■■■■■■■■/hellodoc:1.0.0

処理が終わったら Docker Hub で確認してみましょう。
スクリーンショット 2020-10-10 17.24.17.png
きちんと登録されていますね!

コンテナイメージのダウンロード

登録されたコンテナイメージは docker pull コマンドでローカルにダウンロードできます。

docker pull ■■■■■■■■■/hellodoc:1.0.0
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Docker]dockerでRails5.2環境構築

前提

dockerとdocker-composeインストール済

1. fileを用意

Gemfile, Gemfile.lock, Dockerfile, Docker-compose.ymlを~/Desktop/product-register下におく。

2. Dockerfile

FROM ruby:2.5
RUN apt-get update && apt-get install -y \
      build-essential \
      libpg-dev \
      nodejs \
      postgresql-client \
      yarn
WORKDIR /product-register
COPY Gemfile Gemfile.lock /product-register/
RUN bundle install

3. Docker-compose.yml

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

wsl2でDocker自動起動設定

wsl2を使ってみて、Dockerを自動起動設定ができないらしく、
毎回 serviceコマンドを打つのが面倒なので検討してみた

ユーザでパスワード無しで起動できるようにsudoに設定

$ sudo visudo
# docker deamon auto up
ユーザ ALL=(ALL:ALL) NOPASSWD: /usr/sbin/service docker start
停止時
$ service docker status
 * Docker is not running
起動時
$ service docker status
 * Docker is running

.bashrcにdockerが起動していないときだけ、スタートさせるように追記

$vim .bashrc
#追記
echo $(service docker status | awk '{print $4}') #起動状態を表示
if test $(service docker status | awk '{print $4}') = 'not'; then #停止状態
        sudo /usr/sbin/service docker start #起動
fi

この設定で、wsl2に入るときに、Dockerが停止していたら起動するようになりました。
image.png

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

docker-slimを使うためにPATHを通そう

インストールの手順

  • 公式ページからzipファイルをダウンロード

  • zipファイルを解凍

    • 自分はダウンロードディレクトリからuserディレクトリに移動させました
  • docker-slimにpathを通す

    • ここについて書きます

pathを通す

スクリーンショット 2020-10-10 14.23.40.png
初めはこのように書いてました.
しかしうまいこと行かないなあと.これは書き方が間違っています,

スクリーンショット 2020-10-10 14.49.03.png

これはしっかりPATHが通っています,
・export PATH=通したいPATH
で書いてしまうと上書き保存されてしまうので,うまくいってませんでした.
追加していくには
・export PATH=$PATH:通したいPATH
じゃないとダメみたいです.

基本中の基本ですが,知らなかったので備忘録として書きました.

参考リンク

PATHを通すために環境変数の設定を理解する (Mac OS X)
https://qiita.com/soarflat/items/d5015bec37f8a8254380

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

Docker × Cypress で E2E テスト環境をつくる

Docker 上で Cypress を実行し E2E テストを行いたくて、環境構築の方法をいろいろ探ったメモ。

構成

e2e
├ cypress - integration - sample_spec.js
└ cypress.json
  docker-compose.yml
  Dockerfile

ファイル

Dockerfile

FROM cypress/base:10

RUN npm install --save-dev cypress
RUN npx cypress verify

docker-compose.yml

version: '3'

services:
  e2e:
    container_name: cypress
    build: .
    command: >
      bash -c "cd cypress &&
        npx cypress run -s cypress/integration/sample_spec.js"
    volumes:
      - ./:/cypress

cypress.json

{
    "video": false
}

実行

docker-comopse build
docker-comopse up

感想

いろいろ調べながらやってみるものの、なかなかうまいこといかず。。。
やっぱり公式サイトをちゃんと見るのは大切ですね。

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

DockerでRails5、postgresqlの環境を作り、pgadminも使えるようにする

mysqlしかdockerで使ったことがなくて、時間がかかってしまったので、後で見れるように書きました。
pgadminも便利なので入れました。
docoker-compose upしたあとrails sしなくてもいいようにdocker-compose.ymlにcommandで自動でやってくれるように書きました。

普段はコンテナ再作成しなくてもよいと思うのでdocker-compose start / stopでやる想定です。

Dockerfile
FROM ruby:2.6

RUN apt-get update -y && \
    apt-get install  -y nodejs

COPY Gemfile /Gemfile
COPY Gemfile.lock /Gemfile.lock
RUN gem install bundler
RUN bundle install
docker-compose.yml
version: "3"
services:
  db:
    image: postgres
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: root
      POSTGRES_PASSWORD: root
    volumes:
      - "./postgres-data:/var/lib/postgresql/data"
  pgadmin4:
    image: dpage/pgadmin4:4.2
    ports:
      - 80:80
    volumes:
      - ./docker/pgadmin4:/var/lib/pgadmin
    environment:
      PGADMIN_DEFAULT_EMAIL: root
      PGADMIN_DEFAULT_PASSWORD: root
    depends_on:
      - db
  web:
    build: .
    volumes:
      - ".:/app"
    ports:
      - "3000:3000"
    tty: true
    depends_on:
      - db
    working_dir: "/app"
    command: "rails s -b 0.0.0.0"

mysqlとdatabase.ymlが違っていて、ここらへんを書くところをdevelopとかに書いてしまっていてハマりました。ちゃんとdefaultに書かなくてはいけませんでした。

config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  # ここらへん
  username: root
  password: root
  host: db

参考サイト
pgadmin4/dockerの接続サーバー設定の永続化 - Qiita

rails5のDockerfileとdocker-compose.ymlを書く - Qiita

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

Db2/DBコンテナに初期テストデータを挿入した状態でセットアップ

こんにちは。
今回はIBMのDb2コンテナを使ってスムーズにデータベースのセットアップとテストデータの挿入を行う方法を紹介します。

概要

Db2のコンテナは落としてこれたけど、
立ち上げた段階でテーブルやテストデータをバックグラウンドで作っておいてほしいといった方にオススメのやり方です。

Db2コンテナの落とし方は以下の記事で紹介していますので、ぜひご覧ください。
Db2のDBコンテナを立ててちょっとしたデータを挿入してみる

この記事では、上記の記事の派生として、カスタムコンテナを作る手順を紹介しています。

開発環境

  • Win10 Enterprise
  • docker (v19.03.13)
  • ibmcom/db2 (v11.5.4.0)

前提

  • SQLコマンドが打てる
  • シェルスクリプトが分かる

Getting Started

それでは紹介していきます。
こちらもWindowsでもMacでもLinuxでも操作は変わらないと思います。
Macの環境も自宅にあるので、試してみましたが、難なく動作しました。

1. もろもろ準備

まずはもろもろ準備します。

  • コンテナイメージ
  • 構成情報ファイル
  • SQLファイル
  • テストデータ
  • コンテナイメージ内でSQLとテストデータの挿入を実行するシェルスクリプト
  • Dockerfile

ディレクトリ構成

/project
project
├─data
|    ├─users_insert.csv
|    ├─tweets_insert.csv
|    └─replys_insert.csv
├─sql
|   ├─users_create.sql
|   ├─tweets_create.sql
|   └─replys_create.sql
├─createschema.sh
├─Dockerfile
└─env.list

1.1. コンテナイメージのダウンロード

dockerのローカルリポジトリにDb2のコンテナイメージを保存します。
以下のコマンドを実行します。

$ docker pull ibmcom/db2:11.5.4.0

既にダウンロードしている人は必要ありません。
初回は結構時間かかります。

存在確認します。

$ docker images
REPOSITORY               TAG                            IMAGE ID            CREATED             SIZE
ibmcom/db2               11.5.4.0                       d6b3abc02d57        3 months ago        2.69GB

今回はこのコンテナイメージをベースイメージとして利用します。

1.2. 構成情報ファイル準備

コンテナを実行する際にもろもろ定義した構成ファイルを読み込ませる必要があります。
これは-eオプションでも指定できるんですが、ファイルに置いた方が、Git管理しやすいので、推奨しています。
以下にサンプルを用意しました。

このファイルの説明はこちらでしてます。

env.list
LICENSE=accept
DB2INSTANCE=db2inst1
DB2INST1_PASSWORD=password
DBNAME=USERDB
BLU=false
ENABLE_ORACLE_COMPATIBILITY=false
TO_CREATE_SAMPLEDB=false
PERSISTENT_HOME=true
HADR_ENABLED=false
ETCD_ENDPOINT=
ETCD_USERNAME=
ETCD_PASSWORD=

1.3. SQLファイル準備

今回はつぶやきアプリの作成を想定したデータの準備をしてみます。

簡単なテーブル定義は以下です。

ユーザー

  • ID (PK)
  • 名前
  • メールアドレス
  • パスワード
  • 作成日
  • 更新日

ツイート

  • ID (PK)
  • ユーザーID (FK)
  • 本文
  • 作成日
  • 更新日

リプライ

  • ID (PK)
  • ツイートID (FK)
  • ユーザーID (FK)
  • 本文
  • 作成日
  • 更新日

上記のテーブル定義を元にSQLファイルを書いていきます。
今回は以下の感じで用意しました。

  • ユーザー
users_create.sql
CREATE TABLE users (
    id VARCHAR(36) NOT NULL,
    name VARCHAR(40) NOT NULL,
    mail VARCHAR(100) NOT NULL,
    password VARCHAR(30) NOT NULL,
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL,
    PRIMARY KEY (
        id
    )
);
  • ツイート
tweets_create.sql
CREATE TABLE tweets (
    id VARCHAR(36) NOT NULL,
    user_id VARCHAR(36) NOT NULL,
    body VARCHAR(300),
    created_at TIMESTAMP NOT NULL,
    updated_at TIMESTAMP NOT NULL,
    PRIMARY KEY (
        id
    ),

    FOREIGN KEY (user_id) REFERENCES users(id)
        ON DELETE CASCADE
        ON UPDATE NO ACTION
);
  • リプライ
replys_create.sql
CREATE TABLE replys (
    id VARCHAR(36) NOT NULL,
    tweet_id VARCHAR(36) NOT NULL,
    user_id VARCHAR(36) NOT NULL,
    body VARCHAR(300),
    created_at TIMESTAMP NOT NULL,
    PRIMARY KEY (
        id
    ),

    FOREIGN KEY (tweet_id) REFERENCES tweets(id)
        ON DELETE CASCADE
        ON UPDATE NO ACTION,
    FOREIGN KEY (user_id) REFERENCES users(id)
        ON DELETE CASCADE
        ON UPDATE NO ACTION
);

1.4. テストデータ準備

テストデータの準備をします。
テストデータもSQLファイルでinsert文を書いていけば良いんですが、
メンテナンスが大変なので、今回はCSVファイルに書いていって、それをinsertするという方法を取ります。

挿入するCSVファイルは以下に用意しました。

  • ユーザー
users_insert.csv
hogeeee,hoge,hoge@hoge.com,hogehoge,2020-10-09-12.00.00.000000,2020-10-09-12.00.00.000000
fugaaaa,fuga,fuga@fuga.com,fugafuga,2020-10-10-12.00.00.000000,2020-10-10-12.00.00.000000
  • ツイート
tweets_insert.csv
dba11ffb-b8e0-642d-bb1b-4c8053bdb4bd,hogeeee,これはテストです。,2020-10-09-12.00.00.000000,2020-10-09-12.00.00.000000
b193cb79-0e0c-85d9-2f0a-32d9774bb0aa,fugaaaa,これはテストです。,2020-10-10-12.00.00.000000,2020-10-10-12.00.00.000000
  • リプライ
replys_insert.csv
7e3991a6-d3da-252f-f14f-cfed35a512a7,b193cb79-0e0c-85d9-2f0a-32d9774bb0aa,fugaaaa,テスト確認しました。,2020-10-11-12.00.00.000000
b2da92cf-6bd2-ac1c-618a-b36ef8eb94b1,dba11ffb-b8e0-642d-bb1b-4c8053bdb4bd,hogeeee,テスト確認しました。,2020-10-11-12.00.00.000000

ユーザーを二人用意し、それぞれがテスト用にツイートをポストして、それぞれがそのツイートにリプライしたという想定です。

1.5. シェルスクリプト

こちらの記事でも補足しましたが、
ibmcom/db2:11.5.4.0はdocker runをすると裏で、
まずは、/var/db2_setup/lib/setup_db2_instance.shというシェルスクリプトが実行されます。
このシェルスクリプトは環境情報を元にDb2インスタンスの設定を行い、同時に
/var/db2_setup/include/db2_common_functionsというシェルスクリプトの実行を行っています。
こちらのシェルは、Db2のセットアップを行っています。
さらに最後に

setup_db2_instance.sh
#!/bin/bash

.....省略.....

# If the /var/custom directory exists, run all scripts there. It is for products that build on top of our base image
if [[ -d /var/custom ]]; then
    echo "(*) Running user-provided scripts ... "
    for script in `ls /var/custom`; do
       echo "(*) Running $script ..."
       /var/custom/$script
    done
fi

.....省略.....

という記述があるのですが、
つまり最終的にコンテナ内の/var/custom/ディレクトリにあるスクリプトが呼ばれるわけですね。
ここにデータ挿入のシェルスクリプトを呼ばせて、初期設定するわけです。

しかし、
デフォルトでは/var/customは存在しないので、自分で作る必要があります。
これは後述のDockerfile作成で紹介します。

それではテーブルを作って、データを挿入する命令を出すシェルスクリプトを書いていきます。

createschema.sh
#!/bin/bash

export PATH=/database/config/db2inst1/sqllib/bin/:$PATH

db2 connect to USERDB user db2inst1 using password

# テーブル作成
db2 -tvf /var/custom/sql/users_create.sql
db2 -tvf /var/custom/sql/tweets_create.sql
db2 -tvf /var/custom/sql/replys_create.sql

# データを挿入
db2 import from /var/custom/data/users_insert.csv of del insert into users
db2 import from /var/custom/data/tweets_insert.csv of del insert into tweets
db2 import from /var/custom/data/replys_insert.csv of del insert into replys

# Terminate
db2 terminate
touch /tmp/end.txt

まずdb2コマンドを使えるようにPATHを通しています。
そして、SQLファイルを順番に実行していき、上で宣言したテーブルを作っていきます。

db2 -tvfの意味は

  • -t セミコロン(;)をステートメントの終了文字として認識し、コマンドを実行するオプション
  • -v コマンド・テキストを標準出力するオプション。ログでの確認に便利
  • -f コマンドをファイルから読み込むオプション。今回はSQLファイルからコマンドを読み込むので指定

db2 import from ${filename} of del insert into ${tablename}の意味は

  • import from filename ファイルからデータを読み込む構文。
  • of del insert into csvファイルではカンマ区切りでデータを指定したため、カンマ区切りでデータの挿入が行われる

1.6. Dockerfileの準備

それでは最後にカスタムDb2コンテナのイメージをビルドするDockerfileを作成します。

もろもろ設定あると思いますが、かなりそぎ落として簡単なDockerfileにします。

再掲ですが、プロジェクトのディレクトリ構成は以下です。

/project
project
├─data
|    ├─users_insert.csv
|    ├─tweets_insert.csv
|    └─replys_insert.csv
├─sql
|   ├─users_create.sql
|   ├─tweets_create.sql
|   └─replys_create.sql
├─createschema.sh
├─Dockerfile
└─env.list
Dockerfile
FROM ibmcom/db2:11.5.4.0
RUN mkdir /var/custom
RUN mkdir /var/custom/sql
RUN mkdir /var/custom/data
COPY ./sql/*.sql /var/custom/sql/
COPY ./data/*.csv /var/custom/data/
COPY createschema.sh /var/custom/
RUN chmod 444 /var/custom/sql/*.sql
RUN chmod 444 /var/custom/data/*.csv
RUN chmod a+x /var/custom/createschema.sh

まずベースイメージとして、落としてきたibmcom/db2:11.5.4.0を指定します。
このコンテナをカスタムしていきます。

すでに伝えたように/var/custom/ディレクトリを作ることで、
セットアップ時にそこに指定したスクリプトが呼ばれるため、mkdirをします。
sqlファイルなどは専用のディレクトリを作りました。

そこに用意したファイルをコピーしていきます。
さらに権限を読み取り専用で設定します。
createschema.shはシェルスクリプトを実行する必要があるので、実行権限を与えます。

これでカスタムイメージをビルドする準備ができました。

2. カスタムコンテナイメージ作成

続いて、準備したもろもろを使って、カスタマイズしたコンテナイメージを作成します。
みなさんご存知docker buildですね。

今回は識別しやすいようにtest-db:v1.0というタグを付けていきます。

$ docker build -t test-db:v1.0 .

ディレクトリはDockerfileがある場所で実行してください。
初回はかなり時間がかかると思います。
キャッシュがある方は1秒くらいで終わりますかね。

ビルドが完了したら存在を確認します。

$ docker images
REPOSITORY               TAG                            IMAGE ID            CREATED             SIZE
test-db                  v1.0                           186064b82d09        28 minutes ago      2.69GB

できてますね。

3. カスタムコンテナ実行

それではカスタムしたコンテナを起動しましょう。

$ docker run --name test-db --restart=always --detach --privileged=true -p 50000 --env-file env.list test-db:v1.0

コンテナ名はtest-dbとして、構成情報は用意したenv.listを指定しています。

実行すると、コンテナIDを吐くだけで、いつセットアップが終わったのか分からないので、ログを見てみます。

$ docker logs -f test-db


SQL3109N  The utility is beginning to load data from file
"/var/custom/data/replys_insert.csv".
(*) Previous setup has not been detected. Creating the users...
(*) Creating users ...
(*) Creating instance ...
DB2 installation is being initialized.

 Total number of tasks to be performed: 4
Total estimated time for all tasks to be performed: 309 second(s)

Task #1 start
Description: Setting default global profile registry variables
Estimated time 1 second(s)
Task #1 end

Task #2 start
Description: Initializing instance list
Estimated time 5 second(s)
Task #2 end

Task #3 start
Description: Configuring DB2 instances
Estimated time 300 second(s)
Task #3 end

Task #4 start
Description: Updating global profile registry
Estimated time 3 second(s)
Task #4 end

The execution completed successfully.

.........省略.........

SQL3110N  The utility has completed processing.  "2" rows were read from the
input file.

SQL3221W  ...Begin COMMIT WORK. Input Record Count = "2".

SQL3222W  ...COMMIT of any database changes was successful.

SQL3149N  "2" rows were processed from the input file.  "2" rows were
successfully inserted into the table.  "0" rows were rejected.


Number of rows read         = 2
Number of rows skipped      = 0
Number of rows inserted     = 2
Number of rows updated      = 0
Number of rows rejected     = 0
Number of rows committed    = 2

DB20000I  The TERMINATE command completed successfully.
(*) Running data ...
/var/db2_setup/lib/setup_db2_instance.sh: line 201: /var/custom/data: Is a directory
(*) Running sql ...
/var/db2_setup/lib/setup_db2_instance.sh: line 201: /var/custom/sql: Is a directory
          from "/database/data/db2inst1/NODE0000/SQL00001/LOGSTREAM0000/".

2020-10-10-01.35.55.270890+000 E239025E525           LEVEL: Event
PID     : 18622                TID : 140605766231808 PROC : db2sysc 0
INSTANCE: db2inst1             NODE : 000            DB   : USERDB
APPHDL  : 0-7                  APPID: *LOCAL.db2inst1.201010013552
AUTHID  : DB2INST1             HOSTNAME: 99a855c216d7
EDUID   : 22                   EDUNAME: db2agent (idle) 0
FUNCTION: DB2 UDB, base sys utilities, sqeLocalDatabase::FreeResourcesOnDBShutdown, probe:16544
STOP    : DATABASE: USERDB   : DEACTIVATED: NO

こういう感じのログが吐かれると思います。

終了フラグとしては
DB20000I The TERMINATE command completed successfully.
このログが出ていたら、セットアップは終了しています。

テーブルの作成は、少し上にさかのぼっていただくと、

CREATE TABLE users ( id VARCHAR(36) NOT NULL, name VARCHAR(40) NOT NULL, mail VARCHAR(100) NOT NULL, password VARCHAR(30) NOT NULL, created_at TIMESTAMP NOT NULL, updated_at TIMESTAMP NOT NULL, PRIMARY KEY ( id ) )
DB20000I  The SQL command completed successfully.

というログが出ていまして、何もエラーが無ければThe SQL command completed successfullyで正常に終了しています。

データ挿入に関しては、Number of rows committted = 2とかのログが見えると思います。
これが挿入したデータがどういったステータスで終了したかを表すログになります。
今回はinserted = 2で、rejected = 0なので、すべて正常に挿入されています。
これがrejected = 2となっていたら、2件のデータ挿入に失敗しているので、調査が必要です。

もし途中で失敗していたり、実行しなおしたいと思ったときは、

# 実行コンテナの強制削除
$ docker rm -f test-db
test-db

# コンテナイメージの削除
$ docker rmi test-db:v1.0

で、きれいさっぱり削除できます。
コンテナを実行しなおしたいだけの時は上のコマンドを、SQLファイルを変更したり、Dockerfileを変更したりした時は、上と下のコマンド両方を実行します。

4. 挿入したデータの存在確認

それでは、挿入したデータが期待通りの値でちゃんと挿入されているか確認してみましょう。

実際にコンテナ内に入ってDBと接続し、SELECT文を打ってみます。

$ docker exec -it test-db bash -c "su - db2inst1"
Last login: Sat Oct 10 01:46:02 UTC 2020
[db2inst1@99a855c216d7 ~]$ db2 connect to userdb

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.4.0
 SQL authorization ID   = DB2INST1
 Local database alias   = USERDB

[db2inst1@99a855c216d7 ~]$ db2 "select * from users"
ID                                   NAME                                     MAIL                                                                                                 PASSWORD                       CREATED_AT                 UPDATED_AT
------------------------------------ ---------------------------------------- ---------------------------------------------------------------------------------------------------- ------------------------------ -------------------------- --------------------------
hogeeee                              hoge                                     hoge@hoge.com                                                                                        hogehoge                       2020-10-09-12.00.00.000000 2020-10-09-12.00.00.000000
fugaaaa                              fuga                                     fuga@fuga.com                                                                                        fugafuga                       2020-10-10-12.00.00.000000 2020-10-10-12.00.00.000000

  2 record(s) selected.

[db2inst1@99a855c216d7 ~]$ 

ちゃんとcsvファイルで書いたデータが挿入されていますね。
コンテナから出るときはexitと打つと出れます。

まとめ

さぁ、いかがでしたでしょうか?
簡単にではございますが、Db2にデータを挿入した状態でのセットアップ方法を紹介しました。
このコンテナイメージは使いまわせるので、他のプロジェクトで別のDockerfileを書いて別のカスタムイメージもすぐに作れますし、
簡単にそのプロジェクトの仕様に沿ったデータベースを構築することができます。

また、揮発性なので、データを挿入しまくっても、docker rm -fで消してしまえば、次の立ち上げの時には簡単に初期化できるので、テストも大変しやすくなります。

このデータベースをGUIで操作する方法など、今後調べていこうと思います。

また、実際にこのデータベースに接続して、データを操作する方法をGo言語を使って説明する記事も書こうと思います。

参考文献

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

[初心者でもできた]RailsアプリにDockerを導入する方法!

こんにちは。「Gitって何???」って状態から独学でプログラミングを勉強し始め、今はRails API × Nuxt SPA × Firebase AuthでTodoアプリを作成し終えたところです。

そこにDockerを導入したので今回はその導入方法をご紹介します。

はじめに

Dockerを導入したいと思うようになったきっかけの記事
Vue.jsとRails APIモードでストレスフリーに少人数開発できた話
自分でもDockerを導入できれば今後チーム開発で役立つと確信した。

とりあえずDocker試す

で、なにから始めればいいの?すでにアプリ完成してるんだけど、、、
既存のRailsアプリにDockerを導入できるのかな、、、

まず試したのがこの記事。
丁寧すぎるDocker-composeによるrails5 + MySQL on Dockerの環境構築(Docker for Mac)
10分くらいでできたのでDockerって意外と簡単かもって少し思えました。

では、実際にRailsアプリにDockerを導入していく。

Docker導入

まずはインストール
docker for mac

~$ docker -v
Docker version 19.03.12, build 48a66213fe
~$ docker-compose -v
docker-compose version 1.26.2, build eefe0d31

Dockerを導入したいRailsアプリに移動

~ $ cd backend

Dockerファイルを作成

以下を参考
既存のRailsアプリにDockerを導入する手順

~/backend $ vi Dockerfile
FROM ruby:2.7.1
RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y postgresql-client --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

WORKDIR /myproject

ADD Gemfile /myproject/Gemfile
ADD Gemfile.lock /myproject/Gemfile.lock

RUN gem install bundler
RUN bundle install

ADD . /myproject

?FROMでどのDockerイメージからコンテナを生成するか記述
使用できるコンテナイメージはdockerhubから確認します。
今回はrails2.7.1をインストールしました
(Dockerfileで指定するバージョンは、プロジェクトのRubyバージョンに合わせておく必要があります)

?RUNでコマンド実行
mysqlだとエラーが出すぎて嫌になったので今回はpostgresqlを使用

?WORKDIRで各種命令実行時のカレントディレクトリを指定

?ファイル / ディレクトリの追加

docker-compose.yml作成

~/backend $ vi docker-compose.yml
docker-compose.yml
#docker-composeのバージョン
version: '3'
services:
  db:
    image: postgres
    ports:
      - '5432:5432' # ホストからゲストへポートフォワード
    volumes:
      - postgresql-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=password
  web:
    build:
      context: .
      dockerfile: Dockerfile
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    tty: true
    stdin_open: true
    depends_on:
      - db # DB側のコンテナが出来上がってからwebを実行する
    ports:
      - "3000:3000" # ホストからゲストへポートフォワード
    volumes:
      - .:/myproject # ソースコード変更したらDocker側も即反映されるように
volumes:
  postgresql-data:
    driver: local

?僕はPostgreSQL(Docker)にRails(Docker)が接続できなくなったのでpostgresコンテナに環境変数POSTGRES_PASSWORDを設定して、その値をconfig/database.ymlのpasswordに定義しました。

参考
PostgreSQL(Docker)にRails(Docker)が接続できなくなったから調べてみた。(could not translate host name "db" to address: Name or service not known)

database.yml編集

database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myproject_development

test:
  <<: *default
  database: myproject_test

?アンカー: 名前をつける機能

&default

?エイリアス: 名前をつけたものを呼び出す

*default

?ハッシュのマージ: 一つにまとめる

<<: *default
database.yml
default: &default #ここで共通部分にアンカーで名前をつけておくと
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default #ここでdefaultとして呼び出し、スッキリ書ける
  database: myproject_development

test:
  <<: *default #ここでdefaultとして呼び出し、スッキリ書ける
  database: myproject_test

参考
【YAML】Railsのdatabase.ymlについてなんとなく分かった気になっていた記法・意味まとめ

build

サービスのビルドを実行します。
サービスとは「web」や「db」のことを指します。ymlファイルにimage:が書かれている場合はそのイメージ名がローカルになければ、リモートからプルしてきます。imageが書かれていない場合、buildに書かれているパスの(デフォルトは)Dockerfileを参考にしてイメージを構築します。

~/backend $ docker-compose build
~/backend $ docker-compose run web rake db:create db:migrate
~/backend $ docker-compose up

これで localhost:3000 にアクセスしたら確認できます!

僕は仕事終わりに試してはエラーがでて、、、を繰り返しなんだかんだ導入に一週間は使いました笑

最後に

今回、未経験からWeb系エンジニアに転職したく勉強しました。
Dockerのメリットなど知らないことが多いので、これを機にもっと勉強します。
1月からの入社を目指してがんばるぞ〜

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

DockerのゲストOSをCentOS 7.4として古いVivadoを動かす

Linux版Vivadoの動作環境について

  みなさんこんにちは。よくFPGA開発をする際問題になるのは,Vivadoのバージョンだったりします。
何年も前から続いてるプロジェクトだったりするとどうしても最新のVivadoが使えないケースも出てきます。
このとき困るのは,VivadoをLinux上で動かす必要があるときです。

Xilinxのページによると,Vivado 2018.2が動作可能なLinuxとしては

  • Red Hat Enterprise Workstation/Server 7.2、 7.3、 および 7.4 (64 ビッ ト )
  • Red Hat Enterprise Workstation 6.6、 6.7、 6.8、 および 6.9 (64 ビッ ト )
  • SUSE Linux Enterprise 11.4 および 12.3 (64 ビッ ト )
  • CentOS 7.2、 7.3、 および 7.4 (64 ビッ ト )
  • CentOS 6.7、 6.8、 および 6.9 (64 ビッ ト )
  • Ubuntu Linux 16.04.3 LTS (64 ビッ ト )

が挙げられています。どれもこれも少なくとも3年くらい前の古いOSです。
急遽Vivado 2018.2が必要になったからといって,新しい環境のPCを仕立ててくるのも,大変です。
そこでDockerの出番です。

試した環境

ホスト側OS

  • Ubuntu 20.04 LTS
  • Dockerはaptからインストールできるものを使用

ゲスト側OS

  • Cent OS 7.4

手順

Dockerfileを用意する

まず次のようなDockerfileを用意しました。

FROM centos:7.4.1708

RUN yum update -y
RUN yum groupinstall -y "Development Tools"
RUN yum install -y kernel-devel kernel-headers
RUN yum install -y gtk2-devel
RUN yum install -y libcanberra libcanberra-devel
RUN yum install xauth libXtst libXrender -y
RUN yum install -y xeyes
RUN yum install -y sudo
RUN yum clean all

ARG uid=1000
ARG gid=1000
RUN groupadd -g ${uid} kohei && \
    useradd -u ${gid} -g kohei -G wheel,root kohei && \
    chown ${uid}:${gid} -R /home/kohei

RUN echo 'Defaults visiblepw'             >> /etc/sudoers
RUN echo 'kohei ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER kohei
WORKDIR /home/kohei

Dockerfileでは開発ツール一式,X11クライアントとして動かすために必要なもの一式,sudoをインストールするようにしています。
また当初試したときいくつかのライブラリが不足したため,それを補うようにしてあります。

パスワード無しでsudoできるようにもしてあります。

Dockerイメージのビルド

このDockerfileからビルドするイメージをcentos_xilとして次のコマンドでビルドを行います。

docker build -t centos_xil .

ビルドしたイメージの起動

docker run -ti --rm --name centos_xil \
           -e DISPLAY=$DISPLAY \
           -v /tmp/.X11-unix/:/tmp/.X11-unix \ 
           -v /home/kohei:/home/kohei \
           centos_xil /bin/bash

ここで注意しておきたいのは,まずゲストOS側でアプリケーションを実行して,ホスト側のXサーバにGUIが表示されるようにするため,
環境変数DISPLAYをコンテナに渡し,X11の環境をマウントによってコンテナとホスト側で共有するようにしていることです。
次にホームディレクトリを共有していることにも注目する必要があります。Vivadoのインストールによってイメージが肥大することを防いだり,開発環境をコンテナとホスト側でやりとりしたりする手間を省く効果を狙っています。

Vivadoのインストール

コンテナ上でVivadoのインストーラを実行します。インストーラはホームディレクトリに一時ファイル置き場を作ってそこにダウンロードしておくのが良いでしょう。日本語の名前になっている「ダウンロード」ディレクトリには入れない可能性があります。インストール先は権限の問題などもあり,~/Xilinxとしました。

VivadoとSDKの動作確認

上記の手順を踏むことで,問題なくVivadoとSDKが起動することは確認できました。

Vivadoについてはデザインのコンパイルも問題なく行えました。

参照したページ(順不同)

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

【Python】Docker で OpenCV 環境構築 ( cv2.imshow() も動く )

以前このような Qiita ( Ubuntu, Python, OpenCV な環境を Docker 上でつくった ) を書いたのですが cv2.imshow() が機能せずいろいろ試行錯誤していました。

この記事では Docker 環境でもちゃんと cv2.imshow() が動くようにする方法を書きます。

ホスト OS は MacOS Catalina です。

1. XQuartz インストール

https://www.xquartz.org/

インストールしたら XQuartz の環境設定からセキュリティタブのネットワーク・クライアントからの接続を許可にチェックを入れる。

2. xhost 開放

xhost +

3. Docker run

docker run -it \
-v $(pwd):/code \
-v ~/.Xauthority:/root/.Xauthority \ # Docker と GUI のやり取りをするために必要
-e DISPLAY=$(hostname):0 \ # Docker と GUI のやり取りをするために必要
-p 8888:8888 \ # Jupyter 用
--name opencv \ 
ubuntu /bin/bash

4. 各種アップデート・インストール

コンテナ内で以下を実行

apt-get -y update && apt-get -y upgrade && \
apt-get -y install python3-pip vim libgl1-mesa-dev libgtk2.0-dev && \
pip3 install numpy opencv-python jupyterlab pandas matplotlib scikit-learn seaborn scipy

5. 動作チェック

  1. ホスト PC で XQuartz 立ち上げる

  2. Jupyter 起動 ( コンテナ内 )

jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=''
  1. ホスト PC のブラウザで http://localhost:8888/ にアクセス

  2. Jupyter で以下を実行

import cv2

img = cv2.imread('test.jpeg') # なにか適当な画像を入れておく
img.shape # => ( 画像の縦の長さ, 横の長さ, 3 ) が返ってくる

cv2.imshow('img', img) # 画像を表示したいときはこの 3 行セットで実行する
cv2.waitKey(0)
cv2.destroyAllWindows

以上がエラーなく動作すれば OK !! お疲れさまでした !!!

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

Docker Desktop for Mac をHomebrewでインストールする

目的

  • HomebrewでDocker Desktop for Macをインストールする方法をまとめる

前提条件

  • Homebrewが使える状態になっていること。($ brewコマンドが実行できること)

詳細

  1. 下記コマンドを実行してHomebrewを最新状態にする。

    $ brew update
    
  2. 下記コマンドを実行してDockerをインストールする。

    $ brew install docker
    $ brew cask install docker
    
  3. 下記コマンドを実行してインストールしたファイルを開く。

    $ open /Applications/Docker.app
    
  4. ユーザパスワードを聞かれたら入力する。

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

たぶん動くから!Docker始めてみよう!

はじめに

この記事はDockerのインストール時のメモです。
Dockerのインストール方法から簡単なDockerの操作確認までを記します。

インストール環境

macOS Catalina
バージョン 10.15.6

インストール手順

  1. Dockerの公式サイトからダウンロードする。 公式サイトで [Get Started] を押下。 スクリーンショット 2020-10-09 23.25.21.png
  2. Docker Desktop の [Download for Mac] を押下。 スクリーンショット 2020-10-09 23.26.00.png
  3. ダウンロードした Docker.dmg を開き、Docker.appApplications にドラック&ドロップする。 スクリーンショット 2020-10-09 23.56.38.png
  4. アプリケーションフォルダから Docker.app をダブルクリックして起動する。 この時、認証の設定等聞かれることがあるので聞かれた通りに答える。
  5. メニューバーにクジラのマークの Docker のアイコンが出たらインストール完了! スクリーンショット 2020-10-10 0.06.10.png

コンテナの操作

Docker はターミナルで操作し、全て docker コマンドを用いる。

コンテナの起動と確認

Docker の操作確認のために Docker Hub ( Git Hub の Docker版 ) で公開されている webサーバーである nginx コンテナを起動する。
コンテナの起動には docker run コマンドを用いる。

$ docker run nginx:1.19.3

最初はローカルにコンテナイメージがなかったため、イメージを取得し、以下のように表示される。

Unable to find image 'nginx:1.19.3' locally
1.19.3: Pulling from library/nginx
d121f8d1c412: Pull complete 
66a200539fd6: Pull complete 
e9738820db15: Pull complete 
d74ea5811e8a: Pull complete 
ffdacbba6928: Pull complete 
Digest: sha256:fc66cdef5ca33809823182c9c5d72ea86fd2cef7713cf3363e1a0b12a5d77500
Status: Downloaded newer image for nginx:1.19.3

Docker を起動したまま別のターミナルから docker ps コマンドで nginx コンテナの起動を確認する。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
51d72c08c122        nginx:1.19.3        "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        80/tcp              gracious_lalande

nginx のバージョン1.19.3が 51d72c08c122 というIDで起動していることが確認できる。

コンテナの停止

docker ps コマンドで取得した CONTAINER ID を指定して実行する。

$ docker stop 51d72c08c122

docker ps コマンドで確認する。

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

起動中のコンテナIDがないことが確認できる。

ちなみに docker start コマンドに先ほどのコンテナIDを指定すれば、同じコンテナを再び起動できる。

$ docker start 51d72c08c122

コンテナの削除

コンテナの削除にはコンテナを停止後、コンテナIDを指定して docker rm コマンドを用いる。

$ docker rm 51d72c08c122

処理後、docker start コマンドに先ほどのコンテナIDを指定し起動してみると、

$ docker start 51d72c08c122
error during connect: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/51d72c08c122/start: EOF
Error: failed to start containers: 51d72c08c122

該当のコンテナIDの起動に失敗したというエラーが返ってきて、コンテナが削除されていることが確認できる。

イメージ一覧

docker images コマンドでローカルのホストにあるイメージ一覧を表示することができる。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               1.19.3              992e3b7be046        3 days ago          133MB

イメージ削除

$ docker rmi nginx:1.19.3

コンテナでイメージを作成・共有

次はコンテナでイメージを作成・共有してみます。
たぶん動くから!Docker でイメージを作成して共有してみよう!

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

Dockerと仮装サーバーとコンテナについて

Docker!仮想サーバー!コンテナ!について

Dockerとは

コンテナ化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアのこと!

bit201712121505387423.jpg

仮想サーバーとは

1台のサーバーで仮想的に複数のサーバーを稼働させる仕組みのこと!

コンテナとは

他のユーザーから隔離された実行環境のこと。仮想サーバーに比べて起動時間が短く、同じ性能のハードウェアであれば、より多くのコンテナを同時に動かすことができる!

デプロイの種類について

カナリアリリースとは

一部のユーザーにのみ新機能の公開を行い、新しいバージョンにバグなどがないかを検証する手法のこと。サービスに不具合があっても全体に影響しませんよ!というもの。

ブルーグリーンデプロイメントとは

仮想サーバーを用い、2つの本番環境を用意し、それぞれバージョンを設定することができるデプロイの運用方法のこと。2つ用意するからどちらかに不具合が生じた場合どちらかにリクエストの方向を変える事ができる為、その間に不具合が生じた方をロールバックする事ができる!

イミュータブルデプロイメントとは

常に変更を行わない環境を構築することで、デプロイ時に新しい環境に切り替える手法のこと。古い環境を消去しますよというもの!

Docker公式 http://docs.docker.jp/

まとめ

Dockerについて概要を知るkとができましたね。おまけでクラウドの種類もよく使われるので載せておきます。

おまけ

SaaS

「Software as a Service」の略で、「サース」または「サーズ」と読む。
クライアント側に導入せずに、サービスを提供しているサーバーに直接アクセスをしてサービスを利用する状況を指す!
(例)
Microsoft Office 365などのオフィスソフト
GmailなどのWebメール
Dropboxなどのオンラインストレージ
サイボウズなどのグループウェア

PaaS

「Platform as a Service」の略で、「パース」と読む。
作成したアプリケーションなどを、ネットワーク上に公開するためのプラットフォームを提供するサービスのこと!
(例)
Heroku

IaaS

「Infrastructure as a Service 」の略で、「イアース」や「アイアース」と読む。
サービスを利用するユーザーが、仮想化をしたCPUやメモリ、ストレージなどをインターネット経由で提供するサービスのこと!
(例)
Microsoft Azure
Google Compute Engine

現場からは以上です!

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