20191205のdockerに関する記事は12件です。

Dockerについて

ドットインストールを参考にした記事です

Dockerとは

  • アプリケーションを開発、移動、実行するためのプラットフォーム
  • 仮想化環境を実現するためのツール
  • アプリの実行環境をラップしてくれる
  • 環境の違いなんてなんのその
  • 構築(Build)、移動(Ship)、実行(Run)

Vargrant

Dockerをインストールするマシンを立ち上げるもの

コンテナ

  • Dockerの「イメージ」を元に作成される仮想環境の実行部分。
  • オブジェクト指向でいうとインスタンス
  • イメージから作られる実際の動作環境
  • コンテナには、UbuntuなどのOSをはじめ、イメージで定義しているプログラム群を含み、それに加えてコンテナ起動後に個別プログラムを追加することができる
  • 原則1コンテナ1アプリ
  • (Dockerは、コンテナ同士をつなぐネットワーク環境の構築もできる)
Imageから勝手にコンテナを作ってスタートする
$ docker run

imageの構築、コンテナ構築、起動。引数でサービスを指定しないと失敗する

コンテナがある状態
$ docker start

コンテナが一つも存在しないと失敗する。

imageの 構築からコンテナの構築、起動まで。

$ docker up

imageがなくてもbuildから実行してくれる

docker-compose up とか build とか start とかの違いを理解できていなかったのでまとめてみた。

イメージ

  • コンテナを起動させるためのベース
  • オブジェクト指向でいうクラスのこと
  • テキストファイル(Dockerfile)からビルドされる
  • Resistory(DockerHub)を使ってImageそのものを共有可能
$ docker build [DockerfileのPath]

でビルド

  • 通常パソコンに、OSをインストールする時にしよう・
  • OSを入れ替えたり、じぶんでパソコンを作ったりする時にPSをパソコンにインストールする
  • インストールする時に必要になるのが、「イメージ(ファイル)」。

その他学習したことは随時更新していきます

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

(クソ記事) localhost上でHTTPSなnginxコンテナを動作させ、/etc/hostsで名前解決してGmail APIのOAuth2を通す

TL;DR

できます。
できました。

必要なもの

  • MacOS
  • mkcert (brew install)
  • docker for Mac
    • nginx:latest
  • /etc/hostsに関する知識
  • dockerに関する知識

モチベ

  • わざわざドメイン取ったりDNS管理したりする必要があり、ただの静的HTMLをHTTPS公開したいだけなのに無料で出来ない。馬鹿馬鹿しい。
  • じゃあlocalhostに対して、公開ドメイン名をhostsでmapしてブラウザ騙せばいいよね
  • 実際に やってみた
  • できた
  • なおOAuth Consent Screenとかドメイン所有権確認とかは、ちゃんとDNS触ったりしたので、実は認証取るのに完全無料じゃない可能性はある。

やりかた

  1. コンテンツを作る。( index.html )
  2. nginx:latest をpullしてくる。
  3. mkcert で localhost と 対象のドメイン名に対応する証明書を生成し、自分のMacにinstallする。
  4. nginxを TCP/443 でLISTENさせ、証明書とTLS関連設定を持ったssl.confをCOPYし、ビルド
  5. コンテンツのディレクトリをmountさせ、docker run
  6. https://www.example.com/path/to/file.html みたいにアクセスしてみる
  7. できた

続かない

とりあえず「できた」ことだけメモっとく。

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

GCPでContainerデプロイする方法

Dockerを利用し、GCPのVMインスタンスにデプロイする方法をまとめます。
前提
- Githubでプロジェクトを管理
- GithubのリポジトリにDockerファイルがある

Overview

大まかな流れは以下の流れとなります。
1. Cloud BuildにPush
2. Container RegistryにPush
3. VMインスタンスをアップデート

Cloud BuildにPush

Cloud Buildのページにてトリガーを作成。
また、Githubと接続を行う。

詳細はこちら
https://cloud.google.com/cloud-build/docs/?hl=ja

接続し、トリガー条件を設定。今回はmasterブランチが更新されるとbuild開始。

Container RegistryにPush

Cloud BuildへのPushが成功すると自動的にContainer RegistryにもPushされます。
Pushされた最新のイメージの名前をコピー
[エリア]/[プロジェクトID]/[コンテナ名]:[タグ名]

コマンドで行う場合

gcloud builds list

でbuild一覧を取得し、StatusがSuccessであることを確認。

gcloud container images list

でイメージ一覧を取得し、

gcloud container images list-tags --format="get(digest)” [イメージ名]

でタグを取得。
最新版のタグを組み合わせて、
[イメージ名]@[タグ名(ハッシュ化)]
のフォーマットで保存

VMインスタンスをアップデート

VMインスタンスのページにてターゲットとなるインスタンスを編集。
コピーしたコンテナイメージ名をコンテナイメージのテキストフィールドに入力し、保存。

コマンドで行う場合

gcloud compute instances list

でインスタンス名一覧を取得

gcloud compute instances update-container [インスタンス名] --container-image [イメージ名]@[タグ名(ハッシュ化)]

先ほどコピーした[イメージ名]@[タグ名(ハッシュ化)]を利用し、上記コマンドを実行。

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

Docker関連覚え書き

※自分用メモ
※随時更新

コマンド関連

全コンテナ確認
docker ps -a
ボリューム確認
docker volume ls
起動中コンテナ確認
docker ps
コンテナ起動
docker start [container_name]
コンテナ接続
docker exec -it [container_name] bash

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

お手軽Hack!

メリークリスマス!
ユアマイスターアドベントカレンダーの24日目を担当させていただきます、インターンの京極と申します。
https://qiita.com/advent-calendar/2019/yourmystar

今回は、Hack言語を触ってみた記事を書いてみました。ご興味ある方は年末年始のお休み中にHackしていただければ幸いです。

Hackとは

HackとはHHVMという実行環境上で動くプログラミング言語で、PHPとの互換性を持ち、Facebookによって開発が行われています。

公式サイト
https://hacklang.org/
Github
https://github.com/facebook/hhvm/tree/master/hphp/hack

Java言語がJVMという実行環境で動くように、Hack言語は、HHVMという実行環境で動くということです。

公式サイトを見るとジェネリクスをサポートしていたり、ラムダがファーストクラス関数として使えるなど試してみたい気持ちがクリスマスを迎えるにあたり出てきますのでちょっと触ってみたいと思います。

Hack on Docker

マシンの直接インストールするのは避けて、Docker HubからHackの動く環境を作リます。

Dockerのは行っている環境で以下のコマンドを叩くと、そこはすでに白銀の世界ではなく、HHVMの手に入った世界の中です。

docker run -it hhvm/hhvm bash

# hhvm --version
HipHop VM 4.34.0 (rel)
Compiler: 1575318969_858014129
Repo schema: e5c15841820ab38c7ec75ebe5ec9201013caa5bf

適当なディレクトリにhello.hackを置いて、実行させてみます。

<<__EntryPoint>>
function main(): noreturn {
  echo "Hello World!";
  exit(0);
}
docker run -it -v $PWD:/app hhvm/hhvm hhvm /app/hello.hack

Hello World!

おまけにフィボナッチ数を計算するプログラムも書いてみました。普段からPHPを書く方にとっては違和感が少ないと思います。

function fib(int $n): int {
  if ($n <= 1)
    return $n;
  return fib($n - 1) + fib($n - 2);
}

<<__EntryPoint>>
function main(): noreturn {
  echo fib(40);
  exit(0);
}

Webサーバ

調べているとHHVMはWebサーバの機能が組み込まれているということなので起動させてみます。

docker run -it -v $PWD:/var/www/public -p 12345:80 hhvm/hhvm-proxygen

こうするとDocker内の/var/www/publicディレクトリに先程の、hello.hackが存在することになりますので、ブラウザからアクセスしてみます。

http://localhost:12345/hello.hack

スクリーンショット 2019-12-05 14.17.51.png

もう少しHackを書いてみる

ここまで環境構築が主だったので、もう少しプログラムを書いてみたいと思います。様々な機能がHackにはありますが、目についた面白い機能を紹介して終わりにしたいと思います。

以下の書き方をすると、 \$inc は \$a という引数を受け取り、 \$b を引数として受け取る関数を返す関数になります。 \$inc3 は \$a が3になったバージョンの関数なので、 \$inc3 に対して10を引数に渡すと、13が返ってくることが確認できます。

このようなカリー化された関数をさらっと書けるというのもHack言語の魅力だと感じました。

<<__EntryPoint>>
function main(): noreturn {
  $inc = $a ==> $b ==> $a + $b;
  $inc3 = $inc(3);
  echo $inc3(10);
  exit(0);
}

まとめ

ちょっと触っただけでも様々な機能がHack言語にあることが分かりましたので、年末年始中にもう少しHackに触れたいと思います。メリーハッククリスマス!

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

proxy環境下でDocker Registryの構築

自分たちで開発した Docker コンテナをイントラネット内で使ってもらうために、Docker Registry を構築しました。構築時、proxyでハマったので簡単に手順を残します。
OS は CentOS7.7 を使用します。この構築手順は OS のインストール直後を想定しています。また、証明書や認証の設定については、省略させていただきます。

Docker Registry とは

社内のみで Docker イメージを登録、取得したいケースがあります。このような場合、Dockerイメージが大量に保存されている Docker Hub を利用するのではなく、社内用のDockerイメージの保管庫が必要になります。Docker Registry は、Docker イメージを保存しておいて、提供するサービスです。Docker Registry を 利用することで、社内で Docker イメージの登録(docker push)、取得(docker pull)が可能になります。
Docker Registry も Docker イメージとして、Docker Hub に登録されていて、取得(docker pull)して、それを使ってコンテナを起動させることで、Docker Registry を構築することができます。

詳細は公式サイト Docker Registry で紹介しています。

Docker のインストール

Docker Registry をインストールする前に、まず、Docker をインストールします。

各種設定

yum に proxy の設定を追加するために /etc/yum.conf を編集します。

$ sudo vi /etc/yum.conf

以下を yum.conf に追加します。proxy の利用に認証が必要な場合、proxy_username, proxy_passwird も追加して下さい。今回は省略します。

/etc/yum.conf
proxy=http://<proxy_host>:<proxy_port>

デフォルトのリポジトリ設定では、yum 実行時にタイムアウトになる可能性があるので、/etc/yum.repos.d/CentOS-Base.repo を編集します。

sudo vi /etc/yum.repos.d/CentOS-Base.repo

[base], [update], [extras], [centosplus] の baseurl を以下のように置き換えます。

/etc/yum.repos.d/CentOS-Base.repo
[base]
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/$basearch/
[updates]
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/updates/$basearch/
[extras]
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/extras/$basearch/
[centosplus]
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/centosplus/$basearch/

yum update を実行して、各パッケージを最新にします。

$ sudo yum update

Docker のインストール

公式な手順 Get Docker Engine - Community for CentOS に従って、以下のようにDockerのインストールを進めます。

古いバージョンの Docker パッケージをアンインストールします。

$ sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

Docker のインストールに必要な yum-utils, device-mapper-persistent-data, lvm2 パッケージをインストールします。

$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2

Docker インストール用リポジトリを yum に追加します。

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

リポジトリーの構成を表示して、docker-ce-stable が含まれていれば問題ありません。

$ sudo yum repolist
読み込んだプラグイン:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
repo ID                         repo name                         status
base/7/x86_64                   CentOS-7 - Base                   10,097
docker-ce-stable/x86_64         Docker CE Stable - x86_64             61
extras/7/x86_64                 CentOS-7 - Extras                    305
updates/7/x86_64                CentOS-7 - Updates                   711

Docker をインストールします。

$ sudo yum install docker-ce docker-ce-cli containerd.io

docker -v で Docker がインストールされたか確認できます。

$ sudo docker -v
Docker version 19.03.4, build 9013bf583a

Docker を起動します。

$ sudo systemctl start docker

以下で Docker の起動を確認します。エラーが出力されなければ、Docker は起動されています。

$ sudo docker search hello-world

Docker の設定

sudo を使わなくても Docker が使えるように、現在のユーザーを docker グループに追加します(docker グループは、Docker インストール後、追加されている)。

$ sudo usermod -aG docker $USER

docker のプロキシを設定します。詳細は公式サイトの Control Docker with systemd に記述されています。

$ sudo mkdir -p /etc/systemd/system/docker.service.d
$ sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf

以下のように、http-proxy.conf に proxy の情報を記述します。

/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://<proxy_host>:<proxy_port>" "HTTPS_PROXY=http://<proxy_host>:<proxy_port>" "NO_PROXY=localhost,127.0.0.1"

設定を反映して、Docker を再起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

docker info で proxy が設定されたか確認ができます。最後の方で以下のように表示されます。

$ docker info
 HTTP Proxy: http://<proxy_host>:<proxy_port>
 HTTPS Proxy: http://<proxy_host>:<proxy_port>
 No Proxy: localhost, 127.0.0.1

以下で、OS 起動時に Docker を自動起動にします。詳細は公式サイトの Configure Docker to start on boot に記述されています。

$ sudo systemctl enable docker

Docker Registry の構築

インストールした Docker を用いて、Docker Registory を構築していきます。

イメージの取得

はじめに、Docker Registry イメージの確認をします。

$ docker search registry

docker pull で Docker Registry イメージを取得します。

$ docker pull registry
Using default tag: latest
latest: Pulling from library/registry
c87736221ed0: Pull complete 
1cc8e0bb44df: Pull complete 
54d33bcb37f5: Pull complete 
e8afc091c171: Pull complete 
b4541f6d3db6: Pull complete 
Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

docker images で registry イメージが取得できていることを確認します。

$ docker images
REPOSITORY          TAG       IMAGE ID         CREATED             SIZE
registry            latest    f32a97de94e1     8 months ago        25.8MB

コンテナの起動

ホスト側に、push されたイメージを保存するために以下のディレクトリを作成します。

/root/docker/registry/

取得した registry イメージをもとに Docker Registry 用のコンテナを docker run で起動します。ポートは5000番を使用します。

$ docker run -d -p 5000:5000 registry
$ docker run -d -p 5000:5000 -v /root/docker/registry/data:/var/lib/registry --restart=always --name registry01 registry:latest

docker ps で Docker Registry コンテナが動作していることを確認します。

$ docker ps
CONTAINER ID  IMAGE            COMMAND                 CREATED        STATUS      PORTS                   NAMES
091ea25e90fe  registry:latest  "/entrypoint.sh /etc…"  8 seconds ago  Up 25 hours 0.0.0.0:5000->5000/tcp  registry01

他 Docker Client から Docker Registry コンテナにアクセス

各種設定

他の環境で、前述と同じように Dockerのインストールを行います。

以下のように、http-proxy.conf の NO_PROXYに Docker Registry のIPアドレスまたはサーバ名を記述します。

/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://<proxy_host>:<proxy_port>" "HTTPS_PROXY=http://<proxy_host>:<proxy_port>" "NO_PROXY=localhost,127.0.0.1,<registry_host>"

insecure registry の設定

Registry が暗号化されていないhttp通信の場合は、insecure registry にその Registry を登録しないと、Dockerイメージをpullすることができないので、設定します。

$ sudo vi /etc/docker/daemon.json

/etc/docker/daemon.json に以下を追加します。

/etc/docker/daemon.json
{ "insecure-registries":["<registry_host>:<registry_port>"] }

設定を反映して、Docker を再起動します。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

イメージの登録

まず、 Docker Registry に登録するイメージを準備する。今回は確認のために hello-world イメージを docker pull します。

$ docker pull hello-world

イメージを Docker Registry に登録するために、hello-world イメージにタグを付けます。

$ docker tag hello-world <registry_host>:5000/hello-world

docker images で <registry_host>:5000/hello-world が作成されていることを確認します。

$ docker images 
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
hello-world                       latest              fce289e99eb9        10 months ago       1.84kB
<registry_host>:5000/hello-world  latest              fce289e99eb9        10 months ago       1.84kB

docker push で <registry_host>:5000/hello-world イメージを Docker Registry に登録します。

$ docker push <registry_host>:5000/hello-world
The push refers to repository [<registry_host>:5000/hello-world]
af0b15c8625b: Pushed 
latest: digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a size: 524

イメージの取得

Docker Registry からイメージの取得する前に、確認のため、ローカルのイメージを削除します。

$ docker rmi <registry_host>:5000/hello-world

docker images で <registry_host>:5000/hello-world が削除されていることを確認します。

$ docker images 
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
hello-world                       latest              fce289e99eb9        10 months ago       1.84kB

docker pull で <registry_host>:5000/hello-world イメージを Docker Registry から取得します。

$ docker pull <registry_host>:5000/hello-world
Using default tag: latest
latest: Pulling from hello-world
Digest: sha256:92c7f9c92844bbbb5d0a101b22f7c2a7949e40f8ea90c8b3bc396879d95e899a
Status: Downloaded newer image for <registry_host>:5000/hello-world:latest

docker images で <registry_host>:5000/hello-world が取得されていることを確認します。

$ docker images 
REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
hello-world                       latest              fce289e99eb9        10 months ago       1.84kB
<registry_host>:5000/hello-world  latest              fce289e99eb9        10 months ago       1.84kB

registry のイメージ一覧の取得

以下の方法で registry のイメージ一覧を取得できます。

$ curl --noproxy <registry_host> http://<registry_host>:5000/v2/_catalog
{"repositories":["hello-world"]}

まとめ

Docker Registry も Docker イメージとして、Docker Hub に登録されていて、取得して、それを使ってコンテナを起動させることで、Docker Registry を構築することができました。Docker Registry コンテナをイントラネット内で使用するためには、proxyの設定が不可欠です。proxy 設定と proxy を使わない設定を正しくできると動作まで辿り着けます。

もし、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。

参考

Docker 公式サイト他に以下の記事を参考にさせていただきました。

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

DockerでUnity ML-Agentsを動作させてみた(v0.11.0対応)

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.11.0対応) - Qiita
https://qiita.com/kai_kou/items/0d40157cbc303fb10c22

手順

v0.10.1まではDockerでの学習方法についてドキュメントがあったのですが、v0.11.0の時点でドキュメントが削除されています。情報としては若干古くなりますが、v0.11.0でもこちらを参考にして動作させることができます。

ml-agents/Using-Docker.md at 0.10.1 · Unity-Technologies/ml-agents
https://github.com/Unity-Technologies/ml-agents/blob/0.10.1/docs/Using-Docker.md

Dockerのインストール

Dockerがインストールされていない場合、インストールします。

Macでbrewコマンド利用
> brew cask install docker
(略)

> docker --version
Docker version 19.03.4, build 9013bf5

※Dockerを初回起動すると初期設定のためにパスワード入力が求められます。

UnityにLinuxビルドサポートコンポーネントを追加する

Unity Hubを利用してUnityにLinuxビルドサポートコンポーネントを追加します。
Unityのバージョンは2019.2.10f1 を利用しています。

Unity Hubがインストールされていない場合は下記をご参考ください。

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

  • Unity Hubアプリを起動する
  • [インストール] > [Unityの利用するアプリ]右側にある[︙]をクリックして[モジュールを加える]を選択する 2019_11_06_13_02のコピー.png 2019_11_06_13_02のコピー2.png
  • [モジュールを加える]ダイアログの[Platforms]にある[Linux Build Support]にチェックを入れて[実行]ボタンをクリックする 2019_11_06_13_03.png

学習用のUnityアプリをダウンロードしてビルドする

ML-Agentsリポジトリに含まれているサンプルを学習できるようにします。

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

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

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

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

Unity Hubでアプリを立ち上げます。
ML-Agentsを利用するにはUnityのバージョン2017.4 以上が必要となります。今回は2019.2.10f1 を利用しました。

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

2019_11_05_16_58.png
2019_11_05_17_00のコピー.png
2019_11_05_17_01のコピー.png

Unityエディタのバージョンによっては、アップグレードするかの確認ダイアログが立ち上がります。

2019_11_05_17_02のコピー.png

「確認」ボタンをクリックして進めます。アップグレード処理に少し時間がかかります。

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

起動しました。

今回は、サンプルにある[3DBall]Scenesを利用します。

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

スクリーンショット 2019-11-06 10.13.57.png

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

ビルド設定

  • Unityアプリの[File]メニューから[Build Settings]を選択して[Build Settings]ダイアログを開く
    • [Add Open Scenes]をクリックする
    • [Scenes In Build]で[ML-Agents/Examples/3DBall/Scenes/3DBall]にチェックを入れる
    • [Platform]でPC, Mac & Linux Standalone が選択されていることを確認する
    • [Target Platform]をLinux に変更する
    • [Architecture]をx86_64 に変更する
    • [Server Build]にチェックを入れる
    • [Build]ボタンをクリックする
    • ファイル保存ダイアログで以下を指定してビルドを開始する
      • ファイル名: 3DBall
      • フォルダ名: 任意のディレクトリ/ml-agents/unity-volume

Build_Settings
Build_Settings

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

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

3DBall.x86_64 3DBall_Data

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

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

> cp ml-agents/config/trainer_config.yaml ml-agents/unity-volume/

Dockerイメージを作成する

すでにDockerfileが用意されているので、docker build するだけ。楽々ですね。
ml-agents-on-docker はイメージ名となりますので、任意でOKです。

> docker build -t ml-agents-on-docker ./ml-agents

(略)
Removing intermediate container c1384ee9d5a6
 ---> 9ff8832e88dc
Step 19/20 : EXPOSE 5005
 ---> Running in 53253a272fb4
Removing intermediate container 53253a272fb4
 ---> f0b43146ad36
Step 20/20 : ENTRYPOINT ["mlagents-learn"]
 ---> Running in f80f7504b790
Removing intermediate container f80f7504b790
 ---> 9caddd5a62b1
Successfully built 9caddd5a62b1
Successfully tagged ml-agents-on-docker:latest


> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ml-agents-on-docker latest              9caddd5a62b1        2 minutes ago       1.23GB

注意点

ml-agents ディレクトリ直下でdocker build コマンドを実行するとエラーになるのでご注意ください。

> cd ml-agents
> docker build -t ml-agents-on-docker .

error checking context: 'file ('/Users/xxx/xxxxx/ml-agents/UnitySDK/Temp') not found or excluded by .dockerignore'.

v0.10.0からPython 3.7.xにも対応しましたが、Dockerfile を覗いてみるとPyhtonのバージョンは3.6.4 のままでした。

Dockerfile一部抜粋
ENV PYTHON_VERSION 3.6.4

Dockerコンテナの実行

ビルドできたら実行してみます。

bashの場合
# ml-agents-3dball: コンテナ名(任意)
# ml-agents-on-docker: Dockerでビルド時に付けたイメージ名
# 3DBall: Unityでビルド時に付けたアプリの名前(拡張子なし)

> cd ml-agents
> docker run -it --rm \
  --name ml-agents-3dball \
  --mount type=bind,source="$(pwd)"/unity-volume,target=/unity-volume \
  -p 5005:5005 \
  -p 6006:6006 \
  ml-agents-on-docker:latest \
    --docker-target-name=unity-volume \
    --env=3DBall \
    --train \
    trainer_config.yaml

mlagents-learn コマンドの--docker-target-name オプションはdocker run コマンドの--workdir(-w) に置き換えることもできます。

> docker run -it --rm \
  --name ml-agents-3dball \
  --mount type=bind,source="$(pwd)"/unity-volume,target=/unity-volume \
  -w /unity-volume \
  -p 5005:5005 \
  -p 6006:6006 \
  ml-agents-on-docker:latest \
    --env=3DBall \
    --train \
    trainer_config.yaml

fishシェルで実行する場合は、"$(pwd)""$PWD" に置き換えます。

fishの場合
> cd ml-agents
> docker run -it --rm \
  --name ml-agents-3dball \
  --mount type=bind,source="$PWD"/unity-volume,target=/unity-volume \
  -p 5005:5005 \
  -p 6006:6006 \
  ml-agents-on-docker:latest \
    --docker-target-name=unity-volume \
    --env=3DBall \
    --train \
    trainer_config.yaml

実行すると、学習が始まります。
trainer_config.yamlmax_steps で指定されているステップ数が完了するか、ctrl + c キーで学習が終了します。

> docker run ()



                        ▄▄▄▓▓▓▓
                   ╓▓▓▓▓▓▓█▓▓▓▓▓
              ,▄▄▄m▀▀▀'  ,▓▓▓▀▓▓▄                           ▓▓▓  ▓▓▌
            ▄▓▓▓▀'      ▄▓▓▀  ▓▓▓      ▄▄     ▄▄ ,▄▄ ▄▄▄▄   ,▄▄ ▄▓▓▌▄ ▄▄▄    ,▄▄
          ▄▓▓▓▀        ▄▓▓▀   ▐▓▓▌     ▓▓▌   ▐▓▓ ▐▓▓▓▀▀▀▓▓▌ ▓▓▓ ▀▓▓▌▀ ^▓▓▌  ╒▓▓▌
        ▄▓▓▓▓▓▄▄▄▄▄▄▄▄▓▓▓      ▓▀      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌   ▐▓▓▄ ▓▓▌
        ▀▓▓▓▓▀▀▀▀▀▀▀▀▀▀▓▓▄     ▓▓      ▓▓▌   ▐▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▌    ▐▓▓▐▓▓
          ^█▓▓▓        ▀▓▓▄   ▐▓▓▌     ▓▓▓▓▄▓▓▓▓ ▐▓▓    ▓▓▓ ▓▓▓  ▓▓▓▄    ▓▓▓▓`
            '▀▓▓▓▄      ^▓▓▓  ▓▓▓       └▀▀▀▀ ▀▀ ^▀▀    `▀▀ `▀▀   '▀▀    ▐▓▓▌
               ▀▀▀▀▓▄▄▄   ▓▓▓▓▓▓,                                      ▓▓▓▓▀
                   `▀█▓▓▓▓▓▓▓▓▓▌
                        ¬`▀▀▀█▓


INFO:mlagents.trainers:CommandLineOptions(debug=False, num_runs=1, seed=-1, env_path='3DBall', run_id='ppo', load_model=False, train_model=True, save_freq=50000, keep_checkpoints=5, base_port=5005, num_envs=1, curriculum_folder=None, lesson=0, slow=False, no_graphics=False, multi_gpu=False, trainer_config_path='trainer_config.yaml', sampler_file_path=None, docker_target_name='unity-volume', env_args=None, cpu=False)
INFO:mlagents.envs:
'Ball3DAcademy' started successfully!
Unity Academy name: Ball3DAcademy
        Number of Training Brains : 0
        Reset Parameters :
                gravity -> 9.8100004196167
                scale -> 1.0
                mass -> 1.0

(略)
2019-11-07 05:31:38.593118: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-11-07 05:31:38.604956: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2400000000 Hz
2019-11-07 05:31:38.607307: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x39ccf70 executing computations on platform Host. Devices:
2019-11-07 05:31:38.607465: I tensorflow/compiler/xla/service/service.cc:175]   StreamExecutor device (0): <undefined>, <undefined>
(略)
2019-11-07 05:31:40.131532: W tensorflow/compiler/jit/mark_for_compilation_pass.cc:1412] (One-time warning): Not using XLA:CPU for cluster because envvar TF_XLA_FLAGS=--tf_xla_cpu_global_jit was not set.  If you want XLA:CPU, either set that envvar, or use experimental_jit_scope to enable XLA:CPU.  To confirm that XLA is active, pass --vmodule=xla_compilation_cache=1 (as a proper command-line flag, not via TF_XLA_FLAGS) or set the envvar XLA_FLAGS=--xla_hlo_profile.
INFO:mlagents.envs:Hyperparameters for the PPOTrainer of brain 3DBall:
        trainer:        ppo
        batch_size:     64
        beta:   0.001
        buffer_size:    12000
        epsilon:        0.2
        hidden_units:   128
        lambd:  0.99
        learning_rate:  0.0003
        learning_rate_schedule: linear
        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/ppo_3DBall
        model_path:     /unity-volume/models/ppo-0/3DBall
        keep_checkpoints:       5
WARNING:tensorflow:From /ml-agents/mlagents/trainers/trainer.py:223: The name tf.summary.text is deprecated. Please use tf.compat.v1.summary.text instead.

WARNING:tensorflow:From /ml-agents/mlagents/trainers/trainer.py:223: The name tf.summary.text is deprecated. Please use tf.compat.v1.summary.text instead.



INFO:mlagents.trainers: ppo: 3DBall: Step: 1000. Time Elapsed: 10.062 s Mean Reward: 1.167. Std of Reward: 0.724. Training.
(略)
INFO:mlagents.trainers: ppo: 3DBall: Step: 10000. Time Elapsed: 109.367 s Mean Reward: 36.292. Std of Reward: 28.127. Training.
(略)
INFO:mlagents.trainers: ppo: 3DBall: Step: 49000. Time Elapsed: 520.514 s Mean Reward: 100.000. Std of Reward: 0.000. Training.
(略)
Converting /unity-volume/models/ppo-0/3DBall/frozen_graph_def.pb to /unity-volume/models/ppo-0/3DBall.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/ppo-0/3DBall.nn file.
INFO:mlagents.trainers:Exported /unity-volume/models/ppo-0/3DBall.nn file
INFO:mlagents.envs:Environment shut down with return code 0.

WARNING がかなり出力されますが、学習できました。

TensorBoard を利用して学習の進捗を視覚的に確認することもできます。

> docker exec -it \
  ml-agents-3dball \
  tensorboard \
  --logdir=/unity-volume/summaries \
  --host=0.0.0.0

(略)
  _np_qint32 = np.dtype([("qint32", np.int32, 1)])
/usr/local/lib/python3.6/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  np_resource = np.dtype([("resource", np.ubyte, 1)])
TensorBoard 1.14.0 at http://0.0.0.0:6006/ (Press CTRL+C to quit)

スクリーンショット 2019-11-07 10.51.50.png

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

学習結果は、ml-agents/unity-volume フォルダ内に保存されます。
それをUnityアプリに組み込むことで学習結果をUnityアプリに反映できます。

> ls unity-volume/

3DBall.x86_64       3DBall_Data         csharp_timers.json  models              summaries           trainer_config.yaml

> tree unity-volume/models/
unity-volume/models/
└── ppo-0
    ├── 3DBall
    │   ├── checkpoint
    │   ├── frozen_graph_def.pb
    │   ├── model-50000.cptk.data-00000-of-00001
    │   ├── model-50000.cptk.index
    │   ├── model-50000.cptk.meta
    │   ├── model-50001.cptk.data-00000-of-00001
    │   ├── model-50001.cptk.index
    │   ├── model-50001.cptk.meta
    │   └── raw_graph_def.pb
    └── 3DBall.nn

2 directories, 10 files

Unityアプリの設定

Playerの設定を行います。

  • Unityアプリの[Edit]メニューから[Project Settings]を選択する
  • [Inspector]ビューの[Other Settings]欄で以下を確認・設定する
    • Scripting BackendがMono になっている
    • Api Conpatibility Levelが.NET 4.x になっている スクリーンショット 2019-11-06 11.23.45.png

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

ターミナルかFinderで学習結果を以下フォルダにコピーします。

  • 学習結果ファイル: models/ppo-0/3DBall.nn
  • 保存先: UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/

※すでに保存先に3DBall.nn ファイルが存在していますので、リネームします。

> cp models/ppo-0/3DBall.nn ml-agents/UnitySDK/Assets/ML-Agents/Examples/3DBall/TFModels/3DBall_new.nn
  • Unityアプリの下パネルにある[Project]タブから以下のフォルダまで開く
    • [Assets] > [ML-Agents] > [Examples] > [3DBall] > [Scenes]
  • 開いたら、[3DBall]ファイルがあるので、ダブルクリックして開く
  • [Hierarchy]パネルから[Agent]を選択する
  • Unityアプリの[Project]パネルで以下フォルダを選択する
    • [Assets] > [ML-Agents] > [Examples] > [3DBall] > [TFModels]
  • Unityアプリの[Inspector]パネルにある[Model]という項目に[TFModels]フォルダ内の3DBall_new.nnファイルをドラッグ&ドロップする
    2019_11_06_11_28のコピー.png

  • Unity上部にある[▶]ボタンをクリックする

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

参考

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

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

ml-agents/Using-Docker.md at 0.10.1 · Unity-Technologies/ml-agents
https://github.com/Unity-Technologies/ml-agents/blob/0.10.1/docs/Using-Docker.md

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

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

Ruby on Rails 6のDockerでの環境構築

Ruby on Rails Advent Calendar 2019 5日目の記事になります。

Ruby on Rails 4.2のみ経験者でちょっと触れただけですが、3年ぶりくらいに環境構築してみました。
本当は環境構築だけじゃなくて弄くり回しかったところですが、環境構築だけでタイムアップでした。

【Rails】Rails 6.0 x Docker x MySQLで環境構築
zazk/Rails-6-Docker-Alpine
Quickstart: Compose and Rails
を大いに参考にさせていただきました。

環境

  • macOS Mojave
  • Docker for Mac
  • Ruby on Rails 6.0
  • PostgreSQL 11.1

初期状態のディレクトリ構成

.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── entrypoint.sh
└── docker-compose.yml

Dockerfileの設定

FROM ruby:2.6
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
    && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
    && apt-get update -qq \
    && apt-get install -y nodejs yarn \
    && mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ["rails", "server", "-b", "0.0.0.0"]

docker-compose.ymlの設定

docker-compose.yml
version: "3"
services:
  db:
    image: postgres:11.1-alpine
  web:
    build: .
    command: bundle exec rails server -b 0.0.0.0
    volumes:
      - ./:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

Gemfileの設定

source 'https://rubygems.org'
gem 'rails', '~>6'

Gemfile.lockの作成(空のファイル)

$ touch Gemfile.lock

entrypoint.shの作成

entrypoint.sh
#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

一旦Buildしてrails newでアプリ作成

$ docker-compose build
$ docker-compose run web rails new . --force --webpack --database=postgresql

再度Build

$ docker-compose build

./config/database.ymlの編集

database.yml



default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: db
  username: postgres

development:
  <<: *default
  database: postgres



docker-compose up を実行してサーバー立ち上げ

$ docker-compose up 

アクセス

0.0.0.0:3000にアクセスすると

Screenshot from Gyazo

苦戦したところとか

  • webpackerはyarn必須で辛い。というかyarnがないとそもそもサーバーすら立ち上がらないのか...
  • 依存関係が複雑すぎてbundle installでコケまくる
  • とりあえず公式ドキュメント読んだ方がいい。Alpine Linux難しい。

明日は@jkr_2255さんの記事です!

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

Docker Experimental Featuresを有効化してCRIUをやってみる

はじめに

これはCyberAgent 20新卒 エンジニア Advent Calendar 2019の5日目の記事です。

概要

Docker v1.13.0からDocker Experimental Features(Dockerの実験的機能)が追加されました。本記事では、Docker Experimental Featuresを有効にする方法とCRIU機能を試してみます。

Docker Experimental Featuresの有効化

まず、Dockerで実験的機能を使用するには、Docker Experimental Featuresの有効化が必要です。現在のExperimental Featuresの状態は以下のコマンドで確認できます。

$ docker version -f '{{.Server.Experimental}}'
false

今は、Experimental Featuresは有効化になっていないので、falseとなってます。これをtrueにするには、/etc/docker/daemon.jsonに以下のJSONを定義します。

/etc/docker/daemon.json
{
    "experimental": true
}

JSONを定義したら、以下のコマンドでDocker daemonを再起動します。

$ sudo systemctl restart docker

その後にDocker Experimental Featuresの有効化されていることが確認できます。

$ docker version -f '{{.Server.Experimental}}'
true

CRIU

まずCRIUって何?

CRIUとは、Checkpoint Restart In Userspaceの略でLinuxのプロセスの状態を保存して停止させ、また同じ状態で再開させる機能のことです。CRIUには、チェックポイント機能とリストア機能があり、チェックポイント機能により、コンテナ状態(メモリ情報など)をdumpして、ディスク上に書き出すことができます。また、リストア機能とは書き出した情報を読み込んでコンテナを実行することができる機能です。

実際にやってみる

コンテナの起動

まずは、サンプルのコンテナを起動します。使うイメージは、rky1011/criu-sampleです。

$ sudo docker run --name cr -d rky1011/criu-sample
7023be792739af4a27a9761a4c48342b68fd7fc04160d48573beef52ff5f365b

ログを確認して、コンテナが正常に起動しているか確認します。

$ sudo docker logs cr
2019/12/02 04:54:15 2019-12-02 04:54:15.012989234 +0000 UTC m=+10.003540648: count 1
2019/12/02 04:54:16 2019-12-02 04:54:16.013291109 +0000 UTC m=+11.003842518: count 2
2019/12/02 04:54:17 2019-12-02 04:54:17.013561152 +0000 UTC m=+12.004112544: count 3
2019/12/02 04:54:18 2019-12-02 04:54:18.013957634 +0000 UTC m=+13.004509047: count 4
2019/12/02 04:54:19 2019-12-02 04:54:19.014297065 +0000 UTC m=+14.004848477: count 5
2019/12/02 04:54:20 2019-12-02 04:54:20.014497531 +0000 UTC m=+15.005048944: count 6
2019/12/02 04:54:21 2019-12-02 04:54:21.014818609 +0000 UTC m=+16.005370001: count 7
2019/12/02 04:54:22 2019-12-02 04:54:22.015050647 +0000 UTC m=+17.005602048: count 8
2019/12/02 04:54:23 2019-12-02 04:54:23.015328591 +0000 UTC m=+18.005880012: count 9

チェックポイントの作成

チェックポイントの作成を行います。コマンドはdocker checkpoint create {container name} {checkpoint name}です。-leave-running=falseを指定すれば、コンテナを停止せずにチェックポイントの作成をできますが、今回はチェックポイント作成と同時にコンテナを停止します。

$ sudo docker checkpoint create cr checkpoint1
checkpoint1

コンテナが起動していいないことを確認できます。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

コンテナの復旧

checkpointを作成して停止したコンテナを再起動します。コマンドはdocker start --checkpoint {checkpoint name} {container name}です。

$ sudo docker start --checkpoint checkpoint1 cr

ログを確認すると、カウントや時刻が途中から実行されていることを確認できます。

$ sudo docker logs cr
2019/12/02 04:54:15 2019-12-02 04:54:15.012989234 +0000 UTC m=+10.003540648: count 1
2019/12/02 04:54:16 2019-12-02 04:54:16.013291109 +0000 UTC m=+11.003842518: count 2
2019/12/02 04:54:17 2019-12-02 04:54:17.013561152 +0000 UTC m=+12.004112544: count 3
2019/12/02 04:54:18 2019-12-02 04:54:18.013957634 +0000 UTC m=+13.004509047: count 4
2019/12/02 04:54:19 2019-12-02 04:54:19.014297065 +0000 UTC m=+14.004848477: count 5
2019/12/02 04:54:20 2019-12-02 04:54:20.014497531 +0000 UTC m=+15.005048944: count 6
2019/12/02 04:54:21 2019-12-02 04:54:21.014818609 +0000 UTC m=+16.005370001: count 7
2019/12/02 04:54:22 2019-12-02 04:54:22.015050647 +0000 UTC m=+17.005602048: count 8
2019/12/02 04:54:23 2019-12-02 04:54:23.015328591 +0000 UTC m=+18.005880012: count 9    # checkpointを作成した場所
2019/12/02 04:55:35 2019-12-02 04:55:35.465808992 +0000 UTC m=+90.456360361: count 10   # コンテナをcheckpointの一から再実行
2019/12/02 04:55:36 2019-12-02 04:55:36.46625664 +0000 UTC m=+91.456808027: count 11
2019/12/02 04:55:37 2019-12-02 04:55:37.46654395 +0000 UTC m=+92.457095336: count 12
2019/12/02 04:55:38 2019-12-02 04:55:38.466772112 +0000 UTC m=+93.457323548: count 13
2019/12/02 04:55:39 2019-12-02 04:55:39.467092506 +0000 UTC m=+94.457643825: count 14

まとめ

CRIUを使うと、コンテナが不意に停止しても、コンテナの実行を継続することができるようになります。現状では、実験的機能としてしか提供されていないのですが、様々な可能性を秘めていると思います。いつか本番環境でも使えると良いですね!

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

IBM Cloud をコンソールで操作する IBM Cloud CLI の様々な利用方法のまとめ

IBM Cloud は Web 画面でも操作できますが、操作量が多い場合には、IBM Cloud CLI ソフトウェアを利用したコンソールからの操作が快適です。

IBM Cloud CLI の利用方法は幾つかありますので、ざっと整理してまとめてみました。特に業務用PCなどで、ソフトウェアの追加に制限がある場合、これらの選択肢のどれかが役に立つとおもいます。

「Web 端末」機能を利用する

自分のPCが管理されていて、ソフトウェアのインストールが難しい場合、この 裏技 が役に立つかもしれません。

IBM Cloud の有償(PAYG/Subscription)アカウント限定の方法なのですが、Kubernetes クラスタを作成して、そのWeb 端末(コンソール)を利用する方法があります。

まずは無料の Kubernetes クラスタを作成します。30日間で削除されてしまいますので、定期的に作り直す必要があります。
image.png
「作成の要求中」の緑の進捗バーが終了するまで20~30分ほど放置します。完了したら右にある [Web端末] 機能が利用できるようになります。
image.png
以下のような表示が出ますが、ブラウザのプラグインの導入ではないようです。たぶんIBM Cloud側で対応するサーバー機能をインストールするのではないかと。[インストール] を選択して進めましょう。
image.png
そして再び [Web端末] ボタンをクリックすると、以下のような端末(ターミナル)が起動します。
image.png
ibmcloud ks コマンドを使用するようにガイドされていますが、単なる Linux のコンソールなので、いろいろな操作が可能です。

当然ながら ibmcloud CLI が用意されていますので、以下のようにログインコマンドを実行しましょう。

ibmcloud login -a cloud.ibm.com -r us-south

すると以下のように普通にログインできますので、CF アプリの管理など実行できます。
image.png
git コマンド使えますし、vi でテキストファイルの編集ができましたので、ちょっとした開発なら出来てしまいそうですね。
image.png
Kubernetes クラスターをお使いの方であれば、いつでも使えるのが利点です。例えば出先でちょっと、他人のWebブラウザをプライベートモードで借りて、コンソール操作をしたい場合などに利用できそうです。

ただし Kubernetes クラスター操作以外は正式な使い方ではないと思いますので、突然使えなくなるかもしれません。その点はご了承ください。

Play with Docker を利用する

自分のPCが管理されていて、ソフトウェアのインストールが難しい場合、Docker も入っていないですよね。そんな時、この 裏技 その2 が役に立つかもしれません。こちらも Web ブラウザのみで実施できる方法です。

Docker の Playground 環境である、Play with Docker サイトを利用します。Docker Hub の Docker ID があれば、無料で最長4時間、Docker 環境を試せるサイトです。

利用するのは Docker HUB にある以下のイメージです。

早速、Play with Docker にログインしてみましょう。以下のように4時間のタイマーが表示されるので、[ADD NEW INSTANCE] をクリック。
image.png
すると docker が利用できる仮想環境が作成されて、そのコンソールが標示されます。

docker pull ibmcom/ibm-cloud-developer-tools-amd64
docker run -ti ibmcom/ibm-cloud-developer-tools-amd64

とコマンドを入力すれば、IBM Cloud CLI の利用を開始できます。

ibmcloud login -a cloud.ibm.com -r us-south

で IBM Cloud にログインし、サービスを使い始めましょう。
image.png
こちらも git コマンドを使えますし、vi でテキストファイルの編集ができましたので、ちょっとした開発なら出来てしまうでしょう。Kubernetes クラスタを操作する kubectl コマンドも入っていますよ!

本格的に使用する場合、このコンソール上で CentOS などのベースイメージを元に、IBM Cloud CLI やその他必要な Docker イメージを作成し、自分用に Docker Hub に登録してしまうのもアリかもしれません。

ただし表示される警告の通り、このサイトではセキュリティ的な問題が発生する可能性があります。業務アカウントなどでの利用は避け、個人の学習やテスト目的に限定して利用するべきですし、また取り扱う情報にも注意が必要です。

最大で4時間の利用ですので、時間切れには気をつけましょう。継続して作業をしたい場合には、早めにインスタンスを再作成する必要がありそうです。ただし再作成では作業中のファイルが失われるので、いったんどこかに保持しておく必要があります。

ちょっと操作してみる

せっかくログオンしたので、NodeJS アプリを新規に作成してみましょう。

git clone https://github.com/sclorg/nodejs-ex
cd nodejs-ex

と実行し、GitHub リポジトリから nodejs-ex サンプルをダウンロードします。せっかくですので、少し修正します。以下のように vi エディタで表示する html の中身を少し書き換えておきます。

※ vi の操作は こちら。難しい場合はスキップしてもかまいません。

vi views/index.html

そして以下のコマンドで IBM Cloud 環境にアップロード(push)します。

ibmcloud cf push nodejs-ex -m 64M --hostname yamachan-nodejs-ex

こんな感じでアップロードが完了しました。
image.png
IBM Cloud の Web コンソールで、アプリが追加されているのを確認しましょう。アプリ名と使用メモリ量が、コマンドで指定した値になっています。
image.png
そして [アプリ URL にアクセス] してみましょう。公開されたホスト名がコマンドで指定された値になっていることを確認します。また html への修正(今回はタイトルの OpenShift を PWD に変更)が反映されているのも確認しましょう。
image.png
ね、ちょっとしたアプリの作成ならこんな感じで実施できちゃいます。

Docker を利用する

PC に Docker が導入されていれば、話はより簡単。ターミナル (Windows の場場合は PowerShell もしくはコマンドプロンプト) を開き、以下のようにコマンドを実行します。

docker pull ibmcom/ibm-cloud-developer-tools-amd64
docker run -ti ibmcom/ibm-cloud-developer-tools-amd64
ibmcloud login -a cloud.ibm.com -r us-south

image.png
詳細は Play with Docker サイトと同じ。終了は exit コマンドです。

Docker さえ入っていれば簡単に実行できますし、PC 環境に何もインストールせず、影響を与えないので、わりとお勧めの方法です。

PC にインストールする

さて、日常的に IBM Cloud CLI を使用する方は、特に理由がなければ、PC へのインストールを実施すべきでしょう。

この場合、以下の2つのインストール方法があります。

前者は全部入りです。IBM Cloud CLI だけでなく、Docker、git、Helm、kubectl、curl など、基本的なツールがまとめて入ります。これから開発を始める初心者にお勧めします。

それに対して後者はシンプルに IBM Cloud CLI だけをインストールします。git など既にインストール済みの上級者はこちらをお勧めします。

なお Windows7 や Windows10 Home などをお使いの場合、Docker Desktop for Windows が導入できませんので、後者のスタンドアローン版を利用してください。

というわけで

IBM Cloud CLI を利用する際のセットアップ方法について、ざっと整理してまとめてみました。

特に業務用PCなどで、ソフトウェアの追加に制限がある場合、これらの選択肢が役に立つとおもいます。また既にインストール済みの方でも、新しいバージョンをちょっと試したい場合などに、これら方法を使って貰えればと思います。

それではまた!

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

code-server (5) DBなども含めたMVC環境を用意してみよう (2)

これは、2019年 code-server に Advent Calender の 第4日目の記事です。今回も、code-server って何だろう?と言う事を解説していきます。

(1) code-server って何?
(2) Dockerで独自のcode-server 環境を作って見る
(3) VSCode の Plugin を 利用してみる
(4) DBなども含めたMVC環境を用意してみよう (1)
(5) DBなども含めたMVC環境を用意してみよう (2)

(..) ローカルで、DBなどの環境も含めて構築するには
(..) オンライン上に置くには?
(..) K8Sなどの最近の流行りの環境と連携するには?
(..) Code-Serverを改造して、より良くしたい

前回の続きで、flaskを動作させてみます。

今回の何?

Terminalが便利。Bashがオススメ

VSCodeなので、Terminalを利用できます。
Linuxをcliで操作できます。なので、別途sshを立ち上げたり

dockeer-compose exec -it app bash

などして、別途 Terminalを立ち上げる必要もなくなります。
私は、bashが使いバレているので、最初に

bash

と入力するようにしています。

Flaskとは

軽量のWebFrameworkです。超簡単にWebページを作成する事ができます。

https://github.com/pallets/flask

Flask環境を作成してみよう!!

Screen Shot 2019-12-05 at 0.55.13.png

前回の続きから初めてみます。

requirements.txt を作成します。

requirements.txt
flask

コマンドライン上で、

pip install -r requirements.txt 

コードを書いてみます。

main.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello, World!"

app.run("0.0.0.0",port=8080)

実行してみましょう!!

$ python main.py 
 * Serving Flask app "main" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)

http://127.0.0.1:8080/ をブラウザーで開くと、Hello,World! と表示されます

Screen Shot 2019-12-05 at 1.11.23.png

次回

db の 環境を作成してみます

PS

ソース

https://github.com/kyorohiro/advent-2019-code-server

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

code-server (4) DBなども含めたMVC環境を用意してみよう (1)

これは、2019年 code-server に Advent Calender の 第4日目の記事です。今回も、code-server って何だろう?と言う事を解説していきます。

(1) code-server って何?
(2) Dockerで独自のcode-server 環境を作って見る
(3) VSCode の Plugin を 利用してみる
(4) DBなども含めたMVC環境を用意してみよう (1)
(5) DBなども含めたMVC環境を用意してみよう (2)

(..) ローカルで、DBなどの環境も含めて構築するには
(..) オンライン上に置くには?
(..) K8Sなどの最近の流行りの環境と連携するには?
(..) Code-Serverを改造して、より良くしたい

今回から2-3回に渡って、ローカルで動作する web framework の開発環境を作成していきます。

docker-compose を利用して、db、phpmyadmin、flask を利用した開発環境を構築してみましょう!!

今回の何?

チームでの開発環境を構築するコストを無くす事ができる

code-server の 開発元である Coder でも解説されていますが、
https://coder.com/docs/introduction

チームでの開発環境を構築するコストを無くす事が、code-server で 実現できます。
一度、環境を構築して、イメージを固めることで、2度と開発環境を構築する必要がなくなります。

Docker-Composeで利用してみよう

前回作成したPythonの環境を、docker-compose から呼び出すようにして呼び出してみます。

docker-compose.yml
version: '3'
services: 
  app:
    build: ./app
    ports: 
      - 8443:8443
      - 8080:8080
    volumes:
      - ./app:/works/app
    command: /works/code-server --allow-http --auth none --port 8443 /works/app

以下のように配置しています。

$ find . -type f
.
./app
./app/Dockerfile
./app/main.py
./docker-compose.yml

docker-compose.yml は、前回の呼び出しコマンドとほとんど同じですね!!

https://docs.docker.com/compose/compose-file/

などを、参考にすると良いでしょう。

実行してみよう

$ docker-compose build
$ docker-compose up -d

とする事で、code-server を 起動 できます。

そして、
ブラウザーで http://127.0.0.1:8443/ にアクセスすると、
Screen Shot 2019-12-03 at 5.39.02.png

VSCodeを開く事ができます

次回

flash という python の web framework の 環境を作成してみます

PS

ソース

https://github.com/kyorohiro/advent-2019-code-server

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