- 投稿日:2020-10-10T23:47:10+09:00
DockerのBuildKitを有効化する (mac)
Docker for Macの「Preferences」を開き、「Docker Engine」のConfigureを以下のように変更する
{ "debug": true, "experimental": true, "features": { "buildkit": true } }変更したら右下の「Apply & Restart」を押して反映する
.bashrc
もしくは.zshrc
に以下の環境変数を追加するexport DOCKER_BUILDKIT=1 export COMPOSE_DOCKER_CLI_BUILD=1シェルを再起動する
これでdocker build
及びdocker-compose build
でBuildKitが有効になる
- 投稿日:2020-10-10T22:44:58+09:00
【俺得】SAM CLIでデプロイする迄
AWS CLIインストール
pythonとpipのpath追記 ※前段作業
・pythonとpipのPath確認方法
エクスプローラで確認・pathの追記
コマンドプロンプトから下記を開いていく
システムとセキュリティ→システム→システムの詳細設定→環境変数
システム環境変数の一覧からPathを選択し、編集をクリック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 IoTS3の確認
C:\Users\USER>aws s3 ls --profile IoT 2020-10-10 14:46:01 test7712121AWS SAM CLIインストール
Dockerのインストール ※前段作業
まずはタスクマネージャー→パフォーマンスタブ→CPUの
右下の「仮想」の欄が有効になっていることを確認。Dockerのを入れるにあたりWindows10HomeではDokcer Desktop for Windows が入らないため
今回は代わりにDocker Toolboxをインストールすることにしました。
下記サイトから「Install Docker Toolbox for Windows」からv19.03.1をインストール
https://docs.docker.com/toolbox/overview/Dockerのインストールの途中で下記がインストールが表示された場合はインストールする。
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.2initが考えていた挙動とは違い指定等ができなかったが
buildをしようとするとできない状態が発生!!実はインストーラのバージョンが古い為だと判明したため、
最新のSAMをインストールすると無事解決!ビルドとデプロイ
まずはsam initでAWS SAM テンプレートを使用して
サーバーレスアプリケーションを初期化します。
ちなみにプロジェクトを変える時などの初回時だけで大丈夫。今回の設定は
: 1 - AWS Quick Start Templates
言語 : 8 - python3.7
Project name : test2
templates : 1 - Hello World ExampleC:\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 --guidedsam 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してみると成功。
- 投稿日:2020-10-10T22:35:29+09:00
昨今のエンジニアのインフラ技術を料理で無理矢理例えてみた。
はじめに
この記事の想定対象者は
- 自分はエンジニア(開発者)ではありません
- でも、エンジニアと関わります。(企画とかマネジメントとか)
- そのため、最低限エンジニアのインフラ知識ないとエンジニアの皆様に『そんなことも知らねーのかよ勉強して出直せ』と怒られます
- でも、少しググったけど何もわからないんです
という人々です人類どんな人がいようと食べない人はいないだろうということで、無理矢理料理で例える努力をしてみました。
ので、日頃サーバー触っているエンジニアの方々はあまり対象ではありません
もしかしたらプログラミングはできるけどインフラ周り何もわからないっていう人の助けにはなるかもしれません。
ならないかもしれません。具体的な技術について
- クラウド(いわゆるパブリッククラウド。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とはなんじゃ...」と思っている節があり、そういう人たちが少しでもイメージしやすくなるといいなと思って書きました割と勢いで書きました。正直お酒飲んでます
ので、あんまり批判が多かったら冷静になった僕が消すかもしれません兎にも角にも、ここまで読んでくださりありがとうございました。
- 投稿日:2020-10-10T22:01:10+09:00
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.htmlDockerマニュアル(英語)のインストールマニュアルをみると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-752020/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 <以下略>
- 投稿日:2020-10-10T21:44:07+09:00
【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-bundlenewのあとの「.」はカレントディレクトリを示します。「--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超入門 --著」
→初学者が書籍で学びたい場合はこれがとっかかりやすい。
- 投稿日:2020-10-10T21:27:39+09:00
ざっくりすぎる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 DockerfileDockerfileFROM 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 GemfileGemfilesource 'https://rubygems.org' gem 'rails', '~> 5.2.4', '>= 5.2.4.4'$ touch Gemfile.lock$ vi docker-compose.ymldocker-compose.ymlversion: '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.ymldatabase.ymldefault: &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.ymlversion: '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/何か改善点あればよろしくおねがいしますー
- 投稿日:2020-10-10T21:24:31+09:00
Reactの開発環境をDockerで作る
動機
React/Reduxの開発環境をDockerで作成した際の備忘録。
環境
macOS Catalina 10.15.5
Docker version 19.03.13
docker-compose version 1.27.4Dockerfile
From node:latest WORKDIR /usr/src/app RUN npm install -g create-react-appdocker-compose
docker-compose.ymlversion: '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
開発環境:developmentcommand
イメージの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 logindocker hubにpush
docker push <DockerhubID>/<image名>:タグ名これでDockerhubのレポジトリに/が追加される。
自動ビルド設定
GitHubと連携する手順を示す。事前にGitHubにレポジトリを用意する必要がある。
Dockerhubから対象のrepositoryを選択 → 「Builds」 → 「Link to GitHub」
Repositoryを選択すると下の選択画面が開く。AUTESTをOffにすると自動ビルドされないので、それ以外を選択。REPOSITORY LINKSはお好きに。BUILD RULESは自動ビルドの詳細設定。デフォルトでよければこれで。
作成当初はSave and Buildで。
- 投稿日:2020-10-10T21:24:31+09:00
Reactの開発環境をDockerで作る。イメージの作成→コンテナ起動→DockerHubにpush
動機
React/Reduxの開発環境をDockerで作成した際の備忘録。
環境
macOS Catalina 10.15.5
Docker version 19.03.13
docker-compose version 1.27.4Dockerfile
From node:latest WORKDIR /usr/src/app RUN npm install -g create-react-appdocker-compose
docker-compose.ymlversion: '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
開発環境:developmentcommand
イメージの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 logindocker hubにpush
docker push <DockerhubID>/<image名>:タグ名これでDockerhubのレポジトリに/が追加される。
自動ビルド設定
GitHubと連携する手順を示す。事前にGitHubにレポジトリを用意する必要がある。
Dockerhubから対象のrepositoryを選択 → 「Builds」 → 「Link to GitHub」
Repositoryを選択すると下の選択画面が開く。AUTESTをOffにすると自動ビルドされないので、それ以外を選択。REPOSITORY LINKSはお好きに。BUILD RULESは自動ビルドの詳細設定。デフォルトでよければこれで。
作成当初はSave and Buildがいいっぽい。
これでGitHubにpushされると、DockerHubは自動ビルドになる。
- 投稿日:2020-10-10T20:47:04+09:00
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"
- 投稿日:2020-10-10T20:20:39+09:00
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に設定する
入力後、Save & Testを押してDatabase Connection OKが出れば連携完了。テーブルを可視化
dashboard > table > edit でsql文を書ける画面が出てくる。
https://github.com/guedim/grafana-postgres.git には元々データが入っているので、そのデータを表示した。
postgres のデータをみる
docker-compose exec postgres bash su postgres psql \d #テーブル一覧表示 \l #database一覧を表示 \d account_metrics #カラム一覧を表示 カラムなのでデータベースを指定してから \q #exit
- 投稿日:2020-10-10T18:54:07+09:00
DockerでPostgreSQLの環境構築(セットアップから開発直前まで)
進め方について
- 一通りコマンドを叩いて開発直前の工程まで進め、細かい設定は参考サイトを見て調整するスタイル
- 動かせる環境を作ることを目的としてガンガン進める感じです
- djangoを動かすための環境構築の一部としてやっているため、postgreSQLのをパスワード未設定で動かすための記述やpostgreSQL以外も若干あります
前提
- Dockerのインストールが完了していること
- 苦労した記憶がないので、公式ページなり参考ページなりを見てサクッと入れたと思います
- 参考までに公式ページへのリンクです
- mac環境(10.14.6)で実行しています
手順
dockerファイルの準備
特になし。
docker-composeファイルの準備
docker-compose.ymlversion: '3' services: db: image: postgres environment: POSTGRES_HOST_AUTH_METHOD: 'trust' volumes: - ./database:/var/lib/postgresql/datapostgresqlの各種設定
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}.*;参考サイト
- 投稿日:2020-10-10T17:32:13+09:00
たぶん動くから!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
という名前で保存します。DocekrfileFROM 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 Hub
のDocker
の様なもの(個人的な認識です)で、様々なコンテナイメージが公開されています。
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
で確認してみましょう。
きちんと登録されていますね!コンテナイメージのダウンロード
登録されたコンテナイメージは
docker pull
コマンドでローカルにダウンロードできます。docker pull ■■■■■■■■■/hellodoc:1.0.0
- 投稿日:2020-10-10T15:47:40+09:00
[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 install3. Docker-compose.yml
- 投稿日:2020-10-10T15:09:20+09:00
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
- 投稿日:2020-10-10T14:57:15+09:00
docker-slimを使うためにPATHを通そう
インストールの手順
公式ページからzipファイルをダウンロード
zipファイルを解凍
- 自分はダウンロードディレクトリからuserディレクトリに移動させました
docker-slimにpathを通す
- ここについて書きます
pathを通す
初めはこのように書いてました.
しかしうまいこと行かないなあと.これは書き方が間違っています,これはしっかりPATHが通っています,
・export PATH=通したいPATH
で書いてしまうと上書き保存されてしまうので,うまくいってませんでした.
追加していくには
・export PATH=$PATH:通したいPATH
じゃないとダメみたいです.基本中の基本ですが,知らなかったので備忘録として書きました.
参考リンク
PATHを通すために環境変数の設定を理解する (Mac OS X)
・https://qiita.com/soarflat/items/d5015bec37f8a8254380
- 投稿日:2020-10-10T14:44:57+09:00
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 verifydocker-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: - ./:/cypresscypress.json
{ "video": false }実行
docker-comopse build docker-comopse up感想
いろいろ調べながらやってみるものの、なかなかうまいこといかず。。。
やっぱり公式サイトをちゃんと見るのは大切ですね。
- 投稿日:2020-10-10T13:21:48+09:00
DockerでRails5、postgresqlの環境を作り、pgadminも使えるようにする
mysqlしかdockerで使ったことがなくて、時間がかかってしまったので、後で見れるように書きました。
pgadminも便利なので入れました。
docoker-compose up
したあとrails s
しなくてもいいようにdocker-compose.ymlにcommandで自動でやってくれるように書きました。普段はコンテナ再作成しなくてもよいと思うので
docker-compose start / stop
でやる想定です。DockerfileFROM 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 installdocker-compose.ymlversion: "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.ymldefault: &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
- 投稿日:2020-10-10T11:24:03+09:00
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
ディレクトリ構成
/projectproject ├─data | ├─users_insert.csv | ├─tweets_insert.csv | └─replys_insert.csv ├─sql | ├─users_create.sql | ├─tweets_create.sql | └─replys_create.sql ├─createschema.sh ├─Dockerfile └─env.list1.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.listLICENSE=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.sqlCREATE 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.sqlCREATE 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.sqlCREATE 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.csvhogeeee,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.csvdba11ffb-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.csv7e3991a6-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にします。
再掲ですが、プロジェクトのディレクトリ構成は以下です。
/projectproject ├─data | ├─users_insert.csv | ├─tweets_insert.csv | └─replys_insert.csv ├─sql | ├─users_create.sql | ├─tweets_create.sql | └─replys_create.sql ├─createschema.sh ├─Dockerfile └─env.listDockerfileFROM 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言語を使って説明する記事も書こうと思います。
参考文献
- 投稿日:2020-10-10T11:19:28+09:00
[初心者でもできた]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 eefe0d31Dockerを導入したいRailsアプリに移動
~ $ cd backendDockerファイルを作成
以下を参考
既存のRailsアプリにDockerを導入する手順~/backend $ vi DockerfileFROM 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.ymldocker-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に定義しました。
database.yml編集
database.ymldefault: &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?ハッシュのマージ: 一つにまとめる
<<: *defaultdatabase.ymldefault: &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月からの入社を目指してがんばるぞ〜
- 投稿日:2020-10-10T11:04:10+09:00
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/koheiDockerfileでは開発ツール一式,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についてはデザインのコンパイルも問題なく行えました。
参照したページ(順不同)
- 投稿日:2020-10-10T10:45:36+09:00
【Python】Docker で OpenCV 環境構築 ( cv2.imshow() も動く )
以前このような Qiita ( Ubuntu, Python, OpenCV な環境を Docker 上でつくった ) を書いたのですが
cv2.imshow()
が機能せずいろいろ試行錯誤していました。この記事では Docker 環境でもちゃんと
cv2.imshow()
が動くようにする方法を書きます。ホスト OS は MacOS Catalina です。
1. XQuartz インストール
インストールしたら 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/bash4. 各種アップデート・インストール
コンテナ内で以下を実行
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 scipy5. 動作チェック
ホスト PC で XQuartz 立ち上げる
Jupyter 起動 ( コンテナ内 )
jupyter lab --ip=0.0.0.0 --allow-root --LabApp.token=''
ホスト PC のブラウザで http://localhost:8888/ にアクセス
Jupyter で以下を実行
import cv2 img = cv2.imread('test.jpeg') # なにか適当な画像を入れておく img.shape # => ( 画像の縦の長さ, 横の長さ, 3 ) が返ってくる cv2.imshow('img', img) # 画像を表示したいときはこの 3 行セットで実行する cv2.waitKey(0) cv2.destroyAllWindows
以上がエラーなく動作すれば OK !! お疲れさまでした !!!
- 投稿日:2020-10-10T08:48:22+09:00
Docker Desktop for Mac をHomebrewでインストールする
目的
- HomebrewでDocker Desktop for Macをインストールする方法をまとめる
前提条件
- Homebrewが使える状態になっていること。($ brewコマンドが実行できること)
詳細
下記コマンドを実行してHomebrewを最新状態にする。
$ brew update下記コマンドを実行してDockerをインストールする。
$ brew install docker $ brew cask install docker下記コマンドを実行してインストールしたファイルを開く。
$ open /Applications/Docker.appユーザパスワードを聞かれたら入力する。
- 投稿日:2020-10-10T01:25:50+09:00
たぶん動くから!Docker始めてみよう!
はじめに
この記事はDockerのインストール時のメモです。
Dockerのインストール方法から簡単なDockerの操作確認までを記します。インストール環境
macOS Catalina
バージョン 10.15.6インストール手順
- Dockerの公式サイトからダウンロードする。 公式サイトで [Get Started] を押下。
- Docker Desktop の [Download for Mac] を押下。
- ダウンロードした
Docker.dmg
を開き、Docker.app
をApplications
にドラック&ドロップする。- アプリケーションフォルダから
Docker.app
をダブルクリックして起動する。 この時、認証の設定等聞かれることがあるので聞かれた通りに答える。- メニューバーにクジラのマークの
Docker
のアイコンが出たらインストール完了!コンテナの操作
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.3Docker を起動したまま別のターミナルから
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 でイメージを作成して共有してみよう!
- 投稿日:2020-10-10T00:33:58+09:00
Dockerと仮装サーバーとコンテナについて
Docker!仮想サーバー!コンテナ!について
Dockerとは
コンテナ化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアのこと!
仮想サーバーとは
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」の略で、「パース」と読む。
作成したアプリケーションなどを、ネットワーク上に公開するためのプラットフォームを提供するサービスのこと!
(例)
HerokuIaaS
「Infrastructure as a Service 」の略で、「イアース」や「アイアース」と読む。
サービスを利用するユーザーが、仮想化をしたCPUやメモリ、ストレージなどをインターネット経由で提供するサービスのこと!
(例)
Microsoft Azure
Google Compute Engine現場からは以上です!