20190828のdockerに関する記事は14件です。

Add AdventureWorks to SQL Server 2019 RC1 (RHEL) on Docker

はじめに

2019/08/21 に SQL Server 2019 RC1 が発表されました。

この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.yaml
version: '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/data

AdventureWorksのダウンロード

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.ldf

AdventureWorksの配置(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/data

Dockerコンテナの中に入り、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.ldf

AdventureWorksの復元

AdventureWorksの復元(Windows)

SSMS(SQL Server Management Studio)を起動します。
Dockerコンテナ上で起動しているSQL Server 2019 RC1にログインします。

image.png

ログイン出来たら、[サーバー名] -> [データベース]を右クリックし、[データベースの復元]を選択します。

image.png

[データベースの復元]画面が表示されます。
[ページの選択] -> [全般]を選択し、[ソース]欄にあるラジオボタン[デバイス]を選択します。
ラジオボタン右横にある参照ボタン[...]を選択します。

image.png

[バックアップ デバイスの選択]画面が表示されます。
[追加]ボタンを選択します。

image.png

[バックアップ ファイルの検索]画面が表示されます。
/var/opt/mssql/dataディレクトリがデフォルトで表示されており、配置したAdventureWorks2017.bakが選択できることを確認します。
AdventureWorks2017.bakを選択し、[OK]を選択します。

image.png

[バックアップ デバイスの選択]画面に、追加したAdventureWorks2017.bakファイルの情報が表示されていることを確認します。
[OK]を選択します。

image.png

[データベースの復元 - AdventureWorks2017]画面が表示されます。
[OK]を選択し、データベースの復元を開始します。
※必要に応じて、[File]タブや[オプション]タブ内の設定を行ってください。

image.png

復元に成功すると、以下の画面が表示されます。

image.png

オブジェクトエクスプローラー上で[AdventureWorks2017]のDBが追加されたことを確認してください。

image.png

AdventureWorksの復元(Mac)

Azure Data Studioを起動します。
Dockerコンテナ上で起動しているSQL Server 2019 RC1にログインします。

img-ads-conn.png

ログイン出来たら、SERVER DASHBOARDを開き、[Tasks] -> [Restore]を選択します。

img-ads-srvdshbrd.png

[Restore database]画面が開きます。
[General]タブを選択します。
[Source] -> [Restore from]欄で、[Backup file]を選択します。
[Backup file path]欄にあるファイル選択ボタンを選択します。

img-ads-restore01.png

[Select a file]画面が表示されます。
dataディレクトリ以下に表示されている[AdventureWorks2017.bak]ファイルを選択し、[OK]を選択します。

img-ads-restore02.png

[Restore database]画面に戻ります。
復元する内容を確認し、[Restore]を選択します。

img-ads-restore03.png

データベースのリストアが開始されます。
問題ない場合は、[TASKS]コンソールに[Restore Database succeeded]が表示されます。
[AdventureWorks2017]のDBが追加されたことを確認してください。

img-ads-restore04.png

終わりに

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してみてください。

関連リンク

参考情報

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

DockerToolboxから見たホストOSのIPアドレスの調べ方

Docker Tookboxで起動したコンテナから見たホストOSのIPアドレスは192.168.99.1になる。

toolbox用のVirtualboxの設定に紐づいているネットワークアダプタを、windowsの"ネットワーク状態"の同名アダプタのプロパティからIPアドレス見れる。

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

【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アドレスを変更する。

↓参考
Dockerでdocker0ネットワークのIPアドレスを変更する

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

コンテナ技術入門 - ハンズオン

Docker / Docker-compose / Kubernetes のハンズオンを通して、コンテナ技術およびCI/CD連携を自習できるコンテンツはこちら。

いずれも参加者が必要に併せて 自学できる入口に立つ ことを目的としたコンテンツとなっております。後日に「コンテナ」を扱おうとしたときに、自分で調べて理解でき、実際に扱えるようになることを目指します。

社内のグループやサークルで輪講する場合などに利用して貰えれば幸いです。

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

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を用いてリソースを可視化しています。

screenshot.png
試しにtensorflowのコンテナでmnistをやってみたの図。GPUの使用率やメモリ使用率(GPUごと、全体それぞれ)、温度や電力消費量、GPUを使用しているコンテナやイメージの名前、コマンドなどが表示され、リソースの空きが簡単に確認できます。

プロセス一覧(スクリーンショット内、Process Infoの欄)を表示するには、例えば次のようなクエリ (PromQL) を指定します:

sum(nvidia_smi_process) by (instance, gpu, pid, command, image_name, container_name)

おわりに

研究開発に用いるGPUサーバにおいて、リソースの空きを簡単に確認できるモニタリングツールを紹介しました。コマンド1つでデプロイできるようになっているので、ぜひお試しください。

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

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:101

3. Chown Host's Log Folder

# chown -R 100:101 /foo/log

4. Restart Container

# docker restart boo

https://stackoverflow.com/questions/29245216/write-in-shared-volumes-docker/

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

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:101

3. Chown Host's Log Folder

# chown -R 100:101 /foo/log

4. Restart Container

# docker restart boo

https://stackoverflow.com/questions/29245216/write-in-shared-volumes-docker/

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

ガチ初心者が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@ipAdress

Dockerをインストール

参考記事: 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 --version

Azure 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 FrontService

Dockerfileを眺めてみる
cat 0-Dockerfile-for-Maven

※たくさん使うライブラリ郡を毎回ダウンロードするのは大変なので、それらを一度ダウンロードして、イメージとして作っておく。次からは、そのイメージを読み込むだけで良い。よく依存しそうなものは、イメージを作っておくのをオススメする。らしい。

docker build -t maven-include-localrepo:1.1 . -f 0-Dockerfile-for-Maven
※sudo su で入っておいた方が良いかも。

さっきのbuildできたか、確認。
docker images

Azure 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-cli

az-loginしようぜ

az login
※ブラウザ経由でログインできる

AKS接続用の資格情報の取得

az aks get-credentials --resource-group [xxxx] --name [xxxx]
※これで、Kubernetesに繋がるようになった。

試しにコマンドが使えるか確認してみるか

kubectl cluster-info
とか
kubectl get node

ACRにあるイメージを、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、、、というかマイクロサービスをちょっと感じれて良かった。
またやりたい!(^・^)

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

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.yml
version: '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 の挙動についてはコードを見たものではなく、ホスト側に生成されるディレクトリを見て推測したものです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Docker/Alpine Linux/LaTeXでNotoフォントの極太フォントを使う

Why

  • 組版処理システムには$\LaTeX$を使いたい.
  • 見やすくするために日本語の極太フォントを使いたい.
  • Dockerコンテナを使って,環境構築の煩わしさから開放されたい.
  • なるたけコンテナのイメージサイズを小さくしたい.

How

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コンテナを動かす

Result

noto-font-jp.png

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

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

私が地元のドトールでドヤるために " 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 アプリみたいにしています。

実際のドヤり方

  1. まず、コーヒー(ブラックだと尚可)を頼みます。

  2. おもむろに iPad を取り出しキーボードをペアリングします。(もたつかないように練習しておくと良い)

  3. ブラウザから" VPSのIPアドレス:設定port "にアクセスします。(このとき、code-server がブラウザにレンダリングされるまで時間がかかるので、コーヒーを飲みましょう)

  4. あとはカタカタします。私は無駄に " 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イメージ.png

「code-server」の導入手順(概要)

もし細かい手順の追記などご希望ありましたら、ご意見ください。

導入については下記3つほど試しましたが、3つ目の " docker run "で始めるのが一番ラクでした。

  • バイナリーをダウンロードして実行
  • docker-compose.ymlを作成し、" docker-compose up "で実行
  • " docker run" コマンドで実行 ( github の推奨)

手順

  1. VPSにDockerをセットアップして " dcoker ~ "コマンドを実行できる状態にする。(Macなどのローカルではデスクトップアプリからできるようですね。)

  2. 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を使えてしまうことに感動するばかりです。(ドヤッ

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

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/445e614fb71f2204e033

Macで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.md

Dockerのインストール

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]を選択する Unity
  • [Add components your install]ダイアログの[Platforms]にある[Linux Build Support]にチェックを入れて[Done]ボタンをクリックする Unity

学習用のappをダウンロードしてビルドする

ML-Agentsリポジトリをダウンロード

適当なディレクトリにリポジトリをダウンロードする。

> mkdir 適当なディレクトリ
> cd 適当なディレクトリ
> git clone https://github.com/Unity-Technologies/ml-agents.git

Unityアプリからサンプルプロジェクトを開く

Unity Hubでアプリを立ち上げます。Unity Hubがインストールされていない場合は下記をご参考ください。

Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://qiita.com/kai_kou/items/445e614fb71f2204e033

ML-Agentsを利用するにはUnityのバージョン2017.4 以上が必要となります。今回は2019.1.13f1 を利用しました。

アプリが立ち上がったら「開く」ボタンから任意のディレクトリ/ml-agents/UnitySDK フォルダを選択します。

Unity_Hub.png

Unityエディタのバージョンによっては、アップグレードするかの確認ダイアログが立ち上がります。
スクリーンショット 2019-08-09 16.37.46.png

「Upgrade」ボタンをクリックして進めます。

アップグレード処理に少し時間がかかります。

スクリーンショット 2018-09-13 10.50.01.png

起動しました。

今回は、サンプルとして含まれている[3DBall]Scenesを利用します。

  • Unityアプリの下パネルにある[Project]タブから以下のフォルダまで開く
    • [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Scenes]
  • 開いたら、[3DBall]ファイルがあるので、ダブルクリックして開く

Scenes選択

Scenes(シーン)の設定

ML-Agentsで学習させるための設定です。

  • Unityアプリの[Edit]メニューから[Project Settings]を開く
    スクリーンショット 2019-08-19 14.23.05.png

  • [Inspector]パネルで以下の設定を確認する

    • [Resolution and Presentation]の[Run In Background]がチェックされている
    • [Display Resolution Dialog]がDisableになっている スクリーンショット_2019_08_19_14_25のコピー.png

Prefabs(プレハブ)の設定

  • Unityアプリの下にある[Project]タブから以下のフォルダまで開く
    • [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Prefabs]
  • Prefabsフォルダ内の[Game]をダブルクリックする
  • Unityアプリの左側にある[Hierarchy]パネルから[Game] > [Pratform]を選択する Unity
  • Unityアプリの右側にある[Inspector]パネルのBall 3D Agent(Script)にあるBrainが[3DBallLearning(LearningBrain)]であることを確認する
  • [3DBallLearning(LearningBrain)]ではない場合、
    • [Project]タブから以下のフォルダまで開き、
      • [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Brains]
    • [3DBallLearning]を[Inspector]パネルのBrainにドラッグ&ドロップして指定する Unity
  • [Ctrl] + [s]キーでシーンを保存する
    • ※設定変更後、しっかりと保存しないと、ビルド時に設定が反映されなくてハマります。

Brainsの設定

  • Unityアプリの下パネルにある[Project]タブから以下のフォルダまで開く
    • [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Scenes]
  • Unityアプリの左側にある[Hierarchy]パネルから[Ball3DAcademy]を選択する
  • Unityアプリの右側にある[Inspector]パネルの[Broadcast Hub] > [Brains]に「3DBallLearning (LearningBrain)」が指定されていることを確認する
  • 「3DBallLearning (LearningBrain)」横にある[Control]にチェックを入れる
    Unity

  • [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

Build_Settings
Build_Settings

すると、unity-volume に以下フォルダ・ファイルが出力されます。

> ls 任意のディレクトリ/ml-agents/unity-volume

3DBall.x86_64 3DBall_Data

ハイパーパラメーターファイルの用意

ハイパーパラメーターファイルをunity-volume フォルダにコピーしておきます。

> cd 任意のディレクトリ/ml-agents
> cp config/trainer_config.yaml unity-volume

Dockerコンテナを構築する

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:latest

Dockerコンテナの実行

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

fishシェルで実行する場合は、"$(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-nametrainer_config.yaml (<trainer-config-path>) の後ろに指定します。

mlagents-learn help

    Usage:
      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.yamlmax_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)

スクリーンショット 2019-08-19 19.07.11.png

学習結果をアプリに組み込む

学習結果は、ml-agents/unity-volume フォルダ内に保存されます。

> ls unity-volume/

3DBall.x86_64       3DBall_Data         models              summaries           trainer_config.yaml

Unityアプリの設定

Playerの設定を行います。

  • Unityアプリの[Edit]メニューから[Project Settings]を選択する
  • [Inspector]ビューの[Other Settings]欄で以下を確認・設定する
    • [Scripting Runtime Version]を[.Net 4.x Equivalent]にする Unity

学習結果ファイルの取り込み

ターミナルか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
  • Unityアプリの[Hierarchy]パネルから以下を選択する
    • [3DBall] > [Ball3DAcademy]
  • Unityアプリの[Inspector]パネルにある[Broadcast Hub] > [Brains] > [3DBallLearning(LearningBrain)]横の[Control]のチェックを外す Unity
  • Unity上部にある[▶]ボタンをクリックする

これで、学習結果が組み込まれた状態でアプリが起動します。

参考

Using Docker For ML-Agents
https://github.com/Unity-Technologies/ml-agents/blob/master/docs/Using-Docker.md

MacでUnity ML-Agentsの環境を構築する(v0.9.1対応) - Qiita
https://qiita.com/kai_kou/items/268ccf6f961f8ca8cba8

Docker for Macをインストールしてみた
https://qiita.com/scrummasudar/items/750aa52f4e0e747eed68

Macでhomebrewを使ってUnityをインストールする(Unity Hub、日本語化対応)
https://qiita.com/kai_kou/items/445e614fb71f2204e033

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

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

localhost_3002_.png

そもそもどうやって、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: false

database.yml(修正、追記)

こちらのファイルにも、本番環境ではPostgreSQLを使用するので、下記のように修正してください。
productionの項目がなければ、追記してください。
項目があれば、削除してください。

database.yml
production:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5

heroku.yml(新規ファイル作成)

heroku.ymlファイルを作成します。
アプリのファイルの直下に、heroku.ymlファイルを作成して、下記のように記載してください。

heroku.yml
build:
  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.com

Herokuにアプリケーションを作成する。

下記のコマンドを打ちます。
すると、URLが自動発行されます。

$ heroku create
##ちなみにcreateの後にスペースキーを押して、好きなアプリ名を入力すると、そのアプリ名のURLが自動発行されます。お試しあれ
Creating app... done, ⬢ *******
https://******.herokuapp.com/ | https://git.heroku.com/*******.git

Heroku側で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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 maxscale

maxscale.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 main
docker build -t maxscale:2.3.11 .

docker-compose.yml編集
・mariadb:10.3 → 10.4.7
・mariadb/maxscale:latest → maxscale:2.3.11

docker-compose.yml
version: '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 port
docker-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 │
└─────────┴─────────┴──────┴─────────────┴─────────────────┴──────────┘
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む