- 投稿日:2020-05-14T23:35:56+09:00
Reactとfirebaseでアプリケーションを作る①
ReactとFirebaseでアプリケーションを作る①
①では、環境作成と下地作りまでです。
やりたいこと
- Reactのチュートリアルで基礎を学ぶ
- チュートリアルを参考に、一人神経衰弱ゲームを作る
- Firebase Authentication を使ってログイン認証する
- Firebase を使ってデータを管理する
チュートリアルを修正して、一人神経衰弱ゲームを作る
チュートリアルは、「チュートリアル:React の導入」を利用する。
今回、理解するポイントはチュートリアルの通り。チュートリアルの準備:以下のチュートリアルを進めるにあたっての開始地点です。
概要:コンポーネントや props、state といった基礎概念について学びます。
ゲームを完成させる:React での開発における非常によくある技法について学びます。チュートリアルの準備
環境を作る
以前作成したDockerのReact環境「DockerにReact環境を構築する」をクローンする。
git clone https://github.com/abiitaka/docker-react.git react-firebase
docker-compose.ymlとinit.shのプロジェクト名を変更する。
- 変更前:
reactstudy01→ 変更後:react-firebase以降は、チュートリアルの不要なファイルを削除するところから進めていく。
Reactのチュートリアルで基礎を学ぶ
三目並べを作る
チュートリアルに従って進めていくと三目並べは完成する。
作ったソースは以下にあります。
三目並べ作成チュートリアルのポイント
Reactのチュートリアルでは、リフトアップとイミュータビリティについて補足説明をしている。
以下の2点がポイントです。リフトアップ
複数の子要素からデータを集めたい、または 2 つの子コンポーネントに互いにやりとりさせたいと思った場合は、代わりに親コンポーネント内で共有の state を宣言する必要があります。親コンポーネントは props を使うことで子に情報を返すことができます。こうすることで、子コンポーネントが兄弟同士、あるいは親との間で常に同期されるようになります。
このように state を親コンポーネントにリフトアップ (lift up) することは React コンポーネントのリファクタリングでよくあることですので、この機会に挑戦してみましょう。
また、「state のリフトアップ」にも、まとめられています。
イミュータビリティ
ミュータブル (mutable) なオブジェクトは中身が直接書き換えられるため、変更があったかどうかの検出が困難です。ミュータブルなオブジェクト変更の検出のためには、以前のコピーと比較してオブジェクトツリーの全体を走査する必要があります。
イミュータブルなオブジェクトでの変更の検出はとても簡単です。参照しているイミュータブルなオブジェクトが前と別のものであれば、変更があったということです。
mutable、immutableの変更検出は、scpとして「shouldComponentUpdate の実際の動作」にまとめられています。
チュートリアルを参考にひとり神経衰弱ゲームを作る
ルール
- 3x4のマス目を作る
- マスに1〜6までの数字のペアを配置する
- クリックすると数字を表示する
- 2箇所クリックすると数字が表示される
- 表示した数字がペアかどうか判断する
- ペアであれば表示し、ペアでなければ表示しない
ソース
かなり強引なやり方ですが、、、
class Board extends React.Component { constructor(props) { super(props); this.state = { xIsNext: true, squares: Array(12).fill(null), gameBoard: [3, 2, 6, 2, 6, 5, 5, 4, 1, 3, 1, 4], history: [], clickCount: 1, isPair: false, pairCount: 0, isStart: true, } } handleClick(i) { const squares = this.state.squares.slice(); if (squares[i] && this.state.gameBoard.length === 0) { return; } // 盤表示 squares[i] = this.state.gameBoard[i]; // 表示履歴 this.state.history.push(i); // ペア判定 let isPair = this.isPair(this.state.history); let pairCount = this.state.pairCount; if (isPair) { pairCount = pairCount + 1; } this.setState({ squares: squares, history: this.state.history, clickCount: this.state.clickCount + 1, isPair: isPair, pairCount: pairCount, }); // ペア一致しない場合はボード版を戻す this.reverseBoard(this.state.history, squares, isPair); } isPair(history) { if (!this.isTwoClick(history)) { return false; } const oneIndexHistory = history[history.length - 2]; const twoIndexHistory = history[history.length - 1]; if (this.state.gameBoard[twoIndexHistory] === this.state.gameBoard[oneIndexHistory]) { return true; } else { return false; } } isTwoClick(history) { const isTwoClick = history.length % 2; return !(isTwoClick === 1) } reverseBoard(history, squares, isPair) { if (!this.isTwoClick(history)) { return; } if (!isPair) { setTimeout(() => { // ボードを2つ戻す squares[history[history.length - 2]] = null; squares[history[history.length - 1]] = null; this.setState({ squares: squares, }); }, 300); } } renderSquare(i) { return ( <Square value={this.state.squares[i]} onClick={() => this.handleClick(i)} /> ); } render() { const isEnd = (this.state.squares[0] && this.state.pairCount === this.state.gameBoard.length / 2); return ( <div> <p>{!isEnd ? (this.state.pairCount + 'ペア ') : 'ゲーム終了'}</p> <div className="board-row"> {this.renderSquare(0)} {this.renderSquare(1)} {this.renderSquare(2)} {this.renderSquare(3)} </div> <div className="board-row"> {this.renderSquare(4)} {this.renderSquare(5)} {this.renderSquare(6)} {this.renderSquare(7)} </div> <div className="board-row"> {this.renderSquare(8)} {this.renderSquare(9)} {this.renderSquare(10)} {this.renderSquare(11)} </div> </div> ); } }作ったソースは以下にあります。
一人神経衰弱ゲーム作成Firebase Authentication と Firebase は、「ReactとFirebaseでアプリケーションを作る②(準備中)」でまとめます。
- 投稿日:2020-05-14T22:38:53+09:00
vagrantのプラグイン
Vagrantのプラグインのインストールコマンド。
新しい端末を使うときくらいしか打たないのですぐに忘れてしまうので、今更メモ。vagrant plugin install vagrant-vbguest vagrant plugin install vagrant-docker-composeインストールされているのを調べるのには
list。vagrant plugin listアップデートは
update。vagrant plugin update以上。
- 投稿日:2020-05-14T21:45:32+09:00
Dockerで開発環境構築してみる。この前の続き 〜自分用〜
前提条件
・すでにDockerはインストール済み。
・Rubyのバージョンは2.6.3を使用する。
・Railsのバージョンは5.2.4を使用する。
・ディレクトリ名はvb_appとする。DockerHubからRubyのDockerイメージを入手
$ docker pull ruby:2.6.3 Digest: sha256:358f16e92d0f66599103318f7a8528d449b0973fd89e46a1a5c47cec7479f09b Status: Downloaded newer image for ruby:2.6.3 docker.io/library/ruby:2.6.3Gemfileを生成する為にbundle initを実行。
・Gemfile生成
$ docker run --rm -v "$PWD":/usr/src/vb_app -w /usr/src/vb_app ruby:2.6.3 bundle init #オプションについて docker run オプション image名:タグ名 実行コマンド --rm: 実行後のコンテナを削除。指定しない場合はコンテナが残ってしまう。 -v: ホストのディレクトリをコンテナ内のディレクトリにマウント。 "$PWD"はカレントディレクトリのこと。 -w: ワーキングディレクトリを指定。中身を編集
Gemfile source "https://rubygems.org" gem 'rails', '5.2.4'イメージ内にgemを埋め込む為に、Gemfile.lockを生成しておく。
$ touch Gemfile.lockここでさらに編集
Dockerfile
FROM ruby:2.6.3 ENV APP_ROOT /usr/src/vb_app WORKDIR $APP_ROOT RUN apt-get update && \ apt-get install -y nodejs \ postgresql-client \ sqlite3 \ --no-install-recommends && \ rm -rf /var/lib/apt/lists/* COPY Gemfile $APP_ROOT COPY Gemfile.lock $APP_ROOT RUN \ echo 'gem: --no-document' >> ~/.gemrc && \ cp ~/.gemrc /etc/gemrc && \ chmod uog+r /etc/gemrc && \ bundle config --global build.nokogiri --use-system-libraries && \ bundle config --global jobs 4 && \ bundle install && \ rm -rf ~/.gemFROM: 親イメージの指定 ENV: 環境変数の設定 WORKDIR: ワーキングディレクトリの指定 COPY: ファイルをイメージにコピー RUN: コマンド実行$ docker build -t 開発者名/vb_app .docker build .: カレントディレクトリのDockerfileをビルド
-t: 開発者名/vb_app
でイメージ名が作成される
イメージができているか確認は下記で行う。$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE 開発者名/vb_app latest 4f5e7b33d235 58 seconds ago 965MB ruby 2.6.3 8fe6e1f7b421 9 months ago 840MBイメージの作成が完了する。次にrailsの雛形をrails new . で生成。Gemfileがコンフリクト起こすのでYを選択して上書きをする。
$ docker run --rm -it -v "$PWD":/usr/src/vb_app 開発者名/vb_app rails new . -BT exist identical README.rdoc identical Rakefile identical config.ru identical .gitignore conflict Gemfile Overwrite /usr/src/vb_app/Gemfile? (enter "h" for help) [Ynaqdh] Y -it: コンテナのプロセスに対してttyを割り当てる -BT: bundle install 無し、Minitest無しRailsアプリイメージの構築
アプリケーションのイメージを作る。
デフォルトでwebサーバーの起動が行えるようにDockerfileを修正する。Dockerfile FROM ruby:2.6.3 ENV APP_ROOT /usr/src/vb_app WORKDIR $APP_ROOT RUN apt-get update && \ apt-get install -y nodejs \ postgresql-client \ sqlite3 \ --no-install-recommends && \ rm -rf /var/lib/apt/lists/* COPY Gemfile $APP_ROOT COPY Gemfile.lock $APP_ROOT RUN \ echo 'gem: --no-document' >> ~/.gemrc && \ cp ~/.gemrc /etc/gemrc && \ chmod uog+r /etc/gemrc && \ bundle config --global build.nokogiri --use-system-libraries && \ bundle config --global jobs 4 && \ bundle install && \ rm -rf ~/.gem COPY . $APP_ROOT EXPOSE 3000 CMD ["rails", "server", "-b", "0.0.0.0"]ビルドしてイメージを再作成する。
$ docker build -t 開発者名/vb_app .Docker-composeの作成
次にDockerfileを管理するためのDocker-composeを作成していく。
Docker-compose.yml
version: '3' services: app: build: . environment: RAILS_ENV: development ports: - '3000:3000' volumes: - .:/usr/src/vb_appdocker-compose.ymlができたら再ビルド。
$ docker-compose build$ docker-compose up -dコンテナが起動し、さらに起動時にrailsも起動していることがわかる。
- 投稿日:2020-05-14T20:59:37+09:00
Minecraftをひらがな化する
漢字やカタカナが読めない子供でもMinecraftで遊べるようにUIを平仮名化しました。
平仮名勉強中の子供でも文字に興味を持ってくれるかなと思います。
リモートワークでの業務効率化に貢献すること間違いなしです。
対象はMinecraft Java Editionです。概要
Minecraftのリソースパックという仕組みを利用して実現しています。
バニラ範囲の文字が概ね平仮名になります。
Minecraft本体に付属するリソースファイルをひらがなに変換しリソースパックを作成します。
リソースファイルの再配布にあたるかもしれずライセンス的に問題があるかもしれないので、リソースパックを作るツールとして実現しています。
生成されたリソースパックの取り扱いは自己責任でお願いします。環境
ツール実行環境 (
DockerとMinecraftが必要です。)
- Minecraft Java Edition
- Windows Subsystem for Linux(Ubuntu 18.04)
- Docker version 18.09.7, build 2d0083d
- Windows 10 Pro バージョン 2004
- Docker Desktop Community 2.2.0.5
- macOS
- Docker Desktop Community 2.3.0.1
ツールの
Docker Image内の環境
- CentOS 7.7.1908
- mecab 0.996
- mecab-ipadic-NEologd
- python 3.6
- MeCab 0.996.2
- jaconv 0.2
TL;DR
リソースパックを使うとこのようになります。
ツールのソース,Docker Imageは下記リポジトリにUPしています。
(github packagesへのアクセスのためにdocker loginが必要です。 GitHub Packagesで利用するために Docker を設定する - Githubヘルプ)使い方
本ツールの使い方
ツールはDockerより起動します。
(github packagesへのアクセスのためにdocker loginが必要です。 GitHub Packagesで利用するために Docker を設定する - Githubヘルプ)コマンド
Windowsでの実行:
# windowsのユーザー名は [username] としています。 # 使用するときは環境に合わせて置き換えてください。 docker run -v /c/Users/[username]/AppData/Roaming/.minecraft/assets:/assets:ro -v /c/Users/[username]/AppData/Roaming/.minecraft/resourcepacks:/resourcepacks:rw -e "MINECRAFT_VERSION=1.12" docker.pkg.github.com/n-noguchi/mc-hiragana-resourcepack-builder/mc-hiragana-resourcepack-builder:1.0.0Windows Subsystem for Linux (Ubuntu 18.04)での実行:
# windowsのユーザー名は [username] としています。 # 使用するときは環境に合わせて置き換えてください。 docker run -v /mnt/c/Users/[username]/AppData/Roaming/.minecraft/assets:/assets:ro \ -v /mnt/c/Users/[username]/AppData/Roaming/.minecraft/resourcepacks:/resourcepacks:rw \ -e "MINECRAFT_VERSION=1.12" docker.pkg.github.com/n-noguchi/mc-hiragana-resourcepack-builder/mc-hiragana-resourcepack-builder:1.0.0macOSでの実行:
# macOSのユーザー名は [username] としています。 # 使用するときは環境に合わせて置き換えてください。 docker run -v "/Users/[username]/Library/Application Support/minecraft/assets:/assets:ro" \ -v "/Users/[username]/Library/Application Support/minecraft/resourcepacks:/resourcepacks:rw" \ -e "MINECRAFT_VERSION=1.12" docker.pkg.github.com/n-noguchi/mc-hiragana-resourcepack-builder/mc-hiragana-resourcepack-builder:1.0.0引数
タイプ 名前 説明 環境変数 MINECRAFT_VERSIONMinecraft Java Editionのバージョンを指定します。
一度起動し、ダウンロードされている必要があります。
指定可能なバージョンは1.12,1.13,1.14,1.15,1.16の何れかです。ボリューム /assetsMinecraft Java Editionのassetsフォルダをマウントします。ボリューム /resourcepacksMinecraft Java Editionのresourcepacksフォルダをマウントします。
出力
正常に完了すると、
resourcepacksフォルダにリソースパックが出力されます。リソースパックの使い方
Minecraft Java Editionのresourcepacksフォルダにリソースパックを配置して、Minecraftを起動します。
その後、Minecraft内からリソースパックを指定します。
リソースパックのフォルダはデフォルトでは以下です。
resourcepacksフォルダ
OS Path Windows c:/Users/[username]/AppData/Roaming/.minecraft/resourcepacks macOS /Users/[username]/Library/Application Support/minecraft/resourcepacks
resourcepacksのフォルダに出来上がったリソースパックを配置します。
かんりょうを押します。既に平仮名で表示されています。(hi_jpという言語を追加しています。)
細かい話
どうやって実現できるか?
UIの文字列を差し替える方法には、リソースパックを使う方法があります。
日本語のリソースはMinecraftに同梱されているはず。
なのでそれをひらがなに翻訳し、リソースパック化すればよいと考えました。Minecraftのリソースパックはどうやって作るのか?
まずは、作りたいリソースパックについて確認です。
リソースパックの作り方は、Minecraft公式のwikiに書いてある通りです。
下記をzipファイルにまとめたものです。リソースパックに含むもの
- pack.mcmeta: リソースパックについてのメタ情報を格納するJSONファイル
- pack.png: リソースパックのアイコン。省略可能
- 各種リソースファイル: pack.mcmetaに記載したリソースのファイル
参考 Tutorials/Creating a resource pack - Official Minecraft Wiki
pack.mcmetaに記載するリソースパックのフォーマットpack_formatは、Minecraftのバージョンと対応しており、古い場合は警告が出ます。
pack_formatとMinecraft Versionの対応
pack_format Minecraft Version 1 Java Edition 1.6 - Java Edition 1.8 2 Java Edition 1.9 and Java Edition 1.10 3 Java Edition 1.11 and Java Edition 1.12 4 Java Edition 1.13 and Java Edition 1.14 5 Java Edition 1.15 and Java Edition 1.16 Minecraftに同梱されているリソースはどこにあるのか?
Minecraft Java Editionでは、デフォルトでは以下のフォルダにリソースが格納されます。
OS Path macOS /Users/[macのユーザー名]/Library/Application Support/minecraft/assetsWindows C:\Users\[Windowsのユーザー名]\AppData\Roaming\.minecraft\assetsassetsフォルダ配下は以下のような構成です。
複数バージョンをインストールしている場合、indexes配下のファイルは別となりますが、objects配下のデータは混在して管理されています。
gitのような効率的な管理です。assets配下のフォルダ構成
assets/
- indexes/
- [Minecraftのバージョン].json リソース名と、ハッシュコード、サイズで構成されるJSONファイル
{ "objects": { "icons/icon_16x16.png": { "hash": "bdf48ef6b5d0d23bbb02e17d04865216179f510a", "size": 3665 }, "icons/icon_32x32.png": { "hash": "92750c5f93c312ba9ab413d546f32190c56d6f1f", "size": 5362 }, ~略~ "minecraft/lang/ja_jp.json": { "hash": "2a0ae8e6a984ab749fce1d6218f165f2b5d31c60", "size": 445279 }, ~略~ } }参考 : Tutorials/Sound directory - Official Minecraft Wiki
Minecraftの言語リソースファイルはどのような形式になっているのか。
リソースのフォーマットはタイプごとに異なります。
言語ファイルは以下のような形式になります。1.12と1.13以降で形式が異なり、結構はまりました。
Minecraftバージョン 言語リソース名(indexes/[バージョン].json記載) 言語リソースのフォーマット 1.12 minecraft/lang/ja_jp.lang リソースのキー=リソースの文字列 1.13以降 minecraft/lang/ja_jp.json リソースのキーとその文字列のJSON Minecraft Java Edition 1.12のリソース
assets/indexes/1.12.json"minecraft/lang/ja_jp.lang": {"hash": "8eedb38dbb5220be3d5aafc2135beb105548f5e1", "size": 192067},assets/objects/8e/8eedb38dbb5220be3d5aafc2135beb105548f5e1addServer.add=完了 addServer.enterIp=サーバーアドレス addServer.enterName=サーバー名 addServer.hideAddress=アドレスを隠すMinecraft Java Edition 1.15のリソース
assets/indexes/1.15.json"minecraft/lang/ja_jp.json": {"hash": "2a0ae8e6a984ab749fce1d6218f165f2b5d31c60", "size": 445279},assets/objects/2a/2a0ae8e6a984ab749fce1d6218f165f2b5d31c60{ "addServer.add": "\u5b8c\u4e86", "addServer.enterIp": "\u30b5\u30fc\u30d0\u30fc\u30a2\u30c9\u30ec\u30b9", "addServer.enterName": "\u30b5\u30fc\u30d0\u30fc\u540d", "addServer.hideAddress": "\u30a2\u30c9\u30ec\u30b9\u3092\u96a0\u3059",日本語リソース(漢字かな交じりの文字)を平仮名に変換する
リソースパックの作り方、Minecraftのリソースがどう格納されているのかはわかりました。
次はこれを平仮名に変換する方法を検討します。単純な文字の置き換えでは音読み訓読みや、文脈による読み方の違いに対応できません。
意味を汲み取って読みを取得したいのでmecabを利用します。
また、正しい読みを取得するために辞書は充実していたほうがよいのでmecab-ipadic-NEologdを利用します。mecab-ipadic-NEologd環境の作り方
mecab+meacb-ipadic-NEologd環境の作り方はほぼ
mecab-ipadic-NEologdのREADME通りです。README:Neologism dictionary based on the language resources on the Web for mecab-ipadic - github.com
今回はツールの配布を簡単にするようDockerで実装します。
READMEの手順だと一部対話型の部分があります。以下のように-yをつけると強制yesでインストールできます。RUN cd /mecab/mecab-ipadic-neologd && \ ./bin/install-mecab-ipadic-neologd -y -n && \ echo `mecab-config --dicdir`"/mecab-ipadic-neologd"参考:install-mecab-ipadic-neologd
'-y'|'--forceyes' ) IS_FORCE_YES=1 shift 1 ;;最終的にこのようなDockerfileになりました。
mecabで読みを取得する
-Oyomiを指定することで読みを取得できます。MeCab: Yet Another Part-of-Speech and Morphological Analyzer #出力フォーマットの変更
mecab-ipadic-NEologdのサンプルで読みを取得してみます。
ほぼ期待した結果です。
あとはカタカナから平仮名への単純な置き換えだけです。$ NEOLOGD=`mecab-config --dicdir`"/mecab-ipadic-neologd" $ echo "8月3日に放送された「中居正広の金曜日の スマイルたちへ」(TBS系)で、1日たった5分でぽっこりおなかを解消するというダイエット方法を紹介。キンタロー。のダイエットにも密着。" | mecab -d $NEOLOGD 8月3日 名詞,固有名詞,一般,*,*,*,8月3日,ハチガツミッカ,ハチガツミッカ に 助詞,格助詞,一般,*,*,*,に,ニ,ニ 放送 名詞,サ変接続,*,*,*,*,放送,ホウソウ,ホーソー さ 動詞,自立,*,*,サ変・スル,未然レル接続,する,サ,サ れ 動詞,接尾,*,*,一段,連用形,れる,レ,レ た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ 「 記号,括弧開,*,*,*,*,「,「,「 中居正広の金曜日のスマイルたちへ 名詞,固有名詞,一般,*,*,*,中居正広の金曜日のスマイルたちへ,ナカイマサヒロノキンヨウビノスマイルタチヘ,ナカイマサヒロノキンヨービノスマイル タチヘ 」( 記号,一般,*,*,*,*,* TBS 名詞,固有名詞,一般,*,*,*,TBS,ティービーエス,ティービーエス 系 名詞,接尾,一般,*,*,*,系,ケイ,ケイ ) 記号,一般,*,*,*,*,* で 助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ 、 記号,読点,*,*,*,*,、,、,、 1日 名詞,固有名詞,一般,*,*,*,1日,ツイタチ,ツイタチ たった 副詞,助詞類接続,*,*,*,*,たった,タッタ,タッタ 5分 名詞,固有名詞,一般,*,*,*,5分,ゴフン,ゴフン で 助詞,格助詞,一般,*,*,*,で,デ,デ ぽっこりおなか 名詞,固有名詞,一般,*,*,*,ぽっこりおなか,ポッコリオナカ,ポッコリオナカ を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 解消 名詞,サ変接続,*,*,*,*,解消,カイショウ,カイショー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル という 助詞,格助詞,連語,*,*,*,という,トイウ,トユウ ダイエット方法 名詞,固有名詞,一般,*,*,*,ダイエット方法,ダイエットホウホウ,ダイエットホウホー を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ 紹介 名詞,サ変接続,*,*,*,*,紹介,ショウカイ,ショーカイ 。 記号,句点,*,*,*,*,。,。,。 キンタロー。 名詞,固有名詞,一般,*,*,*,キンタロー。,キンタロー,キンタロー の 助詞,連体化,*,*,*,*,の,ノ,ノ ダイエット 名詞,サ変接続,*,*,*,*,ダイエット,ダイエット,ダイエット に 助詞,格助詞,一般,*,*,*,に,ニ,ニ も 助詞,係助詞,*,*,*,*,も,モ,モ 密着 名詞,サ変接続,*,*,*,*,密着,ミッチャク,ミッチャク 。 記号,句点,*,*,*,*,。,。,。 EOS $ echo "8月3日に放送された「中居正広の金曜日の スマイルたちへ」(TBS系)で、1日たった5分でぽっこりおなかを解消するというダイエット方法を紹介。キンタロー。のダイエットにも密着。" | mecab -d $NEOLOGD -Oyomi ハチガツミッカニホウソウサレタ「ナカイマサヒロノキンヨウビノスマイルタチヘ」(ティービーエスケイ)デ、ツイタチタッタゴフンデポッコリオナカヲカイショウスルトイウダイエットホウホウヲショウカイ。キンタローノダイエットニモミッチャク。 $リソースを日本語から平仮名へ変換する
楽なPythonで実現することにしました。
pythonからmecab呼び出し
pythonの
mecabパッケージを利用します。URL:mecab PyPI
読みを取得するモード、かつneologdの辞書を利用するので以下のようにオプションを指定します。
辞書のパスは引数から取得します。mecab_yomi = MeCab.Tagger("-Oyomi -d {0}".format(sys.argv[1]))カタカナから平仮名への変換
MeCabの読みはカタカナなので平仮名に変換する必要があります。
pythonのjaconvパッケージを使います。URL:jaconv PyPI
リソース内の特殊な文字のあつかい
日本語→カタカナ→平仮名の変換をすると、おかしな文字になるものがありました。
これらを含むリソースは変換対象外としています。うまく変換できたもの
パンチして木材を回収します -> ぱんちしてもくざいをかいしゅうします 木を探しましょう -> きをさがしましょう マウスを使って視点移動します -> まうすをつかってしてんいどうします 周りを見渡しましょう -> まわりをみわたしましょう インベントリを開きましょう -> いんべんとりをひらきましょう 木を倒しましょう -> きをたおしましょううまく変換できない:プレースホルダー
%を持つも文字列%s でジャンプします -> ぱーせんとs でじゃんぷします %s、%s、%s、%s で移動します -> ぱーせんとs、ぱーせんとs、ぱーせんとs、ぱーせんとs でいどうします %s を押します -> ぱーせんとs をおします %s を長押しします -> ぱーせんとs をなげししします最終的に以下のようなスクリプトになりました。
最後に
たまにおかしい翻訳がありますが、満足のいくものできました。
子供に村人ゾンビの卵どれ?とか聞かれることもなくなり、自然と平仮名の勉強もできています。
これでリモートワークの集中力も高くなり一石二鳥です。
- 投稿日:2020-05-14T18:46:17+09:00
DockerでPython 3.8用のpsutilをインストールしてみた
動機
ことの始まりはとある先輩からのオーダー。。。
「最新のpyhon3系で動かしているlambdaのメモリ容量取得するようなコードかいてよ。」よっしわかったよ。
クソ野郎やってやろうじゃないかと意気込んでLambdaの最新のpython3系のランタイムをみたら、、、
python3.8.....になってた。えっ、、、いつのまに3.8に。。。。ということでpyrhon3.8かつamazonlinux2(Lambdaの実行環境がamazonlinuxとのことなので)で
インストールした外部ライブラリが必要になった。。。Dockerファイル
さくっとPython外部ライブラリを準備したかったのでDocker使いました。
Docker for Macです。python3.8をインストールするために作成したDockerファイルは下記の通り
FROM amazonlinux:2 RUN yum -y update RUN yum -y install gcc openssl-devel bzip2-devel libffi-devel RUN yum -y install wget RUN yum -y install tar RUN yum -y install gzip RUN yum -y install make RUN wget https://www.python.org/ftp/python/3.8.1/Python-3.8.1.tgz RUN tar xzf Python-3.8.1.tgz RUN cd Python-3.8.1 RUN ./Python-3.8.1/configure --enable-optimizations RUN make altinstall RUN python3.8 --version RUN mkdir /home/deploy※もっとこう書けるよってのがあったら教えて下さい!
docker-compose.yml
さっきのDockerfileでpython3.8系はインストールできたので、外部ライブラリをpipでおとすためのdocker-compose.ymlは下記の通り
docker-compose.ymlversion: '2' services: app: build: . volumes: - './deploy:/home/deploy' command: pip3.8 install -r /home/deploy/requirements.txt -t /home/deploy/distrequirements.txtにはpsutilを書いてます。
※ちなみにディレクトリ構成はこんな感じ
. ├── docker-compose.yml ├── deploy │ ├── requirements.txt │ └── dist └── Dockerfile結論
こうやって落とした外部ライブラリとpythonのソースをzipで固めて、Lambdaにアップロードしたら正常にうごきました!
(外部ライブラリを使うときはランタイムと実行元のOSを使っておとした物を使わないといけないのが手間オブ手間s・・・)以上!
- 投稿日:2020-05-14T18:30:23+09:00
[Docker] [drone] Drone基本安裝
目的
這是一次安裝經驗紀錄,當我們需要自己架設
CICD環境時,我們挑選了Drone作為本次的安裝的對象但因為他登入採用版本控款的第三方登入所以也需要搭配一個版本控管環境,我們就以Gitlab為例
預先準備環境:Docker
安裝Drone
1.設定Gitlab Application
callbackurl 依照你得drone版本不同可能要更改 新版的是用/login, 舊版本可能要用/authorize
2 . 安裝Drone
docker run \ --volume=/var/lib/drone:/data \ --env=DRONE_GITLAB_SERVER=http://192.168.10.2:8888 \ # 這個是你對應Gitlab的網址,我是架設在內網,依照你的版本控管位置設定 --env=DRONE_GITLAB_CLIENT_ID=fdfdfvbfbfgfdgfdgfdbvdfbfdgfdgdfgfdgfd\ # 這個在Gitlab UserSettings/Application 中產生 --env=DRONE_GITLAB_CLIENT_SECRET=dfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdffd\ # 這個在Gitlab UserSettings/Application 中產生 --env=DRONE_RPC_SECRET=http \ --env=DRONE_SERVER_HOST=192.168.10.2:9999 \ #drone 安裝位置的url --env=DRONE_SERVER_PROTO=http \ #依照drone使用http還是https --publish=9999:80 \ #9999(外部監聽Port):80(Docker 內部對應Port) --publish=9998:443 \ #9998(外部監聽Port):443(Docker 內部對應Port) --restart=always \ --detach=true \ --name=drone \ drone/drone:13.登入drone
這樣就完成了,之後有空再補上drone 使用方式
- 投稿日:2020-05-14T17:24:53+09:00
Zabbix 5.0 を Docker Compose で起動する手順
これは何?
Zabbix はオープンソースで自由に使える監視ツールです。 Zabbix 公式 Docker イメージ を使い、Docker Compose で MySQL 等のデータベースを一括セットアップする手順をまとめました。
慣れれば Zabbix 5.0 の環境を 5 分程度でセットアップできるでしょう。
公式に Docker Compose 用 YAML ファイルが配布されているため、そちらを利用します。
背景は、Zabbix 5.0 を簡単に試す環境を作りたかったからです。Zabbix 4.0 までは zabbix/zabbix-appliance という環境が1つにまとまった Docker イメージが公式から配布されていました。Zabbix 5.0 は、現時点では RHEL 対応のものしか公開されていないため、Docker Compose を使う手順で検証をしました。
手順
Docker と Docker Compose をセットアップ
(既に設定済みの環境では次へ)
参考:CentOS 7.x の場合
curl -fsSL https://get.docker.com -o get-docker.sh sh ./get-docker.sh systemctl enable dockern systemctl start docker yum -y install docker-composeGitHub のリポジトリを clone して移動
git clone https://github.com/zabbix/zabbix-docker.git cd zabbix-docker設定ファイルの準備
今回は CentOS + Nginx + MySQL の組み合わせの Docker Compose ファイル を使用します。同ファイルには
latestとlocalがありますが、ここでは前者(latest)の手順です。後者(local)はイメージをローカルでビルドします。 なお、他にも Alpine や Ubuntu をベースイメージのものや、バックエンドが PostgreSQL も配布されています。cp docker-compose_v3_centos_mysql_latest.yaml docker-compose.yaml以後、YAML 設定ファイルを明示しない場合は
docker-compose.yamlを指します。YAML ファイル中、MySQL のユーザやパスワードの設定ファイルは
.MYSQL_USER、.MYSQL_PASSWORD、.MYSQL_ROOT_PASSWORDです。必要に応じて各ファイルを編集します。Docker イメージのダウンロード
docker-compose pullイメージ一覧の確認は、
dokcer images:$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql 8.0 a0d4d95e478f 4 hours ago 541MB busybox latest 78096d0a5478 11 hours ago 1.22MB zabbix/zabbix-web-apache-mysql centos-5.0-latest 5c3418ac3645 31 hours ago 505MB zabbix/zabbix-agent centos-5.0-latest 6bd73926b75f 31 hours ago 256MB zabbix/zabbix-proxy-sqlite3 centos-5.0-latest 4a01689b6f57 32 hours ago 267MB zabbix/zabbix-server-mysql centos-5.0-latest 465a30a32216 41 hours ago 360MB zabbix/zabbix-web-nginx-mysql centos-5.0-latest f3a0f8c7659f 46 hours ago 487MB zabbix/zabbix-java-gateway centos-5.0-latest 1c3c611d4bb8 46 hours ago 395MB zabbix/zabbix-proxy-mysql centos-5.0-latest 91fd7fd05aec 46 hours ago 358MB zabbix/zabbix-snmptraps centos-5.0-latest 06c106b449cc 46 hours ago 283MB起動
YAML ファイルが存在するディレクトリ上で、デタッチドモード(
-dオプション)を付けて起動します。docker-compose up -d状態の確認:
# docker-compose ps WARNING: Some services (zabbix-agent, zabbix-java-gateway, zabbix-proxy-mysql, zabbix-proxy-sqlite3, zabbix-server, zabbix-snmptraps, zabbix-web-apache-mysql, zabbix-web-nginx-mysql) use the 'deploy' key, which will be ignored. Compose does not support 'deploy' configuration - use `docker stack deploy` to deploy to a swarm. Name Command State Ports ---------------------------------------------------------------------------------------------------- zabbixdocker_db_data_mysql_1 sh Exit 0 zabbixdocker_mysql-server_1 docker-entrypoint.sh mysql Up ... zabbixdocker_zabbix-agent_1 /sbin/tini -- /usr/bin/doc Up ... zabbixdocker_zabbix-java- docker-entrypoint.sh /usr/ Up gateway_1 ... zabbixdocker_zabbix-proxy- /sbin/tini -- /usr/bin/doc Up 0.0.0.0:10071->10051/tcp mysql_1 ... zabbixdocker_zabbix-proxy- /sbin/tini -- /usr/bin/doc Up 0.0.0.0:10061->10051/tcp sqlite3_1 ... zabbixdocker_zabbix-server_1 /sbin/tini -- /usr/bin/doc Up 0.0.0.0:10051->10051/tcp ... zabbixdocker_zabbix- /usr/bin/supervisord -c /e Up 0.0.0.0:162->1162/udp snmptraps_1 ... zabbixdocker_zabbix-web- docker-entrypoint.sh Up 0.0.0.0:80->8080/tcp, apache-mysql_1 0.0.0.0:443->8443/tcp zabbixdocker_zabbix-web- docker-entrypoint.sh Up 0.0.0.0:8081->8080/tcp, nginx-mysql_1 0.0.0.0:8443->8443/tcp※
zabbixdocker_db_data_mysql_1がExit 0の状態ですが、これは正常です。その他はUpです。処理状況を見るには
docker-compose logs -fです。次のような Zabbix Server が起動するログが出るまで待ちます。zabbix-server_1 | Starting Zabbix Server. Zabbix 5.0.0 (revision 9665d62). zabbix-server_1 | Press Ctrl+C to exit. zabbix-server_1 | zabbix-server_1 | 6:20200514:164942.480 Starting Zabbix Server. Zabbix 5.0.0 (revision 9665d62). zabbix-server_1 | 6:20200514:164942.480 ****** Enabled features ****** zabbix-server_1 | 6:20200514:164942.480 SNMP monitoring: YES zabbix-server_1 | 6:20200514:164942.480 IPMI monitoring: YES zabbix-server_1 | 6:20200514:164942.480 Web monitoring: YES zabbix-server_1 | 6:20200514:164942.480 VMware monitoring: YES zabbix-server_1 | 6:20200514:164942.480 SMTP authentication: YES zabbix-server_1 | 6:20200514:164942.480 ODBC: YES zabbix-server_1 | 6:20200514:164942.480 SSH support: YES zabbix-server_1 | 6:20200514:164942.480 IPv6 support: YES zabbix-server_1 | 6:20200514:164942.480 TLS support: YES zabbix-server_1 | 6:20200514:164942.480 ****************************** zabbix-server_1 | 6:20200514:164942.480 using configuration file: /etc/zabbix/zabbix_server.conf zabbix-server_1 | 6:20200514:164942.493 current database version (mandatory/optional): 05000000/05000000 zabbix-server_1 | 6:20200514:164942.493 required mandatory version: 05000000 zabbix-server_1 | 6:20200514:164942.555 server #0 started [main process] zabbix-server_1 | 200:20200514:164942.556 server #1 started [configuration syncer #1]管理画面に接続
ウェブブラウザで
http://<IPアドレスまたはホスト名>を開きます。デフォルトのユーザ情報 は、Username が
Admin、 Password がzabbixです。入力後、Sign inをクリックします。ログイン後、パスワードを変更します。
画面左下の
User Settingsをクリック →Change passwordをクリック →PasswordとPassword (once again)に入力後、Updateをクリックします。あわせて言語を日本語に変更したい場合は、Language English (en_GB)をJapanese (ja_JP)に変更しておきます(ただし、デフォルトでは画像中の日本語が文字化けします)。Zabbix Server の
利用不可を解消するログイン直後から、Zabbix Server が「利用不可」の障害となっています。デフォルトのままでは、Zabbix Server の状態を Zabbix agent経由で取得できません(理由は、デフォルトで Zabbix Server が
127.0.0.1のエージェントに対し接続する設定だからです)。これを回避するには、以下の手順で設定を変更します。監視先を
127.0.0.1からzabbix-agentに変更します(Docker の bridge ネットワーク内では、サービス名で名前解決できるため、zabbix-agentのサービス名を指定すると、自動的に zabbix-agent コンテナの IP アドレスに名前解決します)。左メニューの「設定」→「ホスト」をクリックし、「Zabbix server」の名前をクリックします。
それから「インターフェース」の「IPアドレス」が 「127.0.0.1」になっていますが、これを消します。そして、 「DNS名」にzabbix-agentを入力し、接続方法のDNSをクリックし 、更新をクリックします。動作確認は左メニューの「監視データ」→「最新データ」をクリックします。Zabbix server から、各アイテムの値が取れています。グラフをクリックすると、リアルタイムに値が変わるのを確認できるでしょう。
そのあと、ダッシュボードに戻ると「障害」になっていますが、3分後に解消されます(デフォルトでは3分間)。
あとは色々触ってみましょう。リソース一覧グラフを見るには、「監視データ」→「ホスト」→「Zabbix server」をクリック→「グラフ」を選択が手っ取り早いです。
Enjoy!
参考
- Zabbix 公式ドキュメント
- 投稿日:2020-05-14T16:30:12+09:00
Kubernetes基礎:VM vs Container
VM vs Container
1. VMとContainer仮想化ソリューションの種類
Containerを仮想化させてくれるソリューションの中ではDockerを最も多く使用している。2. Container仮想化
DockerがContainerを作ってくれる。
Linux6、7のようにバージョンによって、デフォルトでインストールされるライブラリが違う。
Linux6で開発完了したシステムをLinux7で起動をさせると、バージョンの違い等による問題が発生するだろう。
Linux6にDockerをインストールしてA Serviceのイメージを作ることができる。
イメージには、A Serviceとそのサービスが実行されるために必要なライブラリが一緒に入っている。
Linux7のバージョンに、DockerがインストールされていればLinux6環境のA ServiceのイメージからContainerの作成ができ、A Serviceの実行ができる。
A Serviceは自分の環境の中にあるOpenStack Library等を使うため、Linux7の環境でもシステムを実行することができる。3. Container資源隔離技術
Dockerは、複数のContainer間でホストのリソースを分離して使えるようにしてくれる。
Linux技術の「cgroup」と「namespace」を使うことで可能になった。
・namespace:カーネルに関連した領域を分離をしてくれる。
・cgroup:リソースの領域を分離をしてくれる。DockerのようなContainer仮想化ソリューションは、OSが提供するリソースの分離技術を利用してContainerという単位でサービスを分離できるようにしてくれる。
これを使うとContainer仮想化ソリューションがインストールされているOSでは、開発環境を気にせずにDeployが可能になる。3. メリット&デメリット
処理速度
Containerのメリットはシステム構造的に、単一のOSを共有する概念であり、VMはそれぞれのOSを立ち上げるため、
Containerのほうが速い。
デメリットは、VMはWindowsを使っていてもGuest OSにLinuxをインストールして使うことができる。
Containerは、Linuxの上にWindowを使うことができない。
Security
SecurityのほうもVMは1つのGuest OSに問題が発生しても、他のGuest OSやHost OSとは完全に分離されているので、
影響はないが、Containerは、1つのContainerに問題が発生してOSの領域に不正アクセスされてしまうと、
他のContainerにも影響が及ぶ。
- 投稿日:2020-05-14T16:30:12+09:00
Kubernetes基礎(2):VM vs Container
VM vs Container
1. VMとContainer仮想化ソリューションの種類
Containerを仮想化させてくれるソリューションの中ではDockerを最も多く使用している。2. Container仮想化
DockerがContainerを作ってくれる。
Linux6、7のようにバージョンによって、デフォルトでインストールされるライブラリが違う。
Linux6で開発完了したシステムをLinux7で起動をさせると、バージョンの違い等による問題が発生するだろう。
Linux6にDockerをインストールしてA Serviceのイメージを作ることができる。
イメージには、A Serviceとそのサービスが実行されるために必要なライブラリが一緒に入っている。
Linux7のバージョンに、DockerがインストールされていればLinux6環境のA ServiceのイメージからContainerの作成ができ、A Serviceの実行ができる。
A Serviceは自分の環境の中にあるOpenStack Library等を使うため、Linux7の環境でもシステムを実行することができる。3. Container資源隔離技術
Dockerは、複数のContainer間でホストのリソースを分離して使えるようにしてくれる。
Linux技術の「cgroup」と「namespace」を使うことで可能になった。
・namespace:カーネルに関連した領域を分離をしてくれる。
・cgroup:リソースの領域を分離をしてくれる。DockerのようなContainer仮想化ソリューションは、OSが提供するリソースの分離技術を利用してContainerという単位でサービスを分離できるようにしてくれる。
これを使うとContainer仮想化ソリューションがインストールされているOSでは、開発環境を気にせずにDeployが可能になる。3. メリット&デメリット
処理速度
Containerのメリットはシステム構造的に、単一のOSを共有する概念であり、VMはそれぞれのOSを立ち上げるため、
Containerのほうが速い。
デメリットは、VMはWindowsを使っていてもGuest OSにLinuxをインストールして使うことができる。
Containerは、Linuxの上にWindowを使うことができない。
Security
SecurityのほうもVMは1つのGuest OSに問題が発生しても、他のGuest OSやHost OSとは完全に分離されているので、
影響はないが、Containerは、1つのContainerに問題が発生してOSの領域に不正アクセスされてしまうと、
他のContainerにも影響が及ぶ。
- 投稿日:2020-05-14T12:51:13+09:00
Golang の modules 管理 [Docker, go mod]
はじめに
バックエンドは Ruby, TypeScript 等を触ってきて、「Go やるか!」と思って手を出してみたものの、みごとにハマりました。(悪い意味で)
他言語から来た人がGoを使い始めてすぐハマったこととその答え
こちらの記事を読ませていただいて、そこでやっと色々と解決できました…ここには、上記の記事を読むだけでは解決できなかった課題に立ち向かった記録を残しておきます。
使用環境
- macOS Catalina 10.15.4
Docker で環境構築
Docker コンテナ内で動かしたいので、golang の公式イメージを使って環境を作ります。
テキストエディタの補完だったりに必要そうであればローカルにもインストールしておきます。Go には「
GOPATH以下に作業環境を作る」という特徴があるようで、ここが第一つまづきポイントでした。
Docker で作業する場合でも、これに従った構成にします。docker-compose
version: "3.8" services: go: image: golang:1.13.10 working_dir: /go/src/github.com/{ユーザー名}/{リポジトリ名} volumes: - .:/go/src/github.com/{ユーザー名}/{リポジトリ名}GOPATH
$ docker-compose run go /bin/bash -c "go env" ... GOPATH="/go"ディレクトリ構成
/go └── src └── github.com └── {ユーザー名} └── {リポジトリ名} ├── docker-compose.yml └── main.goモジュール管理
プロジェクト内に使用するモジュールの一覧を保持して、git で管理して、というようなことをやりたかったのですが、手順がよくわからずまた少し詰まっていました。
以降の操作はすべて、dockerコンテナ 内での実行を前提としています。
go1.13 未満
go のバージョンが 1.13 未満の場合、後述する
go mod init等のコマンドをそのまま実行しようとすると、下記のエラーが出て実行できません。go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'環境変数を設定してから実行することで正常に実行できます。
$ export GO111MODULE=ongo.mod の作成
プロジェクトで
go mod系のコマンドを初めて実行する場合、まずinitで初期化します。$ go mod initすると、
go.modのファイルが作成されます。vendor でモジュール管理
$ go mod vendorこのコマンドで、必要なモジュールを
vendorディレクトリに保持します。
未ダウンロードのモジュールがあった場合は、モジュールのダウンロードプロセスが先に走ります。
vendorフォルダとgo.sumファイルが作成されれば成功しているはず。
これで各種モジュールが使えるようになります。vendor を作成したくない場合は
go mod download等のコマンドだけ使えば良さそうです。
go mod downloadのあとにgo mod vendorすると、download で引っ張ってきたモジュールが既にローカルにあるので、ダウンロード処理は走らず、ささっと vendor のみが作成されます。他言語に置き換えると?
使用モジュールの管理 依存性管理 本体 Go go.mod go.sum vendor Node.js package.json package-lock.json node_modules Ruby Gemfile Gemfile.loc vendor/bundle こんな感じの関係性になるのかなと思っています。
ディレクトリ構成
/go └── src └── github.com └── {ユーザー名} └── {リポジトリ名} ├── docker-compose.yml ├── go.mod ├── go.sum ├── main.go └── vendor ├── 各種モジュール └── modules.txtさいごに
なにぶん初学者ゆえ、『ちげぇよコノヤロー!』な箇所があればやさしくご指摘お願いしたいですm(_ _)m
- 投稿日:2020-05-14T11:55:17+09:00
docker内のアプリにjmxremoteする
絶対に忘れそうなので、備忘録を兼ねて。
spring-boot + docker-compose で試しました。docker内で動くアプリには下記の設定をしておく
-Djava.rmi.server.hostname=0.0.0.0 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=10080 -Dcom.sun.management.jmxremote.rmi.port=10080 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false10080 port で jmxremote したいので、 docker は -p 10080:10080 とかして起動しておきましょう。
手元のマシンからアプリが動いてるサーバにsocks proxyを張る
ssh -fN -D 7777 接続したいサーバjconsoleでつなぐ
jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 service:jmx:rmi:///jndi/rmi://localhost:10080/jmxrmi -J-DsocksNonProxyHosts=終わり。
【参照】
https://stackoverflow.com/questions/15093376/jconsole-over-ssh-local-port-forwarding
https://shinpei.github.io/blog/2015/03/28/use-jmx-over-ssh
- 投稿日:2020-05-14T11:02:00+09:00
Kubernetes基礎(1):Why Kubernetes
Kubernetes Introduction
1. Kubernetes関心度
最近5年間の傾向をみるとKubernetesの関心度が高まっていることがわかります。
2. Kubernetes History
企業がKubernetesに注目している理由は、システムリソースを効率的に使う(=コスト削減)ことができるからです。
Kubernetesをもっとよく理解するには、仮想化技術の歴史を把握する必要があります。
Linux(1991年):resource compartment(資源隔離)
Linuxのリソースを隔離して、プロセスが独立した環境で実行可能にする技術はありましたが、使うのにはハドルが高かったのです。
VM(2010年):仮想化技術
複数の企業が仮想化技術を利用して、独自の運用環境の自動化には成功したが、システム性能は良くなりませんでした。
最も大きな原因は仮想化をするために、重いOS(Guest)を起動することが原因でした。
Container(2014年~2015年):Container仮想化技術
dotCloudという会社がLinuxの資源隔離技術をContainerという概念で簡単に使用できるようにしました。
会社名をDockerに変えて、この技術をOpen sourceとして公開しました。
Container仮想化技術は、サービス間でリソースを分離するが、別途OSを稼働する必要がないため、高速で
資源活用効率も非常によい技術です。
Dockerは、単一のサービスをContainerに仮想化させて配置をするもので、多数のサービスを運営する際に、
それをいちいち配布して運営するものではない。
多数のサービスを管理してくれるContainer Orchestrationというものがあります。
複数Containerを管理してくれるソリューションです。
Kubernetes
DockerのContainer技術がオープンソースであるため、多くの企業が各自のContainer Orchestratorを
発表することになりました。
KubernetesはGoogleで主導したが、そのプロジェクトに複数の企業が参加して多様なKnow-Howが
詰め込められていることで、多くの企業はKubernetesを使った後の満足度が非常に高かったのです。
Kubernetesへの関心は、他のContainer Orchestratorに比べ飛躍的に増加することになりました。ITにおける標準という概念はある機関に認められて獲得するものではなく、最も使われているものが標準だと思います。
現在Kubernetesがサービスの展開の標準になりつつあり、この技術を基に、多くのクラウドサービスを提供する企業はKubernetes環境がインストールされているInfrastructureをサービスしています。Why Kubernetes
As-is
A、B、Cそれぞれのサービスを提供するためには9つのサーバーが必要になります。
さらにサーバー障害等のことを考えると、BackUpとしても3つのサーバーが必要になります。
To-be
A、B、Cの平均リソースを計算すると1日4つのサーバーと障害対応1つのサーバーが必要になります。
・Auto Scaling:trafficの状況によって自動にサービスにリソースを割り当ててくれる。
・Auto Healing:障害を起こしたサーバー上のサービスを自動に他のサーバーに移行してくれる。Kubernetesは運用の自動化をサポートしています。
Kubernetesを使うと運用環境のメインテナンスが簡単にできるので、サービスの効率がよくなります。
サービスの効率向上のため、サーバーが少なくなるとメインテナンス費用の削減になり、大規模の運用環境こそ効果が多くなるので多くの企業がKubernetes環境への移行に興味を持ち始めています。
- 投稿日:2020-05-14T11:02:00+09:00
Kubernetes基礎:Why Kubernetes
Kubernetes Introduction
1. Kubernetes関心度
最近5年間の傾向をみるとKubernetesの関心度が高まっていることがわかる。
2. Kubernetes History
企業がKubernetesに注目している理由は、システムリソースを効率的に使う(=コスト削減)ことができるからだ。Kubernetesをもっとよく理解するには、仮想化技術者の歴史を知る必要がある。
Linux(1991年):resource compartment(資源隔離)
Linuxのリソースを隔離して、プロセスが独立した環境で実行可能にする技術はあったのが、使うのにはハドルが高かった。
VM(2010年):仮想化技術
複数の企業が仮想化技術を利用して、自分の運用環境を自動化はできたが、システム性能は良くなかった。
最も大きな原因は仮想化をするために、重いOS(Guest)を起動することが原因だった。
Container(2014年~2015年):Container仮想化技術
dotCloudという会社がLinuxの資源隔離技術をContainerという概念で簡単に使用できるようにした。
会社名をDockerに変えて、この技術をOpen sourceとして公開していた。
Container仮想化技術は、サービス間でリソースを分離をするが、別途OSを稼働する必要がないため高速で
資源活用効率も非常によい。Dockerは、単一のサービスをContainerに仮想化させて配置をするもので、多くのサービスを運営する際に、
それをいちいち配布して運営するものではない。
多くのサービスを管理してくれるContainer orchestrationという概念である。
複数Containerを管理してくれるソリューションと見れば良い。
Kubernetes
DockerのContainer技術がオープンソースであるため、多くの企業が各自のContainer Orchestratorを発表することになった。
KubernetesはGoogleで主導したが、そのプロジェクトに複数の企業が参加して多様なKnow-Howが詰め込められている
ことで、多くの企業はKubernetesを使用した後の満足度が非常に高かった。
Kubernetesへの関心は、他のContainer Orchestratorに比べ飛躍的に増加することになった。ITにおける標準という概念はある機関に認められて獲得するそのようなものではなく、最も使われているものが標準になる思う。現在Kubernetesがサービスの展開の標準になりつつあり、この技術を基に、多くのクラウドサービスを提供する企業は、
Kubernetes環境がインストールされているインフラストラクチャをサービスしている。Why Kubernetes
As-is
A、B、Cそれぞれのサービスを提供するためには9つのサーバーが必要
サーバー障害等のため、バックアップサーバーとして3つのサーバーが必要
To-be
A、B、Cの平均リソースを計算すると1日4つのサーバーと障害対応1つのサーバーが必要
・Auto Scaling機能でトラピックの状況によって自動にサービスにリソースを割り当ててくれる
・Auto Healing機能で障害を起こしたサーバー上のサービスを自動に他のサーバーに移行してくれるため、バックアップサーバーは1台が必要Kubernetesは色んな機能の運用自動化をサポートしている。
Kubernetesを使うと運用環境のメインテナンスが簡単にできるので、サービスの効率がよくなる。
サービスの効率によって、サーバーが少なくなるとメインテナンス費用の削減ができるし、大規模の運用環境こそ効果が多くなるから多くの企業がKubernetes環境への移行に興味を持ち始めている。
- 投稿日:2020-05-14T11:00:13+09:00
LaravelとVueでSPAを作るときにTypescriptとpugを使う設定をする
Laravel、Vue.js、Typescript、pugでSPAを作ったときのメモ。
docker --version Docker version 19.03.8, build afacb8b扱ったDockerのバージョンは19.03.8。
Fig.1project ├── db ├── web ├── Dockerfile ├── docker-compose.yml └── .env以下の手順で
Fig.1のような構成のレポジトリを作り、webディレクトリの中にLaravelをインストールする。レポジトリと各ファイルを作成
mkdir project_name && cd $_ && touch {docker-compose.yml,Dockerfile,.env}プロジェクトのディレクトリを作成し(
mkdir project_name)、作成したディレクトリに移動し(cd $_) 1 、docker-compose.yml,Dockerfile,.envファイルを作成する(touch {docker-compose.yml,Dockerfile,.env})。この時点で
Fig.2の構成になる。Fig.2project_name ├── Dockerfile ├── docker-compose.yml └── .env各ファイルは以下の内容で書く。
docker-compose.yml
docker-compose.ymlversion: '3' services: web: build: . container_name: ${PROJECT}-web ports: - 80:80 - 3000:3000 volumes: - ./web:/var/www/html/${PROJECT} depends_on: - db db: image: mysql:8 container_name: ${PROJECT}-mysql restart: always environment: MYSQL_DATABASE: ${PROJECT} MYSQL_USER: ${DB_USER} MYSQL_PASSWORD: ${DB_PASSWORD} MYSQL_ROOT_PASSWORD: ${DB_PASSWORD} TZ: ${TZ} ports: - 3306:3306 volumes: - ./db:/var/lib/mysqlDockerfile
DockerfileFROM php:7.4-fpm COPY --from=node:12 COPY --from=composer:latest /usr/bin/composer /usr/bin/composer RUN apt-get update \ && apt-get install -y wget git zip unzip vim libpq-dev \ && : 'Install PHP Extensions' \ && docker-php-ext-install pdo_mysql pdo_pgsql \ WORKDIR /var/www/html/project_nameマルチステージビルド2で Node.js と Composer の Docker公式イメージ を利用する。
.env
.envPROJECT=project_name DB_USER=user_name DB_PASSWORD=password TZ=Asia/Tokyoコンテナを起動
docker-compose up -dこの時点で
Fig.1の構成になる。コンテナに入る
docker-compose exec web bashコンテナの中では
composerやnpmが使える。# composer --version Composer version 1.10.6 2020-05-06 10:28:10 # node --version v12.16.3 # npm --version 6.14.5Laravelをインストール
# composer create-project --prefer-dist laravel/laravel . // バージョンを指定する場合 (e.g. Laravel6 を指定する場合) # composer create-project --prefer-dist laravel/laravel . "6.*"Laravelの設定
web/config/app.php
app.php<?php return [ // 他の設定 'timezone' => 'Asia/Tokyo', 'locale' => 'ja', // 他の設定 ];設定値を変更。
web/.env
.env// 他の設定 DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=project_name DB_USERNAME=user_name DB_PASSWORD=password // 他の設定データベースに接続するための情報を入れる。
MySQLに接続する場合はDB_CONNECTION=mysql。
DB_HOSTはdocker-compose.ymlのservicesで設定したdbとする。
他の設定も.envで設定したものと同じ。パッケージをインストール
# npm i # npm i vue vue-router pug pug-plain-loader --save-dev # npm i -g typescript # tsc --inittypescriptをグローバルにインストールすると
tscコマンドが使えるようになり、# tsc --version Version 3.8.3
tsc --initとするとtsconfig.jsonが生成される。3
tsc --initをgit initと混同してtsc initとしないように注意。4ファイルを編集
web/webpack.mix.js
webpack.mix.jsconst mix = require('laravel-mix') /* |-------------------------------------------------------------------------- | Mix Asset Management |-------------------------------------------------------------------------- | | Mix provides a clean, fluent API for defining some Webpack build steps | for your Laravel application. By default, we are compiling the Sass | file for the application as well as bundling up all the JS files. | */ mix .webpackConfig({ module: { rules: [{ test: /\.pug$/, oneOf: [ { resourceQuery: /^\?vue/, use: ['pug-plain-loader'] }, { use: ['raw-loader', 'pug-plain-loader'] } ] }] } }) .browserSync({ proxy: '0.0.0.0:80', open: false, files: [ 'resources/**/*', 'public/**/*' ] }) .ts('resources/ts/app.ts', 'public/js/app.js') .sass('resources/sass/app.scss', 'public/css') .version()pugを扱うための設定も記載する。5
BrowserSyncの設定を記入。6 7
mix.js()と書かれていた部分をmix.ts()変えるだけ。8 あとは扱うファイルの変更に従って引数のファイルもjsからtsに変更する。web/resources/ts/app.ts
app.tsimport Vue from 'vue' import router from './router' import App from './App.vue' new Vue({ el: '#app', router, components: { App }, template: '<App />' })
web/resources/js/app.jsをweb/resources/ts/app.tsに書き換える。
ここでApp.vueとrouter.tsを読み込む。web/resources/ts/App.vue
App.vue<template lang="pug"> div main RouterView </template>ルートコンポーネント。
ここで Vue Router が提供するRouterView9 を使う。web/resources/ts/router.ts
router.tsimport Vue from 'vue' import VueRouter from 'vue-router' import Foo from './pages/Foo.vue' import Bar from './pages/Bar.vue' Vue.use(VueRouter) const routes: any = [{ path: '/foo', component: Foo }, { path: '/bar', component: Bar } }] const router = new VueRouter({ mode: 'history', routes }) export default routerルーティングの定義の設定。
History モード 10にすることでURLがハッシュなしで設定できる。web/resources/ts/pages/Foo.vue
Foo.vue<template lang="pug"> .foo h1 Foo </template>web/resources/ts/pages/Bar.vue
Bar.vue<template lang="pug"> .bar h1 Bar </template>web/routes/web.php
web.php<?php Route::get('/{any?}', function () { return view('index'); })->where('any', '.+');web/resources/views/index.blade.php
index.blade.php<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>project_name</title> <script src="{{ mix('js/app.js') }}" defer></script> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.1/normalize.min.css"> </head> <body> <div id="app"></div> </body> </html>web/vue-shim.d.ts
vue-shim.d.tsdeclare module "*.vue" { import Vue from "vue"; export default Vue; }
Typescript: IDE reports TS2307: Cannot find module error for Vue components importsとエラーが出たので作成する。11サーバーを起動
# php artisan serve --host 0.0.0.0 --port 80ビルド
# npm run watch-pollhttp://localhost:3000 にアクセスしてブラウザで確認する。
参考
- 投稿日:2020-05-14T10:38:32+09:00
WordPressの公式にあるdocker-entrypoint.shが読めなかった->なんとか読めるようになるまで
Shell ゼンゼン ヨメナイ
Docker-composeがうまくいかないときに、「とりあえずdocker-entrypoint.shでも読んでみるかー」と思ったけど、全然読めなかった。なんやこれ。
https://github.com/docker-library/wordpress/tree/master/php7.4/cli
docker-entrypoint.sh#!/bin/sh set -euo pipefail # first arg is `-f` or `--some-option` if [ "${1#-}" != "$1" ]; then set -- wp "$@" fi # if our command is a valid wp-cli subcommand, let's invoke it through wp-cli instead # (this allows for "docker run wordpress:cli help", etc) if wp --path=/dev/null help "$1" > /dev/null 2>&1; then set -- wp "$@" fi exec "$@"特にわからなかったところをメモで残す。
set -euo pipefailsetでshellのオプションを色々設定しているらしい
[参考]https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7deオプションはエラーが発生したら中断
uオプションは未定義の変数をエラーにするもの
oオプションはpipefailとセットで使っていて、パイプの左側のコマンドが死んだときに止まってくれるというもの
https://qiita.com/progrhyme/items/6e522d83de3c94aadec9if [ "${1#-}" != "$1" ]; then set -- wp "$@" fiこれが全然わからなかったので実際に手元で動かして見ると以下のようなことがわかった。
${1#-}は引数の1番目の文字からハイフンを一つ取り除いたもの。例えば. hoge.sh -a testと実行したら${1#-}はaを返す。なのでif文の意味は「ハイフンが付いていたら」という意味になる。わかりづれぇ。
set -- wp "$@"これも全然わからなかった。
[参考]https://yash.osdn.jp/doc/ja/_set.htmlSet コマンドにオペランドが与えられている場合またはオプションとオペランドを区切るハイフン二つ (--, コマンドの引数の構文参照) がコマンドライン引数に入っている場合は、現在の位置パラメータは削除され、与えられたオペランドがそれぞれ新しく位置パラメータになります。ハイフン二つが与えられていてかつオペランドがない場合は位置パラメータはなくなります。
この文章を5分くらい見つめてようやく理解した。
つまり
. hoge.sh -a testを実行すると$@は-a testとなるが、set -- wp "$@"を実行すると$@はwp -a testとなるわけだ。wpコマンドそのものに対してオプションを与えたい場合を想定していて、その他は普通にDockerfileのCMDコマンドを受け取っているのだな、と理解した。
たったこれだけの話なのに理解するのにものすごい時間を要してしまったので記録として残しておきます。
- 投稿日:2020-05-14T10:02:56+09:00
Docker Enterprise Edition on Ubuntu
1.Ubuntu インスタンスの作成
以下のインスタンスを作成します。
UCPは、7GB以上のメモリが必要となりますので、見合うインスタンスを作成します。
今回はGoogle Cloud Platformで行います。
項目 入力概要 名前 instance-1 ゾーン asia-northeast1-a マシンタイプ n1-standard-2 ブートディスク Ubuntu 18.04 LTS
ディスクサイズ30GBファイアウォール HTTP トラフィックを許可する、HTTPS トラフィックを許可するの両方をチェックします。 2.DockerHub
DockerHubのアカウントを作成後、「Explore」-「Docker EE」を選択し、「Docker Enterprise (Ubuntu)」を選択します。
「Start 1 Month Trial」ボタンをクリックすると、ユーザ情報を入力する画面に遷移するので、必要情報を入力します。
その後、サブスクリプション情報などを確認できるページに遷移します。
ライセンスファイルは、Universal Control Plane(UCP)インストール後に必要となるので、ダウンロードしておきます。
「License Key」をクリックします。
3.Docker EE Setup
1.aptパッケージのアップデート
$ sudo apt-get update Hit:1 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic InRelease Get:2 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB] Get:3 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB] Get:4 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic/universe amd64 Packages [8570 kB] Get:5 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB] Get:6 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic/universe Translation-en [4941 kB] Get:7 http://archive.canonical.com/ubuntu bionic InRelease [10.2 kB] Get:8 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic/multiverse amd64 Packages [151 kB] Get:9 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic/multiverse Translation-en [108 kB] Get:10 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages [932 kB] Get:11 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-updates/restricted amd64 Packages [50.1 kB] Get:12 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 Packages [1068 kB] Get:13 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-updates/universe Translation-en [332 kB] Get:14 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-updates/multiverse amd64 Packages [15.5 kB] Get:15 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-updates/multiverse Translation-en [6352 B] Get:16 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-backports/main amd64 Packages [7516 B] Get:17 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-backports/main Translation-en [4764 B] Get:18 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-backports/universe amd64 Packages [7484 B] Get:19 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-backports/universe Translation-en [4436 B] Get:20 http://archive.canonical.com/ubuntu bionic/partner amd64 Packages [2300 B] Get:21 http://archive.canonical.com/ubuntu bionic/partner Translation-en [1332 B] Get:22 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [707 kB] Get:23 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [660 kB] Get:24 http://security.ubuntu.com/ubuntu bionic-security/universe Translation-en [219 kB] Get:25 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [7392 B] Get:26 http://security.ubuntu.com/ubuntu bionic-security/multiverse Translation-en [2788 B] Fetched 18.1 MB in 4s (4565 kB/s) Reading package lists... Done2.パッケージのインストール
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common Reading package lists... Done Building dependency tree Reading state information... Done ca-certificates is already the newest version (20180409). ca-certificates set to manually installed. curl is already the newest version (7.58.0-2ubuntu3.8). curl set to manually installed. software-properties-common is already the newest version (0.96.24.32.12). software-properties-common set to manually installed. The following packages were automatically installed and are no longer required: grub-pc-bin libnuma1 Use 'sudo apt autoremove' to remove them. The following NEW packages will be installed: apt-transport-https 0 upgraded, 1 newly installed, 0 to remove and 2 not upgraded. Need to get 1692 B of archives. After this operation, 153 kB of additional disk space will be used. Do you want to continue? [Y/n] Y Get:1 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-updates/universe amd64 apt-transport-https all 1.6.12 [1692 B] Fetched 1692 B in 0s (10.3 kB/s) Selecting previously unselected package apt-transport-https. (Reading database ... 65406 files and directories currently installed.) Preparing to unpack .../apt-transport-https_1.6.12_all.deb ... Unpacking apt-transport-https (1.6.12) ... Setting up apt-transport-https (1.6.12) ...3.環境変数作成
サブスクリプション情報を含むDocker EE URLの環境変数を作成します。
$ DOCKER_EE_URL="https://storebits.docker.com/ee/ubuntu/sub-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"サブスクリプション情報は、DockerHubで確認できます。
Dockerのバージョンの環境変数を作成します。
$ DOCKER_EE_VERSION=19.034.GPGキーの追加
GPGキーの追加を追加します。
$ curl -fsSL "${DOCKER_EE_URL}/ubuntu/gpg" | sudo apt-key add - OK追加したGPGキーのフィンガープリントがDD91 1E99 5A64 A202 E859 07D6 BC14 F10B 6D08 5F96であることを確認します。
$ sudo apt-key fingerprint 6D085F96 pub rsa4096 2017-02-22 [SCEA] DD91 1E99 5A64 A202 E859 07D6 BC14 F10B 6D08 5F96 uid [ unknown] Docker Release (EE deb) <docker@docker.com> sub rsa4096 2017-02-22 [S]5.Stableレポジトリ設定
Stableレポジトリの」設定をします。
$ sudo add-apt-repository "deb [arch=$(dpkg --print-architecture)] $DOCKER_EE_URL/ubuntu $(lsb_release -cs) stable-$DOCKER_EE_VERSION" Hit:1 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic InRelease Hit:2 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-updates InRelease Hit:3 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-backports InRelease Hit:4 http://archive.canonical.com/ubuntu bionic InRelease Hit:5 http://security.ubuntu.com/ubuntu bionic-security InRelease Get:6 https://storebits.docker.com/ee/ubuntu/sub-69f12d40-35d8-44e6-ae75-640b618b3867/ubuntu bionic InRelease [116 kB] Get:7 https://storebits.docker.com/ee/ubuntu/sub-69f12d40-35d8-44e6-ae75-640b618b3867/ubuntu bionic/stable-19.03 amd64 Packages [3919 B] Fetched 120 kB in 3s (40.1 kB/s) Reading package lists... Done6.Docker Engine (Enterprise) インストール
パッケージをアップデートします。
$ sudo apt-get update Hit:1 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic InRelease Hit:2 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-updates InRelease Hit:3 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic-backports InRelease Hit:4 http://security.ubuntu.com/ubuntu bionic-security InRelease Hit:5 http://archive.canonical.com/ubuntu bionic InRelease Hit:6 https://storebits.docker.com/ee/ubuntu/sub-69f12d40-35d8-44e6-ae75-640b618b3867/ubuntu bionic InRelease Reading package lists... DoneDocker Engineをインストールします。
$ sudo apt-get install docker-ee docker-ee-cli containerd.io Reading package lists... Done Building dependency tree Reading state information... Done The following packages were automatically installed and are no longer required: grub-pc-bin libnuma1 Use 'sudo apt autoremove' to remove them. The following additional packages will be installed: aufs-tools cgroupfs-mount libltdl7 pigz The following NEW packages will be installed: aufs-tools cgroupfs-mount containerd.io docker-ee docker-ee-cli libltdl7 pigz 0 upgraded, 7 newly installed, 0 to remove and 2 not upgraded. Need to get 149 MB of archives. After this operation, 627 MB of additional disk space will be used. Do you want to continue? [Y/n] Y Get:1 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic/universe amd64 pigz amd64 2.4-1 [57.4 kB] Get:2 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic/universe amd64 aufs-tools amd64 1:4.9+20170918-1ubuntu1 [104 kB] Get:3 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic/universe amd64 cgroupfs-mount all 1.4 [6320 B] Get:4 http://asia-northeast1.gce.archive.ubuntu.com/ubuntu bionic/main amd64 libltdl7 amd64 2.4.6-2 [38.8 kB] Get:5 https://storebits.docker.com/ee/ubuntu/sub-69f12d40-35d8-44e6-ae75-640b618b3867/ubuntu bionic/stable-19.03 amd64 containerd.io amd64 1.2.6-3 [22.6 MB] Get:6 https://storebits.docker.com/ee/ubuntu/sub-69f12d40-35d8-44e6-ae75-640b618b3867/ubuntu bionic/stable-19.03 amd64 docker-ee-cli amd64 5:19.03.5~3-0~ubuntu-bionic [102 MB] Get:7 https://storebits.docker.com/ee/ubuntu/sub-69f12d40-35d8-44e6-ae75-640b618b3867/ubuntu bionic/stable-19.03 amd64 docker-ee amd64 5:19.03.5~3-0~ubuntu-bionic [24.8 MB] Fetched 149 MB in 18s (8298 kB/s) Selecting previously unselected package pigz. (Reading database ... 65410 files and directories currently installed.) Preparing to unpack .../0-pigz_2.4-1_amd64.deb ... Unpacking pigz (2.4-1) ... Selecting previously unselected package aufs-tools. Preparing to unpack .../1-aufs-tools_1%3a4.9+20170918-1ubuntu1_amd64.deb ... Unpacking aufs-tools (1:4.9+20170918-1ubuntu1) ... Selecting previously unselected package cgroupfs-mount. Preparing to unpack .../2-cgroupfs-mount_1.4_all.deb ... Unpacking cgroupfs-mount (1.4) ... Selecting previously unselected package containerd.io. Preparing to unpack .../3-containerd.io_1.2.6-3_amd64.deb ... Unpacking containerd.io (1.2.6-3) ... Selecting previously unselected package docker-ee-cli. Preparing to unpack .../4-docker-ee-cli_5%3a19.03.5~3-0~ubuntu-bionic_amd64.deb ... Unpacking docker-ee-cli (5:19.03.5~3-0~ubuntu-bionic) ... Selecting previously unselected package docker-ee. Preparing to unpack .../5-docker-ee_5%3a19.03.5~3-0~ubuntu-bionic_amd64.deb ... Unpacking docker-ee (5:19.03.5~3-0~ubuntu-bionic) ... Selecting previously unselected package libltdl7:amd64. Preparing to unpack .../6-libltdl7_2.4.6-2_amd64.deb ... Unpacking libltdl7:amd64 (2.4.6-2) ... Setting up aufs-tools (1:4.9+20170918-1ubuntu1) ... Setting up containerd.io (1.2.6-3) ... Created symlink /etc/systemd/system/multi-user.target.wants/containerd.service → /lib/systemd/system/containerd.service. Setting up cgroupfs-mount (1.4) ... Setting up docker-ee-cli (5:19.03.5~3-0~ubuntu-bionic) ... Setting up libltdl7:amd64 (2.4.6-2) ... Setting up docker-ee (5:19.03.5~3-0~ubuntu-bionic) ... Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /lib/systemd/system/docker.service. Created symlink /etc/systemd/system/sockets.target.wants/docker.socket → /lib/systemd/system/docker.socket. Setting up pigz (2.4-1) ... Processing triggers for libc-bin (2.27-3ubuntu1) ... Processing triggers for systemd (237-3ubuntu10.39) ... Processing triggers for man-db (2.8.3-2ubuntu0.1) ... Processing triggers for ureadahead (0.100.0-21) ...インストールできていることを確認します。
$ sudo docker version Client: Docker Engine - Enterprise Version: 19.03.5 API version: 1.40 Go version: go1.12.12 Git commit: 2ee0c57608 Built: Wed Nov 13 07:45:31 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Enterprise Engine: Version: 19.03.5 API version: 1.40 (minimum version 1.12) Go version: go1.12.12 Git commit: 2ee0c57608 Built: Wed Nov 13 07:43:49 2019 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.6 GitCommit: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc: Version: 1.0.0-rc8 GitCommit: 425e105d5a03fabd737a126ad93d62a9eeede87f docker-init: Version: 0.18.0 GitCommit: fec3683sudoなしでdockerコマンドを実行する場合は、以下コマンドを実行して、再ログインします。
$ sudo usermod -aG docker $USER $ exit2.Universal Control Plane(UCP)のインストール
host-addressにUCPをインストールするインスタンスのURLまたはIPアドレスを入力します。
今回はGCPで行います。GCPの場合、host-addressには内部IPを入力します。外部IPではエラーとなります。「Admin Username:」と「Admin Password:」では、任意のものを入力します。UCP管理画面のログインIDとPASSになります。
「Additional aliases:」は、Enterキーを押します。$ docker container run --rm -it --name ucp -v /var/run/docker.sock:/var/run/docker.sock docker/ucp:3.2.6 install --host-address 10.146.0.16 --interactive Unable to find image 'docker/ucp:3.2.6' locally 3.2.6: Pulling from docker/ucp 4167d3e14976: Pull complete af325902296c: Pull complete 1c053272dca9: Pull complete Digest: sha256:8ef41e8fa4b40ede84fc8633a28f61ed0bae009e293aad9f1a9fb042fcab8688 Status: Downloaded newer image for docker/ucp:3.2.6 INFO[0000] Your Docker daemon version 19.03.5, build 2ee0c57608 (5.3.0-1018-gcp) is compatible with UCP 3.2.6 (04ac981) INFO[0000] Initializing New Docker Swarm Admin Username: admin Admin Password: Confirm Admin Password: WARN[0022] None of the Subject Alternative Names we'll be using in the UCP certificates ["instance-1"] contain a domain component. Your generated certs may fail TLS validation unless you only use one of these shortnames or IP addresses to connect. You can use the --san flag to add more aliases You may enter additional aliases (SANs) now or press enter to proceed with the above list. Additional aliases: INFO[0033] Checking required ports for connectivity INFO[0048] Checking required container images INFO[0048] Pulling required images... (this may take a while) INFO[0048] Pulling image: docker/ucp-agent:3.2.6 INFO[0052] Pulling image: docker/ucp-auth:3.2.6 INFO[0056] Pulling image: docker/ucp-auth-store:3.2.6 INFO[0063] Pulling image: docker/ucp-azure-ip-allocator:3.2.6 INFO[0067] Pulling image: docker/ucp-calico-cni:3.2.6 INFO[0073] Pulling image: docker/ucp-calico-kube-controllers:3.2.6 INFO[0078] Pulling image: docker/ucp-calico-node:3.2.6 INFO[0084] Pulling image: docker/ucp-cfssl:3.2.6 INFO[0088] Pulling image: docker/ucp-compose:3.2.6 INFO[0102] Pulling image: docker/ucp-controller:3.2.6 INFO[0112] Pulling image: docker/ucp-dsinfo:3.2.6 INFO[0115] Pulling image: docker/ucp-etcd:3.2.6 INFO[0121] Pulling image: docker/ucp-hyperkube:3.2.6 INFO[0134] Pulling image: docker/ucp-interlock:3.2.6 INFO[0137] Pulling image: docker/ucp-interlock-extension:3.2.6 INFO[0143] Pulling image: docker/ucp-interlock-proxy:3.2.6 INFO[0147] Pulling image: docker/ucp-interlock-config:3.2.6 INFO[0151] Pulling image: docker/ucp-kube-compose:3.2.6 INFO[0154] Pulling image: docker/ucp-kube-compose-api:3.2.6 INFO[0157] Pulling image: docker/ucp-kube-dns:3.2.6 INFO[0161] Pulling image: docker/ucp-kube-dns-dnsmasq-nanny:3.2.6 INFO[0165] Pulling image: docker/ucp-kube-dns-sidecar:3.2.6 INFO[0169] Pulling image: docker/ucp-metrics:3.2.6 INFO[0174] Pulling image: docker/ucp-pause:3.2.6 INFO[0177] Pulling image: docker/ucp-swarm:3.2.6 INFO[0180] Completed pulling required images INFO[0180] Running install agent container ... INFO[0000] Loading install configuration INFO[0000] Running Installation Steps INFO[0000] Step 1 of 35: [Setup Internal Cluster CA] INFO[0003] Step 2 of 35: [Setup Internal Client CA] INFO[0003] Step 3 of 35: [Initialize etcd Cluster] INFO[0007] Step 4 of 35: [Set Initial Config in etcd] INFO[0007] Step 5 of 35: [Deploy RethinkDB Server] INFO[0009] Step 6 of 35: [Initialize RethinkDB Tables] INFO[0015] Step 7 of 35: [Create Auth Service Encryption Key Secret] INFO[0015] Step 8 of 35: [Deploy Auth API Server] INFO[0019] Step 9 of 35: [Setup Auth Configuration] INFO[0020] Step 10 of 35: [Deploy Auth Worker Server] INFO[0023] Step 11 of 35: [Deploy UCP Proxy Server] INFO[0024] Step 12 of 35: [Initialize Swarm v1 Node Inventory] INFO[0024] Step 13 of 35: [Deploy Swarm v1 Manager Server] INFO[0025] Step 14 of 35: [Deploy Internal Cluster CA Server] INFO[0026] Step 15 of 35: [Deploy Internal Client CA Server] INFO[0027] Step 16 of 35: [Deploy UCP Controller Server] INFO[0036] Step 17 of 35: [Deploy Kubernetes API Server] INFO[0046] Step 18 of 35: [Deploy Kubernetes Controller Manager] INFO[0050] Step 19 of 35: [Deploy Kubernetes Scheduler] INFO[0055] Step 20 of 35: [Deploy Kubelet] INFO[0056] Step 21 of 35: [Deploy Kubernetes Proxy] INFO[0057] Step 22 of 35: [Wait for Healthy UCP Controller and Kubernetes API] INFO[0057] Step 23 of 35: [Create Kubernetes Pod Security Policies] INFO[0062] Step 24 of 35: [Install Kubernetes CNI Plugin] INFO[0080] Step 25 of 35: [Install KubeDNS] INFO[0083] Step 26 of 35: [Create UCP Controller Kubernetes Service Endpoints] INFO[0091] Step 27 of 35: [Install Metrics Plugin] INFO[0100] Step 28 of 35: [Install Kubernetes Compose Plugin] INFO[0115] Step 29 of 35: [Deploy Manager Node Agent Service] INFO[0115] Step 30 of 35: [Deploy Worker Node Agent Service] INFO[0115] Step 31 of 35: [Deploy Windows Worker Node Agent Service] INFO[0115] Step 32 of 35: [Deploy Cluster Agent Service] INFO[0115] Step 33 of 35: [Set License] INFO[0115] Step 34 of 35: [Set Registry CA Certificates] INFO[0115] Step 35 of 35: [Wait for All Nodes to be Ready] INFO[0120] Waiting for 1 nodes to be ready INFO[0126] All Installation Steps Completed8.UCPアクセス
ブラウザを起動して、インスタンスの外部IPアドレスにアクセスして、インストール時に設定した、UsernameとPasswordでログインします。
「Upload License」ボタンをクリックして、事前にダウンロードしたライセンスファイルを選択します。
ログイン完了となります。
- 投稿日:2020-05-14T05:10:57+09:00
docker の multi stage build でビルド済みのバイナリを持ってくる
Overview
docker の multi stage build は 別の image でビルドした成果物を COPY できたりするので、
先人の叡智から必要なとこだけを取り出す話。なんでこれで動くかまで説明すると長くなるので、
詳しくは「Linux バイナリ 互換性」とかでググってみてください。
ちなみに Architecture (amd64 とか arm とか) が違うと動かないので注意。例えば awscli
中身の構成を確認
こんな感じになってるので、
bash[ホスト側]$ docker run --rm -it --entrypoint bash amazon/aws-cli # 以下コンテナの中 bash-4.2# ls -la /usr/local/bin/ total 8 drwxr-xr-x 1 root root 4096 May 12 23:14 . drwxr-xr-x 1 root root 4096 May 12 23:14 .. lrwxrwxrwx 1 root root 37 May 12 23:14 aws -> /usr/local/aws-cli/v2/current/bin/aws lrwxrwxrwx 1 root root 47 May 12 23:14 aws_completer -> /usr/local/aws-cli/v2/current/bin/aws_completer bash-4.2# find /usr/local/aws-cli/ -maxdepth 3 /usr/local/aws-cli/ /usr/local/aws-cli/v2 /usr/local/aws-cli/v2/current /usr/local/aws-cli/v2/2.0.13 /usr/local/aws-cli/v2/2.0.13/dist /usr/local/aws-cli/v2/2.0.13/bin bash-4.2# aws --version aws-cli/2.0.13 Python/3.7.3 Linux/5.4.39-1-MANJARO botocore/2.0.0dev17
/usr/local/aws-cliと/usr/local/bin/*があれば動かせそうです。自前の image をビルド
ただ、 Dockerfile の COPY は symlink をそのまま COPY できず実体がコピーされてしまうので、
そこは手動で symlink を設定してやります。DockerfileFROM amazon/aws-cli as awscli FROM ubuntu:20.04 COPY --from=awscli /usr/local/aws-cli /usr/local/aws-cli WORKDIR /usr/local/bin RUN ln -s /usr/local/aws-cli/v2/current/bin/* .bash[ホスト側]$ docker build -t hoge .起動
素の ubuntu:20.04 には
pythonもawsも入ってないけど、ちゃんと動いてますね。bash[ホスト側]$ docker run --rm -it hoge bash # 以下コンテナの中 root@e5e61bc64ec6:/usr/local/bin# aws --version aws-cli/2.0.13 Python/3.7.3 Linux/5.4.39-1-MANJARO botocore/2.0.0dev17例えば redis-cli
shared object などに依存しない単体起動のバイナリなら、そのまま持ってくれば動きます。
bash[ホスト側]$ docker run --rm -it redis:5 bash root@e99841fb6fe0:/data# which redis-cli /usr/local/bin/redis-cliビルド
DockerfileFROM redis:5 as redis FROM ubuntu:20.04 COPY --from=redis /usr/local/bin/redis-cli /usr/local/bin/redis-clibash[ホスト側]$ docker build -t hoge2 .起動して確認
bash[ホスト側]$ docker run --rm -it hoge2 root@cf4751f1a1b4:/# redis-cli --version redis-cli 5.0.9駄目なケース
例えば postgresql から psql だけ欲しい、みたいなケース。
client-server 型など、依存するファイルが多い場合とかはちょっと厳しいかもしれません。
原理は同じなんですけど。つらいケース[ホスト側]$ docker run --rm -it postgres:12 bash root@f8d9eccc84f2:/# ls -la $(which psql) lrwxrwxrwx 1 root root 37 Feb 24 15:20 /usr/bin/psql -> ../share/postgresql-common/pg_wrapper root@f8d9eccc84f2:/# ls -la /usr/share/postgresql-common/ total 80 drwxr-xr-x 5 root root 4096 Apr 23 16:27 . drwxr-xr-x 1 root root 4096 Apr 23 16:28 .. -rw-r--r-- 1 root root 1325 Jun 2 2017 createcluster.conf -rw-r--r-- 1 root root 3416 Dec 9 2016 init.d-functions -rw-r--r-- 1 root root 10098 Feb 24 14:26 maintscripts-functions -rwxr-xr-x 1 root root 1868 Feb 21 2016 pg_checksystem -rw-r--r-- 1 root root 1727 Sep 4 2019 pgcommon.sh drwxr-xr-x 2 root root 4096 Apr 23 16:27 pgdg -rwxr-xr-x 1 root root 9366 Feb 24 14:26 pg_wrapper -rwxr-xr-x 1 root root 3710 Oct 19 2017 run-upgrade-scripts -rwxr-xr-x 1 root root 6085 Feb 11 09:11 supported-versions drwxr-xr-x 2 root root 4096 Apr 23 16:27 t -rwxr-xr-x 1 root root 6516 Sep 10 2019 testsuite drwxr-xr-x 2 root root 4096 Apr 23 16:27 upgrade-scriptsおわり。
- 投稿日:2020-05-14T01:33:44+09:00
Docker Composeをインストールしよう(CentOS8)
インストール
公式手順:https://docs.docker.com/compose/install/
非公式翻訳手順:http://docs.docker.jp/compose/install.html現在の安定版Docker Composeをダウンロードする
$ curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-composeダウンロードしたDocker Composeのバイナリに対して、実行権限を付与する
$ chmod +x /usr/local/bin/docker-composeインストールを確認する
$ docker-compose --version docker-compose version 1.25.5, build 8a1c60f6これで完了。めっちゃ簡単だね!!!
- 投稿日:2020-05-14T00:22:44+09:00
Docker composeでWordpressマルチサイトの開発環境構築する備忘録
個人的な備忘録
Wordpressマルチサイト
1つのWordPressで複数のサイトを運用可能にすることで、共通のテンプレートやプラグインが利用できる機能
対応していないプラグインもあるが、全体で共通で利用するだけでなく、サイトごとに個別で有効化することもできる
機能として以下の3種類があるサブディレクトリ型 マルチサイト
- kamihork.com/site1
- kamihork.com/site2
サブドメイン型 マルチサイト
- site1.kamihork.com
- site2.kamihork.com
複数ドメイン型 マルチサイト
- site1-kamihork.com
- site2-kmaihork.com
Wordpressマルチサイトでの、サブドメイン形式での構築手順
サブドメイン形式を選択する場合、予約済みドメイン(localhost)だとそれを実現できない
なので、これを実現するのに、lvh.meというループバックドメインを利用する
※ 参考 : https://techracho.bpsinc.jp/ebi/2020_04_23/91311lvh.me
2020/5/14時点での、有効期限は1年間ぐらいある
$ whois lvh.me | grep Expiry Registry Expiry Date: 2021-06-02T00:35:34Z手順
Dockerを確認
$ docker -v Docker version 18.09.2, build 6247962 $ docker-compose -v docker-compose version 1.23.2, build 1110ad01docker-compose.ymlを作成
docker-compose.ymlversion: '1.0' services: db: image: mysql:5.7 volumes: - ./mysql:/var/lib/mysql ports: - 3306:3306 networks: - wpnet environment: - MYSQL_DATABASE=kamihork-db - MYSQL_USER=kamihork - MYSQL_PASSWORD=pass - MYSQL_ROOT_PASSWORD=root app: build: context: ./app dockerfile: Dockerfile volumes: - ./html:/var/www/html - ./wp-install.sh:/tmp/wp-install.sh ports: - 80:80 depends_on: - db networks: - wpnet cli: image: wordpress:cli-2.3.0-php7.1 volumes_from: - app:rw networks: - wpnet networks: wpnet:Dockerファイルを作成
FROM php:7.1-apache RUN \ { apt-get update; \ apt-get install -y zlib1g-dev libzip-dev; \ docker-php-ext-install zip; \ docker-php-ext-install mysqli; \ docker-php-ext-configure zip; \ docker-php-ext-configure mysqli ; \ }wordpress cliを利用してもろもろ初期設定をするshellを作成
プラグインのインストールは、wp plugin install で可能
マルチサイトのインストールは、 wp core multisite-install で可能wp-install.sh#!/bin/bash set -ex; INSTALLDIR=/var/www/html wp core download \ --locale=ja --version=5.2.2 --path=${INSTALLDIR} wp config create \ --dbname=kamihork-db --dbuser=kamihork --dbpass=pass --dbhost=db:3306 \ --force --path=${INSTALLDIR} wp core multisite-install \ --url=www.lvh.me --subdomains --title='kamihorkのマルチサイト' \ --admin_user=kamihork --admin_password=pass --admin_email=hoge@fuga.com --allow-root wp site create \ --slug=sub --title='kamihorkのマルチサイト @サブ' --allow-rootコンテナを起動
$ docker-compose up -d --build用意したシェルを実行
# ログイン $ docker-compose run --rm cli bash # 権限変える $ chmod +x /tmp/wp-install.sh # 実行 $ /tmp/wp-install.shコンテナを削除終了
$ docker-compose down --volumesプロセス確認
$ docker psimage確認
$ docker imagesサイトの確認
本体サイト
http://lvh.me/ http://lvh.me/wp-admin/index.phpサブドメインサイト
http://sub.lvh.me/ http://sub.lvh.me/wp-admin/index.php参考記事など
Docker選定に関する記事
Dockerとは
迷える子羊に捧げるコンテナ環境徹底比較
Docker導入するべき?するべきではない?マルチサイトについて
WordPressマルチサイトとは?メリットデメリット丸わかり
複数のWordPressでサブドメインを運用する5つのポイント
WordPressマルチサイト対応プラグインの作り方
ループバックドメインの有効期限AWS+Wordpressに関する記事
Dockerの利用
Dockerを利用したWordPressの開発環境をwp-cliを使ってさくっと構築する
Docker Composeを使ってWordPressが動作するローカル環境を作る
lvh.meドメインを使って、サブドメイン形式のWordPressマルチサイトのDocker開発環境構築
docker-compose コマンドまとめ
docker-compose.ymlの書き方について解説してみた
DockerfileとはAWS EC2 の利用
WordPress を Amazon EC2 インスタンスにデプロイする
WordPress ウェブサイトを構築する
小中規模向け低コストで可用性/拡張性の高いWordPress アーキテクチャ
AWS の WordPress High Availability by Bitnami
AWS再入門2018 WordPress on AWS編
[和訳]WordPress ベストプラクティス on AWSAWS ECS の利用
Amazon ECSの主な機能と使い方
WordPressをAWSのDockerで公開
Docker環境をAWS ECSでデプロイするまで
AWS ECSでDockerコンテナ管理入門
CodePipelineからECSにBlue/Greenデプロイする
- 投稿日:2020-05-14T00:22:19+09:00
【Docker】Dockerについて
Dockerについて様々なサイトを参考にさせていただき、あくまでも自分の備忘録としてまとめました。
なのでわかりやすく書いてはいないので詳細を知りたい方は参考URL欄にあるリンクに飛ぶようお願いします。image
コンテナを起動するのに必要な設定ファイルをまとめたもの。
「imageはコンテナの元であり、imageからコンテナを起動する」と理解すると良いと思います。・イメージの構造
一度作成されたイメージは読み取り専用であり、イメージからコンテナを起動した際に作成されるコンテナレイヤーのみが編集可能になっている。
イメージレイヤの内容を変更する際は変更対象のレイヤを1度コンテナレイヤにコピーしてから変更内容を反映する。これをコピーオンライトと呼ぶ。また同一のホスト上で動く複数のコンテナがある場合はイメージレイヤを共有することができます。
これにより、ホストのストレージ容量の圧迫を抑制することができる。Dockerfile
Dockerfileはコンテナの構成情報を定義したファイル。
何回もDockerコマンドを打たなくても1回コマンドを打てばDocker imageを生成できる。
Dockerfileからベースイメージを作成することをビルドといい、Dockerコンテナからイメージを作成することをコミットと呼びます。Dockerにおけるデータ管理
起動したコンテナ内で扱う動的なデータは、読み書き可能な最上レイヤー(コンテナレイヤー)に置くことも可能ですが、
→コンテナが削除された時点でそのコンテナ内のデータは消える
→コンテナ間でデータ共有できない
→コンテナレイヤーへのデータ書き込みは、通常のファイルシステムと異なるユニオンファイルシステムが使われているため、書き込み速度が遅いというデメリットがあり、Dockerではホストマシン上にデータを管理し、それをコンテナにマウントする方式がとられている。volume
ホストマシン上に自動生成される指定ディレクトリをコンテナにマウントする手法。
コンテナの性質
コンテナはホストOS上のプロセスとして扱われます。なのでデータ処理が途中で削除されるとデータが保存されないようにコンテナが削除されるとデータは保存されず再度起動しても削除前のデータが戻りません。このような性質のことを『ステートレス』といいます。
一方、コンテナが削除されてもボリュームがあればデータを残すことができます。
データをコンテナの削除から退避させることを「データの永続化」といいます。また、コンテナが削除されても退避していたデータに引き続きアクセスできることを「ステートフル」といいます。Dockerではコンテナを明示的に削除しない限りデータは保持されます。(一時停止や停止コマンドではデータは保持される)
複数のコンテナの管理方法
Dockerには『1つのコンテナが扱うプロセスは1つのみ』という考え方があります。
2つの異なるプロセスを1つのコンテナに内包した場合に片方のプロセスにアップデートがあった場合にもう片方のプロセスにも影響が出てしまうためです。Dockerネットワーク
複数立ち上げたコンテナ間を通信する方法。
例えば、Webページの運用を行う場合、WordpressコンテナとMySQLコンテナを立ち上げとすると、WordpressコンテナはMySQLコンテナと通信する必要があります。
その手段としてDockerネットワークが使用される。Bridgeネットワーク
デフォルトで存在するネットワークで、作成されたコンテナがデフォルトで接続されるのがbridge network。
同じネットワーク内に存在するコンテナとIPアドレス指定で通信はできるが、DNSが定義されていないのでコンテナ名では他のコンテナには通信できない。独自ネットワーク
独自のネットワークを作成することで、コンテナ名でコンテナ通信が可能になる。
Docker Compose
Docker Comaposeは複数コンテナのDockerアプリケーションを事前定義して実行するためのツール
またWebサービスの実行環境をDockerで構築している場合にWebサーバー、DBサーバー、Cacheサーバーなどの定義を1つのdocker-compose.ymlファイルに記述しておくことによって、それを元に実行に必要なコンテナをまとめて起動・設定することがでそれを元に実行に必要なコンテナをまとめて起動・設定することができる。Docker Machine
Docker Machineは、Docker Engineを搭載した仮想マシンの管理(作成、起動、停止、再起動など)をコマンドラインから実行できるツール。
Mac OSの場合は、仮想化ソフト(Virtul Box)をドライバーに使用して、Docker Engine を搭載した仮想マシンを管理するのがDocker Machineです。AWSにDockerを組み込む
Docker Machineを使用してlocalのコマンドラインからAWSやGCPなどにDocker Engineを搭載した仮想マシンを作成・管理する。
DockerSwarm
複数台のDockerホストマシンの間でコンテナ間通信の設定・管理を自動化する手法の1つ。
Docker Swarmには動作モードの1つとしてSwarm Modeがあり、下記を持ちます。
・クラスタ管理機能:複数台のマシンをネットワーク接続してひとまとまりのシステムとして管理する機能。
・オーケストレーション機能:複数のマシンを自動で管理する機能(負荷分散、コンテナ起動など)まとめるとDocker Swarmは、
・Dockerホストマシン同士をネットワーク接続する
・その上で「複数のホストマシン」と「その中で動作するコンテナ達」を管理・運用する様々な機能を提供する参考URL
【図解】Dockerの全体像を理解する -前編-
https://qiita.com/etaroid/items/b1024c7d200a75b992fc
コンテナにもエンジンが必要! ―その代表格と言える「Docker」とは
https://thinkit.co.jp/article/17349


































