- 投稿日:2019-08-28T23:13:43+09:00
Add AdventureWorks to SQL Server 2019 RC1 (RHEL) on Docker
はじめに
2019/08/21 に SQL Server 2019 RC1 が発表されました。
- SQL Server 2019 release candidate is now available - SQL Server Blog
![]()
このRCはRelease Candidate(製品候補版)ということで、大きな問題などがなければ9月か10月にはGA(General Availability)されるだろうと思います。
今回は、GAに向けて、Docker環境のSQL Server 2019 (RHEL)にAdventureWorksDBを入れ、デモとして利用できる環境を作成します。
環境
今回は、以下の環境でインストールを実施しています。
- OS: Windows 10 Pro Version 1903 (OS Build 18362.295) - Docker Desktop: 2.1.0.1 (37199) - Docker Engine: 19.03.1 - Docker Compose: 1.24.1※OSは、macOS Mojave 10.14.6でも確認済みです。
インストール
インストールは、CTP3.2の時と同様です。
imageの個所をCTP3.2からRC1に変更することでSQL Server 2019 RC1を起動できます。
docker-compose up -dでSQL Serverを起動してください。docker-compose.yamlversion: '3' services: mssql: image: mcr.microsoft.com/mssql/rhel/server:2019-RC1 container_name: 'mssql2019-rc1-rhel' environment: - MSSQL_SA_PASSWORD=<your_strong_password> - ACCEPT_EULA=Y # - MSSQL_PID=<your_product_id> # default: Developer # - MSSQL_PID=Express # - MSSQL_PID=Standard # - MSSQL_PID=Enterprise # - MSSQL_PID=EnterpriseCore ports: - 1433:1433 volumes: # Mounting a volume does not work on Docker for Mac - ./mssql/log:/var/opt/mssql/log - ./mssql/data:/var/opt/mssql/dataAdventureWorksのダウンロード
MS Docs、もしくは GitHubより、AdventureWorks2017.bak をダウンロードしてください。
AdventureWorksの配置
AdventureWorksの配置(Windows)
ダウンロードしたAdventureWorks2017.bakファイルを、ホストの.\mssql\dataフォルダパス内に配置します。
cmd.exe> dir D:\Docker\mssql-2019\mssql\data /b AdventureWorks2017.bak <-ファイルが配置されていることを確認 Entropy.bin master.mdf mastlog.ldf model.mdf modellog.ldf model_msdbdata.mdf model_msdblog.ldf model_replicatedmaster.ldf model_replicatedmaster.mdf msdbdata.mdf msdblog.ldf tempdb.mdf tempdb2.ndf templog.ldfAdventureWorksの配置(Mac)
Docker on Macでは、docker-compose.yaml上でvolumesタグを指定できません。
そのため、docker cpコマンドを使用してAdventureWorks2017.bakファイルを/var/opt/mssql/dataディレクトリに配置します。ダウンロードしたAdventureWorks2017.bakファイルが存在するディレクトリに移動します。
※今回は、docker-compose.yamlファイルと同じディレクトリに配置しました。$ ls -al total 98224 drwxr-xr-x 4 ymasaoka staff 128 8 28 01:54 . drwxr-xr-x 12 ymasaoka staff 384 8 12 17:59 .. -rw-r--r-- 1 ymasaoka staff 50286592 8 28 01:54 AdventureWorks2017.bak -rw-r--r-- 1 ymasaoka staff 817 8 27 00:00 docker-compose.yaml
docker psコマンドを使用して、起動しているSQL Server 2019コンテナのIDを確認します。$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e0868b38e321 mcr.microsoft.com/mssql/rhel/server:2019-RC1 "/opt/mssql/bin/perm…" 4 days ago Up 4 seconds 0.0.0.0:1433->1433/tcp mssql2019-rc1-rhelこの例でいうと、
e0868b38e321がコンテナIDです。
このIDを使用して、Dockerコンテナ内の/var/opt/mssql/dataディレクトリにAdventureWorks2017.bakを配置します。$ docker cp AdventureWorks2017.bak e0868b38e321:/var/opt/mssql/dataDockerコンテナの中に入り、AdventureWorks2017.bakが配置されていることを確認してください。
$ docker exec -it e0868b38e321 "bash" [root@localhost /]# ls -al /var/opt/mssql/data total 121952 drwxr-xr-x 2 root root 4096 Aug 27 17:06 . drwxr-xr-x 6 root root 4096 Aug 22 21:21 .. -rw-r--r-- 1 501 games 50286592 Aug 27 16:54 AdventureWorks2017.bak # ファイルが配置されていることを確認 -rw-r----- 1 root root 256 Aug 22 21:21 Entropy.bin -rw-r----- 1 root root 4653056 Aug 27 16:59 master.mdf -rw-r----- 1 root root 2097152 Aug 28 11:07 mastlog.ldf -rw-r----- 1 root root 8388608 Aug 27 16:59 modellog.ldf -rw-r----- 1 root root 8388608 Aug 27 16:59 model.mdf -rw-r----- 1 root root 14024704 Aug 22 21:21 model_msdbdata.mdf -rw-r----- 1 root root 524288 Aug 22 21:21 model_msdblog.ldf -rw-r----- 1 root root 524288 Aug 22 21:21 model_replicatedmaster.ldf -rw-r----- 1 root root 4653056 Aug 22 21:21 model_replicatedmaster.mdf -rw-r----- 1 root root 14024704 Aug 22 21:34 msdbdata.mdf -rw-r----- 1 root root 524288 Aug 27 16:59 msdblog.ldf -rw-r----- 1 root root 8388608 Aug 27 16:59 tempdb.mdf -rw-r----- 1 root root 8388608 Aug 28 13:28 templog.ldfAdventureWorksの復元
AdventureWorksの復元(Windows)
SSMS(SQL Server Management Studio)を起動します。
Dockerコンテナ上で起動しているSQL Server 2019 RC1にログインします。ログイン出来たら、[サーバー名] -> [データベース]を右クリックし、[データベースの復元]を選択します。
[データベースの復元]画面が表示されます。
[ページの選択] -> [全般]を選択し、[ソース]欄にあるラジオボタン[デバイス]を選択します。
ラジオボタン右横にある参照ボタン[...]を選択します。[バックアップ デバイスの選択]画面が表示されます。
[追加]ボタンを選択します。[バックアップ ファイルの検索]画面が表示されます。
/var/opt/mssql/dataディレクトリがデフォルトで表示されており、配置したAdventureWorks2017.bakが選択できることを確認します。
AdventureWorks2017.bakを選択し、[OK]を選択します。[バックアップ デバイスの選択]画面に、追加したAdventureWorks2017.bakファイルの情報が表示されていることを確認します。
[OK]を選択します。[データベースの復元 - AdventureWorks2017]画面が表示されます。
[OK]を選択し、データベースの復元を開始します。
※必要に応じて、[File]タブや[オプション]タブ内の設定を行ってください。復元に成功すると、以下の画面が表示されます。
オブジェクトエクスプローラー上で[AdventureWorks2017]のDBが追加されたことを確認してください。
AdventureWorksの復元(Mac)
Azure Data Studioを起動します。
Dockerコンテナ上で起動しているSQL Server 2019 RC1にログインします。ログイン出来たら、SERVER DASHBOARDを開き、[Tasks] -> [Restore]を選択します。
[Restore database]画面が開きます。
[General]タブを選択します。
[Source] -> [Restore from]欄で、[Backup file]を選択します。
[Backup file path]欄にあるファイル選択ボタンを選択します。[Select a file]画面が表示されます。
dataディレクトリ以下に表示されている[AdventureWorks2017.bak]ファイルを選択し、[OK]を選択します。[Restore database]画面に戻ります。
復元する内容を確認し、[Restore]を選択します。データベースのリストアが開始されます。
問題ない場合は、[TASKS]コンソールに[Restore Database succeeded]が表示されます。
[AdventureWorks2017]のDBが追加されたことを確認してください。終わりに
Docker環境のSQL Server 2019 (RHEL)にAdventureWorksDBを入れて、デモとして利用できる環境を作成しました。
何も問題がなければ、2019/09もしくは2019/10には、SQL Server 2019はGAを迎えられると思います。
GAの前にいろいろ試して、ぜひ活用してみてください。JSSUG(Japan SQL Server User Group)では、月1回、SQL Serverの勉強会を行なっています。
Microsoft MVPの方など、詳しい方もいらっしゃるので、興味ある方はぜひこちらにも参加してください。またJSSUGにはSlackグループもあります。
SQL Serverの最新情報などをいち早く確認することができますので、こちらもぜひJoinしてみてください。関連リンク
参考情報
- 投稿日:2019-08-28T21:50:07+09:00
DockerToolboxから見たホストOSのIPアドレスの調べ方
Docker Tookboxで起動したコンテナから見たホストOSのIPアドレスは
192.168.99.1になる。toolbox用のVirtualboxの設定に紐づいているネットワークアダプタを、windowsの"ネットワーク状態"の同名アダプタのプロパティからIPアドレス見れる。
- 投稿日:2019-08-28T17:11:38+09:00
【Docker】とあるIPセグメントからだけDockerで公開してるサービスにアクセス出来なかったお話【社内ネットワーク】
まえがき
とあるお仕事で、社内ネットワークにdockerで社内用WEBサービスを立ち上げました。
その社内ネットワークは「A拠点」、「B拠点」がVPSで接続されている構成となっているのですが
自分が所属&dockerホストを配置した「A拠点」からは問題無くWEBサービスへアクセス出来るのに
「B拠点」からはなぜかアクセス出来ないという事象が発生したので、それについてまとめます。かなり珍しい事象かと思いますが、今後の為に書き留めました。
読んだ方がいいかもしれない人
- 社内サービスをDockerで構築しようとしている人
- 社内ネットワークでクラスBのIPが使用されている環境にいる人
- 拠点毎、部署毎など、IPのセグメントが分割されている環境にいる人
詳細
環境
- 拠点A
- 172.16.XX.XX/16 のセグメントを利用
- VPNゲートウェイは172.16.0.1
- 拠点B
- 172.17.XX.XX/16 のセグメントを利用
- VPNゲートウェイは172.17.0.1
- Dockerホストマシン
- 拠点Aのネットワークに配置(172.16.16.33)
事象
拠点Aのクライアントマシン(172.16.YY.YY)から、Dockerにて提供されるWEBサービスへのアクセスは出来るが、
拠点Bのクライアントマシン(172.17.XY.ZZ)から、Dockerにて提供されるWEBサービスへのアクセスは出来ない。原因
Docker起動時に構築される「Dockerホストとコンテナを繋ぐブリッジ(docker0)」に割り当てられるIPアドレスがデフォルトだと「172.17.0.1/16」である為
拠点BのVPNゲートウェイのIPアドレスと被ってしまった。解決策
dockerブリッジ(docker0)のipアドレスを変更する。
- 投稿日:2019-08-28T16:48:58+09:00
コンテナ技術入門 - ハンズオン
Docker / Docker-compose / Kubernetes のハンズオンを通して、コンテナ技術およびCI/CD連携を自習できるコンテンツはこちら。
- コンテナ技術 ハンズオン Vol.1 Docker操作編
- コンテナ技術 ハンズオン Vol.2 Dockerイメージ編
- コンテナ技術 ハンズオン Vol.3 Docker運用管理編(製作中)
- コンテナ技術 ハンズオン Vol.4 Kubernetes編(製作中)
- コンテナ技術 ハンズオン Vol.5 CI/CD連携編(製作中)
いずれも参加者が必要に併せて 自学できる入口に立つ ことを目的としたコンテンツとなっております。後日に「コンテナ」を扱おうとしたときに、自分で調べて理解でき、実際に扱えるようになることを目指します。
社内のグループやサークルで輪講する場合などに利用して貰えれば幸いです。
- 投稿日:2019-08-28T15:56:31+09:00
GPUサーバのリソースをモニタリングするPrometheus exporterの作成と運用
概要
GPUサーバのリソースを詳細にモニタリングするための、Prometheusのexporterを作成しました。このexporterによって、サーバ内の各GPUを使用しているdockerのコンテナ名やイメージ名、プロセスIDやコマンドを取得できます。また、docker-composeによりサーバへ手軽にデプロイできるようになっています。
GitHubにてリポジトリを公開していますので、ぜひお試しください!
背景
私が所属する研究開発チームでは、複数台のGPUサーバを運用し、深層学習に基づく自然言語処理や動画像処理の開発や性能評価をしています。各GPUサーバではnvidia-dockerが導入されており、ユーザが自由にコンテナを立ち上げることができるようになっています。このような環境では、他のユーザとリソース(特にGPU)がコンフリクトしていないことを確認する必要があります。もし、GPUリソースがコンフリクトすると、プログラムが実行されなかったり、CPUでの処理に切り替わることで処理時間が大幅に長くなったりして、研究開発の効率が落ちてしまいます。
解決策
いちいち各サーバへログインして確認するのは手間がかかるので、監視ツールであるPrometheusを利用してリソースを一覧できるようにします。Prometheusでは、独自にexporter(サーバやシステムの情報を収集するためのエンドポイント)を作成することができます。必要なメトリクスを複数のコマンド (ps, docker, nvidia_smi) を利用して収集します:
メトリクス 収集コマンド コンテナ名 docker イメージ名 docker コマンド ps ユーザ名 ps CPU使用率 ps メモリ使用量 ps GPU番号・UUID nvidia_smi プロセス名・ID nvidia_smi モニタリング例
docker-composeによって、モニタリングに必要なexporterをまとめて立ち上げられるようにしています。実際はこれに加えてansible(構成管理ツール)を導入しており、複数サーバへのデプロイを自動化しています。
監視用のPrometheusサーバでは、Grafanaを用いてリソースを可視化しています。
試しにtensorflowのコンテナでmnistをやってみたの図。GPUの使用率やメモリ使用率(GPUごと、全体それぞれ)、温度や電力消費量、GPUを使用しているコンテナやイメージの名前、コマンドなどが表示され、リソースの空きが簡単に確認できます。プロセス一覧(スクリーンショット内、Process Infoの欄)を表示するには、例えば次のようなクエリ (PromQL) を指定します:
sum(nvidia_smi_process) by (instance, gpu, pid, command, image_name, container_name)おわりに
研究開発に用いるGPUサーバにおいて、リソースの空きを簡単に確認できるモニタリングツールを紹介しました。コマンド1つでデプロイできるようになっているので、ぜひお試しください。
- 投稿日:2019-08-28T15:46:41+09:00
Docker - Write File to Host Permission denied
1. Dockerfile
I created a normal user JohnnyChu to run the program in docker.
It will write a log file in /data/log inner container and container volume bind the host /foo/log. Now, it will occur permission denied problem.# build stage FROM golang:1.12.9-alpine AS build-env RUN apk update -qq && apk --no-cache add git gcc g++ COPY . /src/ ARG BUILD_ENV RUN cd /src && go build -tags ${BUILD_ENV} -o /src/dist/app # final stage FROM alpine:3.10.2 WORKDIR /app/ COPY --from=build-env /src/dist/ /app/ RUN addgroup -S JohnnyChu && adduser -S JohnnyChu -G JohnnyChu && chown -R JohnnyChu:JohnnyChu /app/ USER JohnnyChu EXPOSE 8080 ENTRYPOINT ["./app"]2. Run
# docker run -v /foo/log:/data/log ... --name boo ...2. Check User UID:GID inner Container.
# docker exec -it boo sh /app $ cat /etc/passwd ... ... guest:x:405:100:guest:/dev/null:/sbin/nologin nobody:x:65534:65534:nobody:/:/sbin/nologin JohnnyChu:x:100:101:Linux User,,,:/home/JohnnyChu:/sbin/nologin <--- UID:100 GID:1013. Chown Host's Log Folder
# chown -R 100:101 /foo/log4. Restart Container
# docker restart boohttps://stackoverflow.com/questions/29245216/write-in-shared-volumes-docker/
- 投稿日:2019-08-28T15:46:41+09:00
Docker - Permission Denied when Write Files to Host
1. Dockerfile
I created a normal user JohnnyChu to run the program in docker.
It will write a log file in /data/log inner container and container volume bind the host /foo/log. Now, it will occur permission denied problem.# build stage FROM golang:1.12.9-alpine AS build-env RUN apk update -qq && apk --no-cache add git gcc g++ COPY . /src/ ARG BUILD_ENV RUN cd /src && go build -tags ${BUILD_ENV} -o /src/dist/app # final stage FROM alpine:3.10.2 WORKDIR /app/ COPY --from=build-env /src/dist/ /app/ RUN addgroup -S JohnnyChu && adduser -S JohnnyChu -G JohnnyChu && chown -R JohnnyChu:JohnnyChu /app/ USER JohnnyChu EXPOSE 8080 ENTRYPOINT ["./app"]2. Run
# docker run -v /foo/log:/data/log ... --name boo ...2. Check User UID:GID inner Container.
# docker exec -it boo sh /app $ cat /etc/passwd ... ... guest:x:405:100:guest:/dev/null:/sbin/nologin nobody:x:65534:65534:nobody:/:/sbin/nologin JohnnyChu:x:100:101:Linux User,,,:/home/JohnnyChu:/sbin/nologin <--- UID:100 GID:1013. Chown Host's Log Folder
# chown -R 100:101 /foo/log4. Restart Container
# docker restart boohttps://stackoverflow.com/questions/29245216/write-in-shared-volumes-docker/
- 投稿日:2019-08-28T15:13:53+09:00
ガチ初心者がKubernetesでコンテナを立てる?まで・・・
「Java Küche」のイベントに参加した!
2019/08/23の実施されたイベント「Kubernetes ハッカソン~Docker と Kubernetes にどっぷり浸かる二日間! ~」を振り返る記事。
講師
Microsoft・アドボケイト: 寺田 佳央さんありがとうございました。m(_ _)m
流れ
今回は、踏み台用の環境としてのUbuntu、そしてDockerfileのpush先、さらにKubernetesを動かす環境の、計3つのリソースをAzureで作成する。
内容としては、
UbuntuでDockerイメージ作成。
Azure Container Registry (以下、ACR) にpushする。
Azure Kubernetes Service (以下、AKS) で、コンテナを起動する。
までを紹介する。必要なファイルや情報は、寺田さんが大変綺麗にまとめてくださってます。
GitHubリンク: https://github.com/yoshioterada/k8s-Azure-Container-Service-AKS--on-Azureよし!やっていこう!
Outlookアカウント作成
リンク: https://signup.live.com/signup
※この時に、hotmail.comでないとAzureアカウントの作成でエラーする??Azureアカウント作って、クレジットカード登録する
Azureのログインページ: https://portal.azure.com/#home
※クレジット登録してないと、Ubuntuのリソースを作ろうとしたときに再足される。Ubuntuのリソースを作成する
Azureのコンソール画面にて、「Create a resource」をクリック。
Ubuntu 18.04 LTS版を作る
Resource gropは新規で作成!仮想マシン名も同じ。
リージョンは、「東日本」
SSH公開キーを「パスワード」
sshの許可する作ったUbuntu環境にsshでアクセスする。
※resourceの詳細画面で、sshするときのip(パブリックIP)を調べとく。
例)ssh userName@ipAdressDockerをインストール
参考記事: https://qiita.com/myyasuda/items/cb8e076f4dba5c41afbc
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable test edge"
sudo apt-get update
sudo apt-get install docker-ce
docker --versionAzure CLIのインストール
この後、ACR, AKSと連携したい。ので、AzureCLIをインストールするぞ!
参考記事: http://aka.ms/az-cli-install-jp
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash// Dockerfileの作成と、Dockerイメージの違いが・・・
※Dockerfileは、Dockerイメージの為のレシピ。作り方、材料が書いてある。
※docker buildでイメージが作れる。らしい。Dockerfileを、Git Cloneする
※今回は寺田さんが、GitHubで公開してくれているやつを使わえてもらう。
めっちゃ感謝してます!!!!!
(>ω<)移動
cd FrontServiceDockerfileを眺めてみる
cat 0-Dockerfile-for-Maven※たくさん使うライブラリ郡を毎回ダウンロードするのは大変なので、それらを一度ダウンロードして、イメージとして作っておく。次からは、そのイメージを読み込むだけで良い。よく依存しそうなものは、イメージを作っておくのをオススメする。らしい。
docker build -t maven-include-localrepo:1.1 . -f 0-Dockerfile-for-Maven
※sudo su で入っておいた方が良いかも。さっきのbuildできたか、確認。
docker imagesAzure Container Registry の作成
// Kubernetesは、ACR経由でDockerイメージを取りに来るイメージ。だと思う。
// docker hubのプライベート版てきなやつかな?作ったイメージを、さっき言ったAzure Continer Registryにpushしたいので、先に作っておく。
参考記事: https://github.com/yoshioterada/DEIS-k8s-ACS/blob/master/CreateAzureContainerRegistry.md
ブラウザにてリソースを作成
レジストリ名は、適当に決める。
リソースグループは新規で適当に決める。
管理ユーザーは有効にしといた。続けて、ACRへログイン
※docker login する。コマンドの引数として、user名とACRのドメインを与える。
docker login -u [user名] [xxx.azurecr.io]
の後に、パスワードを入力する※必要な情報は、詳細画面でアクセスキーで確認できる。
※詳細画面で得られる情報 {
user : 〇〇
login-server: 〇〇〇〇.azurecr.io
pass: 〇〇〇〇〇〇〇〇
}Dockerイメージ作成とpushの準備
// ACRへの認証はやった。(docker loginで。)
※イメージを作ると、コンテナが作れる。動いてる実態はコンテナ。Dockerイメージの作成と、ACRへのpushを、.shファイル(2-build-create.sh)に寺田さんがまとめてくれてる。ので、shをコマンドで起動させれば良いらしい。が、そのpushするイメージの指定と、push先のリポジトリの2箇所はviで編集してね!
※ viでの編集箇所
vi 2-build-create.sh
DOCKER_IMAGE=〇〇〇〇/front-spring-service
DOCKER_REPOSITORY=〇〇〇〇.azurecr.io
※ DOCKER_IMAGEには、ACRのuser名: fullund2。/の後には、imagesの名前(ここで付けた名前がイメージの名前になるっぽい。今回は、front-spring-serviceで行こう!)ACRへpushする
※コマンドを打つときに、バージョン指定を引数で受け取れるので・・・もし、2回目とかなら、2.0とかにしてね!
./2-build-create.sh [x.x]※ブラウザで、pushされているか確認してね!
今回は試しに少しソースを編集してv2としてイメージ作成してみよう!
vi src/main/java/com/yoshio3/frontspring/FrontController.java
の一番した、returnの文字列を少し変更してみよう!よし、変更したソースを元に、作成しよう
./2-build-create.sh 2.0
※引数のバージョンは、2.0にしとく。動作確認
イメージの起動
docker run -p 8080:8080 -it [REPOSITORY名]:[x.x(TAGの数字)]別タブで新たに開いて、curlでアクセスして確認してみよう!
curl http://localhost:8080/sample/hello次の目標: AKSでコンテナを立てたい。まずは、ACRにあるイメージを取りに行く!
Azureページで、Create Kubernetes cluster を作る。
またリソースグループは、新規で!クラスター名は一緒かな。
リージョンは、東日本
Node count 1にする。
仮想ノードは有効HTTP application ・・・ Yes
Kubectl コマンドのインストール
az aks install-cliaz-loginしようぜ
az login
※ブラウザ経由でログインできるAKS接続用の資格情報の取得
az aks get-credentials --resource-group [xxxx] --name [xxxx]
※これで、Kubernetesに繋がるようになった。試しにコマンドが使えるか確認してみるか
kubectl cluster-info
とか
kubectl get nodeACRにあるイメージを、Kubernetesに持ってきたい
今のままだと、KubernetesがACRへアクセスできない。
なので、3-create-secret4reg.shをviで編集する。※具体的には、ACRへAKSからpullの通信を送りたい。その認証を、3-create-secret4reg.shファイルに書いてある感じ。
kubectl create secret docker-registry docker-reg-credential --docker-server=〇〇〇〇.azurecr.io --docker-username=〇〇 --docker-password="〇〇〇〇" --docker-email=hoge@example.com※うまくいったら、
kubectl get secretで確認してみよう!よし、これでイメージを取りに行く事は出来そう!
取ってくるイメージ名を修正する
※作成したACRサーバー名、コンテナのイメージ名に変更する
vi 4-create-deployment-svc.yaml
※修正箇所 30行目。入力する内容としては、docker imagesでの長いやつ。/の後には、verを書けばよい。
image:
〇〇〇〇.azurecr.io/〇〇/front-spring-service:1.0
※少し下も修正する。cpuの0.6を100mに変更。2箇所
※1.0を取りにいくなら、上の
template:
metadata:
labels:
app: spring-front-service
version: [ここを、"v1"としておく]よし!認証と取りに行くイメージは指定できた。
実行
※applyコマンドを使って、ACRからイメージを取ってきて、コンテナを立てる事が出来る。
kubectl apply -f 4-create-deployment-svc.yaml起動しているか確認
kubectl get po -w動作確認
※実態はKubernetes側で動いてるから、lcoalhostへフォワードするコマンド
kubectl port-forward [spring-front-service-〇〇〇〇] 8080:8080
※もし上手くいかなかったら、docker stopで動いてるの止める。別タブで・・・
curl localhost:8080/sample/hello
# 結果が表示されるv2を作って、applyする
4-create-deployment-svc.yamlを複製して、4-create-deployment-svc-v2.yamlとする。
vi 4-create-deployment-svc-v2.yamlで編集
・4行目の name: spring-front-serviceも末尾に、"-v2"を付けとく。
・imagesをいじる。:2.0にすると、v2のイメージを見ることになる。
・versionを、v2にする。
kubectl apply -f 4-create-deployment-svc-v2.yaml
※なんか、sudo suに入らないと出来なかった。v2の起動確認
kubectl get po// 2つめも、port-forwardして確認すると良いかも。
これで、僕らはk8sで2つのコンテナを立てることに成功した!やった!!
フィルタリングしてみよう!
kubectl get po --selector app=[],version=[v1]
-> つまり、selectorを書いて、どのpodへアクセスするか制御できる!!!次に、Kubernetesでv2のコンテナを起動させて、v1をv2にアップデートさせる方法をやる。
serviceについて
serviceってのを作って、それを起動させよう。
serviceがpodへのアクセスを仲介する感じ??podを実行すると、固定でipが生成されるよね。それってどう管理します?手動って大変。
実はip以外にもpodにアクセスする方法がある。
ipが頻繁に変化することになるのは、良くないですよね。デプロイの肝
=> serviceを作って、この一意のIPアドレスを覚えてさえいれば、あとは、serviceのselectorでpodを変更できる。
11-Service.yaml を確認してみよう!serviceの起動
kubectl apply -f 11-Service.yaml確認
kubectl get svcメリット
正常に動いているpodを立てたまま、新たなpodに以降できる。
直ぐに戻す事も出来る!
これが、kubernetesの凄く良いところ!!!!
自分自身でやろうとすると、大変。
yaml編集するだけ。ちなみに
通常は、serviceはtype: ClusterIP!!
まぁ一瞬だけでも、どうしても外部に公開したいなら、type: LoadBalancerにする。
でも、よくない。危険。注意してね。--> serviceが複数ある時、Ingressでまとめて、そのIngressの設定で、pathを設定する事で、URLに応じて呼び出すserviceを分岐できる。
まとめ: Ingressを外部に公開すると良い。
IngressでURLを分けて!serviceでpodを分岐する。
イメージは、serviceのルーティング。受付嬢!!マイクロサービスを運営する上で、便利な機能。
Ingressを修正して立ち上げてみる
vi 12-Ingress.yaml
修正箇所:- host: front-service.[〇〇〇〇.aksapp.io]
この修正の中身は、ブラウザの、リソースの「HTTP アプリケーションのルーティング ドメイン」から貼り付け
※場所的には、ホーム > リソース グループ > [k8s] > [k8s] かな?立ち上げ
kubectl apply -f 12-Ingress.yaml確認
kubectl get ingアクセス
http://[front-service.〇〇〇〇.japaneast.aksapp.io]/sample/hello一応、イベントの内容はここまで。
デザインオブフェアーという考え
壊れる事が前提で、物事を作っていくマインドがないと、kubernetesは触らない方が良い。
落ちる。影響範囲を小さくする。
落ちないようにする努力よりも、落ちる前提で考えた方が良い。
落ちた時の再構築の流れを考える。どこまでデザインオブフェアーをやり通すか。必ず落ちる。最後に
本当に寺田さん、ありがとうございました!
正直、Dockerは30分は触ってたので何となく分かったけど、Kubernetesは無知でした。
モブプロだった事も幸いし、なんとか最後まで出来た!!(´∀`)
後日、知り合いと3人で同じ内容をした。
本記事は、その時の成功例を元に作成した。繰り返すって大事だなぁ。
Kubernetes、、、というかマイクロサービスをちょっと感じれて良かった。
またやりたい!(^・^)
- 投稿日:2019-08-28T13:02:35+09:00
lambda(golang) の local 実行
概要
- docker と serverless-framework (golang) 併用時に docker.sock のマウントや、パスをホスト側と一致させないといけないのが辛い。
- serverless-framework の
sls invoke localで実行していることをホスト側で実行すればよいのでは、と思ったので試してみました。- 発端
コンテナ
Dockerfile# build stage FROM golang:1.12.7 as build-stage WORKDIR /go/src/app ARG GOOS=linux ARG GOARCH=amd64 COPY . . RUN go build -o ./bin/hello path/to/main.go # local invoke stage FROM lambci/lambda:go1.x as invoke WORKDIR /go/src/app COPY --from=build-stage /go/src/app/bin /var/task CMD ["hello"]docker-compose.ymlversion: '3.4' services: builder: build: context: . target: build-stage invoke: build: context: . target: invoke実行
$ docker-compose run --rm invoke START RequestId: c60e09aa-e9ef-1869-84e5-1a66bb8401d5 Version: $LATEST END RequestId: c60e09aa-e9ef-1869-84e5-1a66bb8401d5 REPORT RequestId: c60e09aa-e9ef-1869-84e5-1a66bb8401d5 Duration: 1.39 ms Billed Duration: 100 ms Memory Size: 1536 MB Max Memory Used: 6 MB {"statusCode":200,"headers":{"Content-Type":"application/json","X-MyCompany-Func-Reply":"hello-handler"},"multiValueHeaders":null,"body":"{\"message\":\"Go Serverless v1.0! Your function executed successfully!\"}"}補足
lambci/lambda:go1.xは、/var/task配下にバイナリを置き、バイナリ名を cmd で指定してやることで実行してくれます。sls invoke localの挙動についてはコードを見たものではなく、ホスト側に生成されるディレクトリを見て推測したものです。
- 投稿日:2019-08-28T12:11:01+09:00
Docker/Alpine Linux/LaTeXでNotoフォントの極太フォントを使う
Why
- 組版処理システムには$\LaTeX$を使いたい.
- 見やすくするために日本語の極太フォントを使いたい.
- Dockerコンテナを使って,環境構築の煩わしさから開放されたい.
- なるたけコンテナのイメージサイズを小さくしたい.
How
- Dockerコンテナ上の Alpine Linux:3.10 に Tex Live 2019 と Google Noto Font CJK(NotoSansJP-*.otf と NotoSerifJP-*.otf)をインストールして日本語の極太フォントを使う.
What
Apline:3.10 上に Tex Live 2019 と noto font jp をインストールする Dockerfile を作成する
Dockerfile# Copyrighe (cnstall GNU libc ()) 2016 Kaito Udagawa # Copyright (c) 2015 Vlad # Copyright (c) 2016-2019 3846masa # Copyright (c) 2019 solareenlo # Released under the MIT license # https://opensource.org/licenses/MIT # FROM frolvlad/alpine-glibc FROM alpine:3.10 ENV LANG=C.UTF-8 ENV PATH /usr/local/texlive/2019/bin/x86_64-linux:$PATH # Reference: https://github.com/frol/docker-alpine-glibc # Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default. RUN ALPINE_GLIBC_BASE_URL="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" && \ ALPINE_GLIBC_PACKAGE_VERSION="2.29-r0" && \ ALPINE_GLIBC_BASE_PACKAGE_FILENAME="glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \ ALPINE_GLIBC_BIN_PACKAGE_FILENAME="glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \ ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \ apk add --no-cache --virtual=.build-dependencies wget ca-certificates && \ echo \ "-----BEGIN PUBLIC KEY-----\ MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApZ2u1KJKUu/fW4A25y9m\ y70AGEa/J3Wi5ibNVGNn1gT1r0VfgeWd0pUybS4UmcHdiNzxJPgoWQhV2SSW1JYu\ tOqKZF5QSN6X937PTUpNBjUvLtTQ1ve1fp39uf/lEXPpFpOPL88LKnDBgbh7wkCp\ m2KzLVGChf83MS0ShL6G9EQIAUxLm99VpgRjwqTQ/KfzGtpke1wqws4au0Ab4qPY\ KXvMLSPLUp7cfulWvhmZSegr5AdhNw5KNizPqCJT8ZrGvgHypXyiFvvAH5YRtSsc\ Zvo9GI2e2MaZyo9/lvb+LbLEJZKEQckqRj4P26gmASrZEPStwc+yqy1ShHLA0j6m\ 1QIDAQAB\ -----END PUBLIC KEY-----" | sed 's/ */\n/g' > "/etc/apk/keys/sgerrand.rsa.pub" && \ wget \ "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \ "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \ "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \ apk add --no-cache \ "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \ "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \ "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \ \ rm "/etc/apk/keys/sgerrand.rsa.pub" && \ /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true && \ echo "export LANG=$LANG" > /etc/profile.d/locale.sh && \ \ apk del glibc-i18n && \ \ rm "/root/.wget-hsts" && \ apk del .build-dependencies && \ rm \ "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \ "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \ "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" # Reference: https://github.com/Paperist/docker-alpine-texlive-ja # install texlive RUN apk add --no-cache perl fontconfig-dev freetype-dev && \ apk add --no-cache --virtual .fetch-deps wget xz tar && \ mkdir /tmp/install-tl-unx && \ wget -qO - ftp://tug.org/historic/systems/texlive/2019/install-tl-unx.tar.gz | \ tar -xz -C /tmp/install-tl-unx --strip-components=1 && \ printf "%s\n" \ "selected_scheme scheme-basic" \ "option_doc 0" \ "option_src 0" \ > /tmp/install-tl-unx/texlive.profile && \ /tmp/install-tl-unx/install-tl \ --profile=/tmp/install-tl-unx/texlive.profile && \ tlmgr install \ collection-basic\ collection-latex \ collection-latexrecommended\ collection-latexextra \ collection-fontsrecommended\ collection-langjapanese \ latexmk \ dvipdfmx && \ (tlmgr install xetex || exit 0) && \ rm -fr /tmp/install-tl-unx && \ apk del .fetch-deps # References: https://gist.github.com/e10101/a4e833120f8a66a22cd581241cc79ed0 # : https://qiita.com/zr_tex8r/items/9dfeafecca2d091abd02 # : https://github.com/googlefonts/noto-cjk # install noto font jp # フォントをインストールする場所は以下で探し, /fonts/以下は自由なディレクトリが可能. # $ kpsewhich -var-value=TEXMFLOCAL RUN mkdir -p /usr/local/texlive/texmf-local/fonts/opentype/google && \ cd /usr/local/texlive/texmf-local/fonts/opentype/google/ && \ # 以下はgoogle noto font cjkのjpフォントだけをインストールしている. wget https://github.com/googlefonts/noto-cjk/raw/master/NotoSansJP-Black.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSansJP-Bold.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSansJP-DemiLight.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSansJP-Light.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSansJP-Medium.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSansJP-Regular.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSansJP-Thin.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSerifJP-Black.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSerifJP-Bold.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSerifJP-ExtraLight.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSerifJP-Light.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSerifJP-Medium.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSerifJP-Regular.otf \ https://github.com/googlefonts/noto-cjk/raw/master/NotoSerifJP-SemiBold.otf && \ mktexlsr # 明朝体・細字(\mcfamily\ltseries) # 明朝体・中字(\mcfamily\mdseries) # 明朝体・太字(\mcfamily\bfseries) # ゴシック体・中字(\gtfamily\mdseries) # ゴシック体・太字(\gtfamily\bfseries) # ゴシック体・極太(\gtfamily\ebseries) # 丸ゴシック体(\mgfamily) # 上記の7つのフォントを使うには, `.texファイル`のプリアンブルに以下の2行を追加する. # \usepackage[deluxe]{otf}% 多書体設定 # \usepackage[noto-jp]{pxchfon}% 後に読み込む WORKDIR /workdir CMD ["sh"]Dockerコンテナを動かす
- ↓の要領で,コンテナ内で
latexmkを動かして,自動でtexファイルをコンパイルしてpdfファイルを生成する.- Ubuntu18.04LTS/latexmk/docker-compose/zathuraを使って薄い本を書く
Result
main.tex\documentclass[dvipdfmx, uplatex, a5paper, papersize, 9pt]{jsbook} \usepackage[deluxe]{otf} % 極太字を使う. \usepackage[noto-jp]{pxchfon} % noto font jpを使う. \begin{document} {\gtfamily\ebseries 極太} % ゴシックの極太 {\gtfamily\bfseries 極太} % ゴシックの太字 {\gtfamily 極太} % ゴシックの標準 {\mcfamily\bfseries 極太} % 明朝の太字 {\mcfamily 極太} % 明朝の標準 {\mcfamily\ltseries 極太} % 明朝の細字 {\mgfamily 極太} % まだ丸文字化は成功していない. \end{document}References
- 投稿日:2019-08-28T10:58:16+09:00
私が地元のドトールでドヤるために " iPad + code-server " でやっていること
iPad を使って疑似VScodeの画面を表示させる
使っているモノ
- iPad pro 11インチモデル(セルラー版)
- Bluetooth キーボード(iClever というメーカーのものがおしゃれです。)
使っているサービス
VPS --> Time 4 VPS (海外のVPSプロバイダー)
プラン: 「1コア/4GB KVM」のプラン --料金は5.99ユーロ(700円くらい)
OS: Ubuntu 18.04
最低限揃えた環境: "docker", "docker-compose" コマンドが使える環境
Dockerで動かすサービス: 「code-server」 githubのリンク
※VPSのスペックはメモリ1G以上をおすすめします。使っているときのメモリ使用量が1G前後でした。iPad がネット接続できる環境
セルラーモデルにsim / テザリング / お店の公衆Wifiクライアントのブラウザ
Safari や Chrome など
…Safariを使って「ホーム画面に追加」して、iPad アプリみたいにしています。実際のドヤり方
まず、コーヒー(ブラックだと尚可)を頼みます。
おもむろに iPad を取り出しキーボードをペアリングします。(もたつかないように練習しておくと良い)
ブラウザから" VPSのIPアドレス:設定port "にアクセスします。(このとき、code-server がブラウザにレンダリングされるまで時間がかかるので、コーヒーを飲みましょう)
あとはカタカタします。私は無駄に " git clone "でクローンしまくっています。
「code-server」について
クラウドIDEと言われるサービスで、もともとは「coder」というサービス名でWEB上で提供されていたサービスです。中身はVScodeなので、普段VScodeを触っている方ならほぼ同様の使い方ができます。
※最近追加された話題の「Remote Development」拡張が今のところ使えません。その他のクラウドIDEサービス..
「codeanywhere」
無料プランもある、人気の高いサービスです。WEB画面でコードエディターを起動できることに加え、環境構築も好みのものを選択してクリックすれば自動構築してくれます。(例. php, node.js, Go などのWEB開発環境)「Paiza Cloud」
類似サービスの中で希少な日本語のサービスです。無料範囲の制限がきつく、コンテナ環境は1日しか保持できませんが、勉強会などスポット的に使うには十分な環境らしいです。「Cloud9」
元祖的な存在らしいです。AWSに買収されたことで話題になった時期がある?らしいです。AWSのリソースを使って開発環境を構築できますし、AWSのサーバーレスと連携できる機能があったり、AWS使っている人に便利な仕様です。上記のようなサブスクリプションサービスと機能的には同等ですが、「code-server」はOSSでgithub上にソースが公開されています。
さらに Docker を使って簡単にセットアップもできるので、自分専用のクラウドIDEとして運用しやすく、なにより「 iPad 上でVScodが動いている!」と感動できます。参考画面
..大した内容ではないですがお恥ずかしいので、黒枠を追加しています。
「code-server」の導入手順(概要)
もし細かい手順の追記などご希望ありましたら、ご意見ください。
導入については下記3つほど試しましたが、3つ目の " docker run "で始めるのが一番ラクでした。
- バイナリーをダウンロードして実行
- docker-compose.ymlを作成し、" docker-compose up "で実行
- " docker run" コマンドで実行 ( github の推奨)
手順
VPSにDockerをセットアップして " dcoker ~ "コマンドを実行できる状態にする。(Macなどのローカルではデスクトップアプリからできるようですね。)
github に記載の docker コマンドを実行する
$ docker run -it -p 127.0.0.1:8443:8443 -v "${PWD}:/home/coder/project" codercom/code-server --allow-http --no-authこれで完了です。ブラウザから VPSのIPアドレス:8443 にアクセスしましょう。
コマンドのちょっとしたカスタマイズ
■
-p 127.0.0.1:8443:8443の部分
" -p "オプションで、ホスト(VPS)上のIPアドレスとポートをしています。一番うしろの" :8443 "の部分はDockerfileで指定されているので変更しないほうが良いです。
IPアドレスは何も指定しなければローカルのIPが使われ、ポート番号は覚えやすいものに変更できます。例えば5443番ポートで表示したい場合、-p 5443:8443に変えます。■
-v "${PWD}:/home/coder/project"の部分
" -v "オプションでボリューム、どこにファイルを保存するかを選択しています。この場合は、「現在のフォルダをコンテナの /home/coder/project と連動」させ、変更ファイルは現在のファルダ内に保存されていきます。
例えば「 upaldus 」というユーザーのフォルダ内に保存していきたい場合は、- v /home/upaldus/project:/home/coder/projectと変更します。■
--allow-http --no-authの部分
ここは code-server 自体のコマンドオプションです。
セキュリティを考えてパスワードを設定したい場合は、--alloe-http --password 「好みのパスワード」と変更します。
またhttps設定として --cert オプションなどで対応できます。最後に
正直、VScodeをローカルにインストールするよりも早く、利便性も高くなると思います。
現状では本家の拡張機能で対応していない部分もありますが、随時改善がされています。
何よりも、スマホやタブレットからブラウザさえあればVScodeを使えてしまうことに感動するばかりです。(ドヤッ
- 投稿日:2019-08-28T09:00:15+09:00
DockerでUnity ML-Agentsを動作させる(v0.9.1対応)
Unity ML-Agents(v0.9.1)をDocker上で動作させてみました。
UnityやUnity ML-Agentsの環境構築などは下記をご参考ください。
Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://qiita.com/kai_kou/items/445e614fb71f2204e033MacでUnity ML-Agentsの環境を構築する(v0.9.1対応) - Qiita
https://qiita.com/kai_kou/items/268ccf6f961f8ca8cba8手順
基本的には公式のドキュメントに沿えばよい感じです。
Using Docker For ML-Agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-Docker.mdDockerのインストール
Dockerがインストールされていない場合、インストールします。
> brew cask install docker (略) > docker --version Docker version 19.03.1, build 74b1e89※Dockerを初回起動すると初期設定のためにパスワード入力が求められます。
UnityにLinuxビルドサポートコンポーネントを追加する
Unity Hubを利用してUnityにLinuxビルドサポートコンポーネントを追加します。
Unityのバージョンは2019.1.13f1を利用しています。
- Unity Hubアプリを起動する
- [Installs] > [On my machine]からUnityリスト右側にある[...]をクリックして[Add Component]を選択する
![]()
- [Add components your install]ダイアログの[Platforms]にある[Linux Build Support]にチェックを入れて[Done]ボタンをクリックする
![]()
学習用のappをダウンロードしてビルドする
ML-Agentsリポジトリをダウンロード
適当なディレクトリにリポジトリをダウンロードする。
> mkdir 適当なディレクトリ > cd 適当なディレクトリ > git clone https://github.com/Unity-Technologies/ml-agents.gitUnityアプリからサンプルプロジェクトを開く
Unity Hubでアプリを立ち上げます。Unity Hubがインストールされていない場合は下記をご参考ください。
Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://qiita.com/kai_kou/items/445e614fb71f2204e033ML-Agentsを利用するにはUnityのバージョン
2017.4以上が必要となります。今回は2019.1.13f1を利用しました。アプリが立ち上がったら「開く」ボタンから
任意のディレクトリ/ml-agents/UnitySDKフォルダを選択します。Unityエディタのバージョンによっては、アップグレードするかの確認ダイアログが立ち上がります。
「Upgrade」ボタンをクリックして進めます。
アップグレード処理に少し時間がかかります。
起動しました。
今回は、サンプルとして含まれている[3DBall]Scenesを利用します。
- Unityアプリの下パネルにある[Project]タブから以下のフォルダまで開く
- [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Scenes]
- 開いたら、[3DBall]ファイルがあるので、ダブルクリックして開く
Scenes(シーン)の設定
ML-Agentsで学習させるための設定です。
[Inspector]パネルで以下の設定を確認する
Prefabs(プレハブ)の設定
- Unityアプリの下にある[Project]タブから以下のフォルダまで開く
- [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Prefabs]
- Prefabsフォルダ内の[Game]をダブルクリックする
- Unityアプリの左側にある[Hierarchy]パネルから[Game] > [Pratform]を選択する
![]()
- Unityアプリの右側にある[Inspector]パネルのBall 3D Agent(Script)にあるBrainが[3DBallLearning(LearningBrain)]であることを確認する
- [3DBallLearning(LearningBrain)]ではない場合、
- [Ctrl] + [s]キーでシーンを保存する
- ※設定変更後、しっかりと保存しないと、ビルド時に設定が反映されなくてハマります。
Brainsの設定
- Unityアプリの下パネルにある[Project]タブから以下のフォルダまで開く
- [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Scenes]
- Unityアプリの左側にある[Hierarchy]パネルから[Ball3DAcademy]を選択する
- Unityアプリの右側にある[Inspector]パネルの[Broadcast Hub] > [Brains]に「3DBallLearning (LearningBrain)」が指定されていることを確認する
[Ctrl] + [s]キーでシーンを保存する
※設定変更後、しっかりと保存しないとビルド時に設定が反映されなくてハマります。
ビルド設定
- Unityアプリの[File]メニューから[Build Settings]を選択する
- [Build Settings]ダイアログで[Add Opne Scenes]をクリックする
- [Scenes In Build]で[ML-Agents/Examples/3DBall/Scenes/3DBall]にチェックを入れる
- [Platform]で
PC, Mac & Linux Standaloneが選択されていることを確認する- [Target Platform]を
Linuxに変更する- [Architecture]を
x86_64に変更する- [Server Build]にチェックを入れる
- 以前は[Headless Mode]でした。
- [Build Settings]ダイアログで[Build]ボタンをクリックする
- ファイル保存ダイアログで以下を指定してビルドを開始する
- ファイル名: 3DBall
- フォルダ名: 任意のディレクトリ/ml-agents/unity-volume
すると、
unity-volumeに以下フォルダ・ファイルが出力されます。> ls 任意のディレクトリ/ml-agents/unity-volume 3DBall.x86_64 3DBall_Dataハイパーパラメーターファイルの用意
ハイパーパラメーターファイルを
unity-volumeフォルダにコピーしておきます。> cd 任意のディレクトリ/ml-agents > cp config/trainer_config.yaml unity-volumeDockerコンテナを構築する
Dockerが起動していることを確認してから、ml-agentsリポジトリ直下でdockerコンテナを構築します。すでに
Dockerfileが用意されているので、docker buildするだけ。楽々ですね。> cd 任意のディレクトリ/ml-agents > docker build -t 3dball-ml-docker . (略) Step 20/20 : ENTRYPOINT ["mlagents-learn"] ---> Running in 56532e0d2127 Removing intermediate container 56532e0d2127 ---> 073d8b1040e9 Successfully built 073d8b1040e9 Successfully tagged 3dball-ml-docker:latestDockerコンテナの実行
Dockerコンテナが構築できたら実行してみます。
bashの場合# unity-ml-docker-3dball: コンテナ名(任意) # 3DBall: Unityでbuild時に付けたアプリの名前(拡張子なし) # 3dball-ml-docker: Dockerでbuild時に付けた名前 # docker-first-run: 機械学習結果を保存する際の名称(任意) > docker run -it \ --name unity-ml-docker-3dball \ --mount type=bind,source="$(pwd)"/unity-volume,target=/unity-volume \ -p 5005:5005 \ -p 6006:6006 \ 3dball-ml-docker:latest \ trainer_config.yaml \ --docker-target-name=unity-volume \ --env=3DBall \ --train \ --run-id=docker-first-runfishシェルで実行する場合は、
"$(pwd)"を"$PWD"に置き換えます。fishの場合> docker run -it \ --name unity-ml-docker-3dball \ --mount type=bind,source="$PWD"/unity-volume,target=/unity-volume \ -p 5005:5005 \ -p 6006:6006 \ 3dball-ml-docker:latest \ trainer_config.yaml \ --docker-target-name=unity-volume \ --env=3DBall \ --train \ --run-id=docker-first-run注意点
Unity ML-Agents公式にある
docker runコマンドのサンプルがおそらく動作検証していなくて、パラメータ指定エラーとなります。(2019/08/20時点)以下は
mlagents-learnコマンドのヘルプです。
Dockerで実行する場合には、Dockerイメージの指定(3dball-ml-docker:latest)の後からが、mlagents-learnコマンドのパラメータ指定となるため、--docker-target-nameはtrainer_config.yaml (<trainer-config-path>)の後ろに指定します。mlagents-learn helpUsage: mlagents-learn <trainer-config-path> [options] mlagents-learn --help Options: --env=<file> Name of the Unity executable [default: None]. --curriculum=<directory> Curriculum json directory for environment [default: None]. --sampler=<file> Reset parameter yaml file for environment [default: None]. --keep-checkpoints=<n> How many model checkpoints to keep [default: 5]. --lesson=<n> Start learning from this lesson [default: 0]. --load Whether to load the model or randomly initialize [default: False]. --run-id=<path> The directory name for model and summary statistics [default: ppo]. --num-runs=<n> Number of concurrent training sessions [default: 1]. --save-freq=<n> Frequency at which to save model [default: 50000]. --seed=<n> Random seed used for training [default: -1]. --slow Whether to run the game at training speed [default: False]. --train Whether to train model, or only run inference [default: False]. --base-port=<n> Base port for environment communication [default: 5005]. --num-envs=<n> Number of parallel environments to use for training [default: 1] --docker-target-name=<dt> Docker volume to store training-specific files [default: None]. --no-graphics Whether to run the environment in no-graphics mode [default: False]. --debug Whether to run ML-Agents in debug mode with detailed logging [default: False].実行すると、学習が始まります。
trainer_config.yamlのmax_stepsで指定されているステップ数が完了するか、ctrl+cキーで学習が終了します。> docker run (略) INFO:mlagents.trainers:{'--base-port': '5005', '--curriculum': 'None', '--debug': False, '--docker-target-name': 'unity-volume', '--env': '3DBall', '--help': False, '--keep-checkpoints': '5', '--lesson': '0', '--load': False, '--no-graphics': False, '--num-envs': '1', '--num-runs': '1', '--run-id': 'docker-first-run', '--sampler': 'None', '--save-freq': '50000', '--seed': '-1', '--slow': False, '--train': True, '<trainer-config-path>': 'trainer_config.yaml'} ▄▄▄▓▓▓▓ ╓▓▓▓▓▓▓█▓▓▓▓▓ ,▄▄▄m▀▀▀' ,▓▓▓▀▓▓▄ ▓▓▓ ▓▓▌ ▄▓▓▓▀' ▄▓▓▀ ▓▓▓ ▄▄ ▄▄ ,▄▄ ▄▄▄▄ ,▄▄ ▄▓▓▌▄ ▄▄▄ ,▄▄ ▄▓▓▓▀ ▄▓▓▀ ▐▓▓▌ ▓▓▌ ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌ ╒▓▓▌ ▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓ ▓▀ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▄ ▓▓▌ ▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄ ▓▓ ▓▓▌ ▐▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▌ ▐▓▓▐▓▓ ^█▓▓▓ ▀▓▓▄ ▐▓▓▌ ▓▓▓▓▄▓▓▓▓ ▐▓▓ ▓▓▓ ▓▓▓ ▓▓▓▄ ▓▓▓▓` '▀▓▓▓▄ ^▓▓▓ ▓▓▓ └▀▀▀▀ ▀▀ ^▀▀ `▀▀ `▀▀ '▀▀ ▐▓▓▌ ▀▀▀▀▓▄▄▄ ▓▓▓▓▓▓, ▓▓▓▓▀ `▀█▓▓▓▓▓▓▓▓▓▌ ¬`▀▀▀█▓ INFO:mlagents.envs: 'Ball3DAcademy' started successfully! Unity Academy name: Ball3DAcademy Number of Brains: 1 Number of Training Brains : 1 Reset Parameters : scale -> 1.0 mass -> 1.0 gravity -> 9.8100004196167 Unity brain name: 3DBallLearning Number of Visual Observations (per agent): 0 Vector Observation space size (per agent): 8 Number of stacked Vector Observation: 1 Vector Action space type: continuous Vector Action space size (per agent): [2] Vector Action descriptions: , 2019-08-19 09:26:41.207263: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA INFO:mlagents.envs:Hyperparameters for the PPOTrainer of brain 3DBallLearning: trainer: ppo batch_size: 64 beta: 0.001 buffer_size: 12000 epsilon: 0.2 hidden_units: 128 lambd: 0.99 learning_rate: 0.0003 max_steps: 5.0e4 memory_size: 256 normalize: True num_epoch: 3 num_layers: 2 time_horizon: 1000 sequence_length: 64 summary_freq: 1000 use_recurrent: False vis_encode_type: simple reward_signals: extrinsic: strength: 1.0 gamma: 0.99 summary_path: /unity-volume/summaries/docker-first-run-0_3DBallLearning model_path: /unity-volume/models/docker-first-run-0/3DBallLearning keep_checkpoints: 5 INFO:mlagents.trainers: docker-first-run-0: 3DBallLearning: Step: 1000. Time Elapsed: 33.147 s Mean Reward: 1.107. Std of Reward: 0.588. Training. INFO:mlagents.trainers: docker-first-run-0: 3DBallLearning: Step: 2000. Time Elapsed: 61.621 s Mean Reward: 1.227. Std of Reward: 0.680. Training. INFO:mlagents.trainers: docker-first-run-0: 3DBallLearning: Step: 3000. Time Elapsed: 94.060 s Mean Reward: 1.511. Std of Reward: 0.973. Training. INFO:mlagents.trainers: docker-first-run-0: 3DBallLearning: Step: 4000. Time Elapsed: 143.072 s Mean Reward: 1.959. Std of Reward: 1.307. Training. INFO:mlagents.trainers: docker-first-run-0: 3DBallLearning: Step: 5000. Time Elapsed: 201.150 s Mean Reward: 2.899. Std of Reward: 2.278. Training. (略) INFO:mlagents.trainers: docker-first-run-0: 3DBallLearning: Step: 50000. Time Elapsed: 2084.527 s Mean Reward: 100.000. Std of Reward: 0.000. Training. INFO:mlagents.envs:Saved Model INFO:mlagents.trainers:List of nodes to export for brain :3DBallLearning INFO:mlagents.trainers: is_continuous_control INFO:mlagents.trainers: version_number INFO:mlagents.trainers: memory_size INFO:mlagents.trainers: action_output_shape INFO:mlagents.trainers: action INFO:mlagents.trainers: action_probs INFO:tensorflow:Restoring parameters from /unity-volume/models/docker-first-run-0/3DBallLearning/model-50001.cptk INFO:tensorflow:Froze 14 variables. INFO:mlagents.trainers:Exported /unity-volume/models/docker-first-run-0/3DBallLearning.nn file Converted 14 variables to const ops. Converting /unity-volume/models/docker-first-run-0/3DBallLearning/frozen_graph_def.pb to /unity-volume/models/docker-first-run-0/3DBallLearning.nn IGNORED: Cast unknown layer IGNORED: StopGradient unknown layer GLOBALS: 'is_continuous_control', 'version_number', 'memory_size', 'action_output_shape' IN: 'vector_observation': [-1, 1, 1, 8] => 'sub_3' IN: 'epsilon': [-1, 1, 1, 2] => 'mul_1' OUT: 'action', 'action_probs' DONE: wrote /unity-volume/models/docker-first-run-0/3DBallLearning.nn file.
TensorBoardを利用して学習の進捗状況を視覚的に確認することもできます。> docker exec \ -it unity-ml-docker-3dball \ tensorboard \ --logdir=/unity-volume/summaries \ --host=0.0.0.0 2019-08-19 09:43:12.596652: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA TensorBoard 1.7.0 at http://0.0.0.0:6006 (Press CTRL+C to quit)学習結果をアプリに組み込む
学習結果は、
ml-agents/unity-volumeフォルダ内に保存されます。> ls unity-volume/ 3DBall.x86_64 3DBall_Data models summaries trainer_config.yamlUnityアプリの設定
Playerの設定を行います。
- Unityアプリの[Edit]メニューから[Project Settings]を選択する
- [Inspector]ビューの[Other Settings]欄で以下を確認・設定する
学習結果ファイルの取り込み
ターミナルかFinderで学習結果を以下フォルダにコピーします。
- 学習結果ファイル:
unity-volume/models/docker-first-run-0/3DBallLearnig.nn- 保存先:
UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/※すでに保存先に
3DBallLearnig.nnファイルが存在していますので、リネームしてください。> cp unity-volume/models/docker-first-run-0/3DBallLearnig.nn UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/
- Unityアプリの[Project]パネルで以下ファイルを選択する
- [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Brains] > [3DBallLearning]
- Unityアプリの[Project]パネルで以下フォルダを選択する
- [Assets] > [ML-Agents] > [Examples] > [3DBall] > [TFModels]
- Unityアプリの[Inspector]パネルにある[Model]という項目に[TFModels]フォルダ内の
3DBallLearning.nnファイルをドラッグ&ドロップする![]()
- Unityアプリの[Hierarchy]パネルから以下を選択する
- [3DBall] > [Ball3DAcademy]
- Unityアプリの[Inspector]パネルにある[Broadcast Hub] > [Brains] > [3DBallLearning(LearningBrain)]横の[Control]のチェックを外す
![]()
- Unity上部にある[▶]ボタンをクリックする
これで、学習結果が組み込まれた状態でアプリが起動します。
参考
Using Docker For ML-Agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-Docker.mdMacでUnity ML-Agentsの環境を構築する(v0.9.1対応) - Qiita
https://qiita.com/kai_kou/items/268ccf6f961f8ca8cba8Docker for Macをインストールしてみた
https://qiita.com/scrummasudar/items/750aa52f4e0e747eed68Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://qiita.com/kai_kou/items/445e614fb71f2204e033
- 投稿日:2019-08-28T04:56:19+09:00
Ruby on Rails + MySQLのアプリケーションをHerokuにデプロイする手順(Heroku.yml)
どんな記事か
- Rails+MySQLのアプリケーションをDockerで環境構築した人が、herokuで本番環境を構築できるようになる。
対象読者
- DockerでRails+MySQLを起動して、「Yay! You’re on Rails!」を表示している人。
- 本番環境にも反映して誰からにも見せたい人。
- デプロイのエラーで躓いて困っている人。
完成後のイメージと各ツールのバージョン
今回こちらの実機で確認しました。
- macOS Mojave 10.14.5
- Ruby 2.6.3
- MySQL 5.7
- Heroku 7.29
- Git 2.20.1そもそもどうやって、DockerでRails+MySQLの環境構築をすればいいのという方へ??
こちらのgithubのページで、確認してもらえたらと思います。。
https://github.com/YutakaYamasaki/docker_setup_rubyonrailsちなみに、今回のソースは全て上記の手順を行なった後、デプロイする形になります。
やること
- Railsのアプリケーション修正、追加
- Herokuにデプロイ
Railsアプリケーションのファイルを修正、追加する。
Gemfile(修正、追加)
ここで、mysqlとpgのgemを修正、追加します。
開発環境ではMySQLを使用しますが、本番環境(デプロイ)ではPostgreSQLを使用していきます。変更前と変更後です。
Gemfile##変更前 gem 'mysql2', '>= 0.4.4', '< 0.6.0' ##変更後 gem 'mysql2', '>= 0.4.4', '< 0.6.0', groups: %w(test development), require: false gem 'pg', '~> 0.19.0', group: :production, require: falsedatabase.yml(修正、追記)
こちらのファイルにも、本番環境ではPostgreSQLを使用するので、下記のように修正してください。
productionの項目がなければ、追記してください。
項目があれば、削除してください。database.ymlproduction: <<: *default adapter: postgresql encoding: unicode pool: 5heroku.yml(新規ファイル作成)
heroku.ymlファイルを作成します。
アプリのファイルの直下に、heroku.ymlファイルを作成して、下記のように記載してください。heroku.ymlbuild: docker: web: Dockerfile run: web: bundle exec puma -C config/puma.rbこれで各ファイルの編集が完了しました。
Docker側にもファイルの変更を反映させておきましょう。$ docker-compose build誤字脱字がないか確認した後に、
Herokuへデプロイを進めましょう!Herokuにデプロイ
基本全てターミナルで行います。ターミナルの操作に慣れているという前提で進めていきます。
Herokuにログイン
下記のコマンドを打ちます。
途中でエンターキーを押すとブラウザが立ち上がるので、ブラウザで操作してログインが終わると、
ターミナルの方でもログインができます。$ heroku login heroku: Press any key to open up the browser to login or q to exit: ##ここでエンターキーを押すとブラウザが開くので、ログインを行う。 ##ブラウザでログインができてターミナルに戻ると、下記が表示されるはず Opening browser to https://cli-auth.heroku.com/auth/browser/************** Logging in... done Logged in as *******@email.comHerokuにアプリケーションを作成する。
下記のコマンドを打ちます。
すると、URLが自動発行されます。$ heroku create ##ちなみにcreateの後にスペースキーを押して、好きなアプリ名を入力すると、そのアプリ名のURLが自動発行されます。お試しあれ Creating app... done, ⬢ ******* https://******.herokuapp.com/ | https://git.heroku.com/*******.gitHeroku側でPostgreSQLを使用する。
Heroku側でPostgreSQLを使用するように設定します。
クレジットカードを登録したり、有料会員になるとMySQLも使用できます。$ heroku addons:create heroku-postgresql:hobby-dev Creating heroku-postgresql:hobby-dev on ⬢ ******... free Database has been created and is available ! This database is empty. If upgrading, you can transfer ! data from another database with pg:copy Created postgresql-transparent-70433 as DATABASE_URL Use heroku addons:docs heroku-postgresql to view documentationちなみに、このURLにアクセスしてもエラーが出てきます。なぜなら、アプリがHeroku側にないから。
これからアプリをheroku側にアップロードして、デプロイします。Heroku.ymlを使ってデプロイする。
Herokuではコンテナ諸々をデプロイすることができます。
その中で、デプロイする方法は2通りあります。
- Container Registry GAを使用してデプロイ
- Heroku.ymlを使用してデプロイ←今回はこちらを使用。詳細は下記見てもらえると
https://devcenter.heroku.com/categories/deploying-with-docker
まずは、Heroku側でStackをcontainerにセットします。$ heroku stack:set containerその後、下記のコマンドを打って、デプロイをしましょう。
$ git init $ git add . $ git commit -m "******" $ git push heroku masterデプロイできたか確認する。
下記のコマンドでブラウザが立ち上がり、Railsのアプリケーションがデプロイされているか確認します。
$ heroku open
- 投稿日:2019-08-28T01:18:22+09:00
MariaDB 10.4.7、Maxscale 2.3.11のDockerイメージを作ってみる
Amazon Linux2
mariadb-corporation/maxscale-dockerを使ってMariaDBとMaxscaleの
2019/8/28現在の最新のMariaDB 10.4.7、Maxscale 2.3.11のDocker
イメージを作ってみるgit clone https://github.com/mariadb-corporation/maxscale-docker.git cd maxscale-docker cd maxscalemaxscale.list編集 (2.3.9 → 2.3.11)
maxscale.list# MariaDB MaxScale # To use the latest stable release of MaxScale, use "latest" as the version # To use the latest beta (or stable if no current beta) release of MaxScale, use "beta" as the version deb http://downloads.mariadb.com/MaxScale/2.3.11/ubuntu bionic maindocker build -t maxscale:2.3.11 .docker-compose.yml編集
・mariadb:10.3 → 10.4.7
・mariadb/maxscale:latest → maxscale:2.3.11docker-compose.ymlversion: '2' services: master: image: mariadb:10.4.7 environment: MYSQL_ALLOW_EMPTY_PASSWORD: 'Y' volumes: - ./sql/master:/docker-entrypoint-initdb.d command: mysqld --log-bin=mariadb-bin --binlog-format=ROW --server-id=3000 ports: - "4001:3306" slave1: image: mariadb:10.4.7 depends_on: - master environment: MYSQL_ALLOW_EMPTY_PASSWORD: 'Y' volumes: - ./sql/slave:/docker-entrypoint-initdb.d command: mysqld --log-bin=mariadb-bin --binlog-format=ROW --server-id=3001 --log-slave-updates ports: - "4002:3306" slave2: image: mariadb:10.4.7 depends_on: - master environment: MYSQL_ALLOW_EMPTY_PASSWORD: 'Y' volumes: - ./sql/slave:/docker-entrypoint-initdb.d command: mysqld --log-bin=mariadb-bin --binlog-format=ROW --server-id=3002 --log-slave-updates ports: - "4003:3306" maxscale: image: mariadb/maxscale:latest depends_on: - master - slave1 - slave2 volumes: - ./maxscale.cnf.d:/etc/maxscale.cnf.d ports: - "4006:4006" # readwrite port - "4008:4008" # readonly port - "8989:8989" # REST API portdocker-compose up -d docker-compose exec maxscale maxctrl list servers ┌─────────┬─────────┬──────┬─────────────┬─────────────────┬──────────┐ │ Server │ Address │ Port │ Connections │ State │ GTID │ ├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────────┤ │ server1 │ master │ 3306 │ 0 │ Master, Running │ 0-3000-5 │ ├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────────┤ │ server2 │ slave1 │ 3306 │ 0 │ Slave, Running │ 0-3000-5 │ ├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────────┤ │ server3 │ slave2 │ 3306 │ 0 │ Slave, Running │ 0-3000-5 │ └─────────┴─────────┴──────┴─────────────┴─────────────────┴──────────┘ docker stop maxscale_master_1 docker-compose exec maxscale maxctrl list servers ┌─────────┬─────────┬──────┬─────────────┬─────────────────┬──────────┐ │ Server │ Address │ Port │ Connections │ State │ GTID │ ├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────────┤ │ server1 │ master │ 3306 │ 0 │ Down │ 0-3000-5 │ ├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────────┤ │ server2 │ slave1 │ 3306 │ 0 │ Master, Running │ 0-3000-5 │ ├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────────┤ │ server3 │ slave2 │ 3306 │ 0 │ Slave, Running │ 0-3000-5 │ └─────────┴─────────┴──────┴─────────────┴─────────────────┴──────────┘ docker start maxscale_master_1 docker-compose exec maxscale maxctrl list servers ┌─────────┬─────────┬──────┬─────────────┬─────────────────┬──────────┐ │ Server │ Address │ Port │ Connections │ State │ GTID │ ├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────────┤ │ server1 │ master │ 3306 │ 0 │ Slave, Running │ 0-3000-5 │ ├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────────┤ │ server2 │ slave1 │ 3306 │ 0 │ Master, Running │ 0-3000-5 │ ├─────────┼─────────┼──────┼─────────────┼─────────────────┼──────────┤ │ server3 │ slave2 │ 3306 │ 0 │ Slave, Running │ 0-3000-5 │ └─────────┴─────────┴──────┴─────────────┴─────────────────┴──────────┘





































