20200514のdockerに関する記事は20件です。

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.ymlinit.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でアプリケーションを作る②(準備中)」でまとめます。

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

vagrantのプラグイン

Vagrantのプラグインのインストールコマンド。
新しい端末を使うときくらいしか打たないのですぐに忘れてしまうので、今更メモ。

vagrant plugin install vagrant-vbguest
vagrant plugin install vagrant-docker-compose

インストールされているのを調べるのには list

vagrant plugin list

アップデートは update

vagrant plugin update

以上。

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

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

Gemfileを生成する為に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 ~/.gem
FROM: 親イメージの指定
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_app

docker-compose.ymlができたら再ビルド。

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

コンテナが起動し、さらに起動時にrailsも起動していることがわかる。

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

Minecraftをひらがな化する

漢字やカタカナが読めない子供でもMinecraftで遊べるようにUIを平仮名化しました。
平仮名勉強中の子供でも文字に興味を持ってくれるかなと思います。
リモートワークでの業務効率化に貢献すること間違いなしです。
対象はMinecraft Java Editionです。

概要

Minecraftのリソースパックという仕組みを利用して実現しています。
バニラ範囲の文字が概ね平仮名になります。
Minecraft本体に付属するリソースファイルをひらがなに変換しリソースパックを作成します。
リソースファイルの再配布にあたるかもしれずライセンス的に問題があるかもしれないので、リソースパックを作るツールとして実現しています。
生成されたリソースパックの取り扱いは自己責任でお願いします。

環境

  • ツール実行環境 (DockerMinecraftが必要です。)

    • 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より起動します。
(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.0

Windows 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.0

macOSでの実行:

# 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_VERSION Minecraft Java Editionのバージョンを指定します。
一度起動し、ダウンロードされている必要があります。
指定可能なバージョンは1.12,1.13,1.14,1.15,1.16の何れかです。
ボリューム /assets Minecraft Java Editionassetsフォルダをマウントします。
ボリューム /resourcepacks Minecraft Java Editionresourcepacksフォルダをマウントします。

出力

正常に完了すると、resourcepacksフォルダにリソースパックが出力されます。

リソースパックの使い方

Minecraft Java Editionresourcepacksフォルダにリソースパックを配置して、Minecraftを起動します。
その後、Minecraft内からリソースパックを指定します。
リソースパックのフォルダはデフォルトでは以下です。

resourcepacksフォルダ

OS Path
Windows c:/Users/[username]/AppData/Roaming/.minecraft/resourcepacks
macOS /Users/[username]/Library/Application Support/minecraft/resourcepacks

resourcepacksのフォルダに出来上がったリソースパックを配置します。
2020-05-04-20-55-03.png

Optionを押します。
2020-05-04-20-56-37.png

Resource Packsを押します。
2020-05-04-20-57-00.png

該当リソースパックのアイコンを押します。
2020-05-04-20-57-27.png

Doneを押します。
2020-05-04-20-57-51.png

かんりょうを押します。既に平仮名で表示されています。(hi_jpという言語を追加しています。)

2020-05-04-20-59-01.png

TOP画面も平仮名表示になりました。

2020-05-04-20-59-23.png

細かい話

どうやって実現できるか?

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_formatMinecraft 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/assets
Windows C:\Users\[Windowsのユーザー名]\AppData\Roaming\.minecraft\assets

assetsフォルダ配下は以下のような構成です。

複数バージョンをインストールしている場合、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
            },
            ~略~
         }
       }
    
    • objects/

      • [リソースのハッシュコード先頭2桁]/ icons/icon_16x16.pngでの例: bd
        • [ハッシュコードのファイル]

      icons/icon_16x16.pngでの例: bdf48ef6b5d0d23bbb02e17d04865216179f510a

      2020-05-03-10-51-13.png

参考 : Tutorials/Sound directory - Official Minecraft Wiki

Minecraftの言語リソースファイルはどのような形式になっているのか。

リソースのフォーマットはタイプごとに異なります。

言語ファイルは以下のような形式になります。1.121.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/8eedb38dbb5220be3d5aafc2135beb105548f5e1
addServer.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

参考:python 文字列変換【カタカナ⇔ひらがな】

リソース内の特殊な文字のあつかい

日本語→カタカナ→平仮名の変換をすると、おかしな文字になるものがありました。
これらを含むリソースは変換対象外としています。

うまく変換できたもの

パンチして木材を回収します -> ぱんちしてもくざいをかいしゅうします

木を探しましょう -> きをさがしましょう

マウスを使って視点移動します -> まうすをつかってしてんいどうします

周りを見渡しましょう -> まわりをみわたしましょう

インベントリを開きましょう -> いんべんとりをひらきましょう

木を倒しましょう -> きをたおしましょう

うまく変換できない:プレースホルダー%を持つも文字列

%s でジャンプします -> ぱーせんとs でじゃんぷします

%s、%s、%s、%s で移動します -> ぱーせんとs、ぱーせんとs、ぱーせんとs、ぱーせんとs でいどうします

%s を押します -> ぱーせんとs をおします

%s を長押しします -> ぱーせんとs をなげししします

最終的に以下のようなスクリプトになりました。

Minecraft 1.12 用 変換スクリプト

Minecraft 1.13 以降用 変換スクリプト

最後に

たまにおかしい翻訳がありますが、満足のいくものできました。
子供に村人ゾンビの卵どれ?とか聞かれることもなくなり、自然と平仮名の勉強もできています。
これでリモートワークの集中力も高くなり一石二鳥です。

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

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.yml
version: '2'
services:
  app:
    build: .
    volumes:
     - './deploy:/home/deploy'
    command: pip3.8 install -r /home/deploy/requirements.txt -t /home/deploy/dist

requirements.txtにはpsutilを書いてます。

※ちなみにディレクトリ構成はこんな感じ

.
├── docker-compose.yml
├── deploy
│   ├── requirements.txt
│   └── dist
└── Dockerfile

結論

こうやって落とした外部ライブラリとpythonのソースをzipで固めて、Lambdaにアップロードしたら正常にうごきました!
(外部ライブラリを使うときはランタイムと実行元のOSを使っておとした物を使わないといけないのが手間オブ手間s・・・)

以上!

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

[Docker] [drone] Drone基本安裝

目的

這是一次安裝經驗紀錄,當我們需要自己架設 CICD 環境時,我們挑選了Drone作為本次的安裝的對象

但因為他登入採用版本控款的第三方登入所以也需要搭配一個版本控管環境,我們就以Gitlab為例

預先準備環境:Docker

安裝Drone

1.設定Gitlab Application
callbackurl 依照你得drone版本不同可能要更改 新版的是用 /login, 舊版本可能要用 /authorize
drone1.png

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

3.登入drone

drone2.png

這樣就完成了,之後有空再補上drone 使用方式

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

Zabbix 5.0 を Docker Compose で起動する手順

これは何?

Zabbix はオープンソースで自由に使える監視ツールです。 Zabbix 公式 Docker イメージ を使い、Docker Compose で MySQL 等のデータベースを一括セットアップする手順をまとめました。

慣れれば Zabbix 5.0 の環境を 5 分程度でセットアップできるでしょう。

公式に Docker Compose 用 YAML ファイルが配布されているため、そちらを利用します。

image.png

背景は、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-compose

GitHub のリポジトリを clone して移動

git clone https://github.com/zabbix/zabbix-docker.git
cd zabbix-docker

設定ファイルの準備

今回は CentOS + Nginx + MySQL の組み合わせの Docker Compose ファイル を使用します。同ファイルには latestlocal がありますが、ここでは前者(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_1Exit 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アドレスまたはホスト名> を開きます。

image.png

デフォルトのユーザ情報 は、Username が Admin 、 Password が zabbix です。入力後、 Sign in をクリックします。

ログイン後、パスワードを変更します。

画面左下の User Settings をクリック → Change password をクリック → PasswordPassword (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 をクリックし 、 更新 をクリックします。

image.png

動作確認は左メニューの「監視データ」→「最新データ」をクリックします。Zabbix server から、各アイテムの値が取れています。グラフをクリックすると、リアルタイムに値が変わるのを確認できるでしょう。

image.png

そのあと、ダッシュボードに戻ると「障害」になっていますが、3分後に解消されます(デフォルトでは3分間)。

image.png

あとは色々触ってみましょう。リソース一覧グラフを見るには、「監視データ」→「ホスト」→「Zabbix server」をクリック→「グラフ」を選択が手っ取り早いです。

image.png

Enjoy!

参考

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

Kubernetes基礎:VM vs Container

VM vs Container

1. VMとContainer仮想化ソリューションの種類

vm_container.png
Containerを仮想化させてくれるソリューションの中ではDockerを最も多く使用している。

2. Container仮想化

vm_container2.png
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資源隔離技術

vm_container3.png
Dockerは、複数のContainer間でホストのリソースを分離して使えるようにしてくれる。
Linux技術の「cgroup」と「namespace」を使うことで可能になった。
・namespace:カーネルに関連した領域を分離をしてくれる。
・cgroup:リソースの領域を分離をしてくれる。

DockerのようなContainer仮想化ソリューションは、OSが提供するリソースの分離技術を利用してContainerという単位でサービスを分離できるようにしてくれる。
これを使うとContainer仮想化ソリューションがインストールされているOSでは、開発環境を気にせずにDeployが可能になる。

3. メリット&デメリット

vm_container4.png
処理速度
 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にも影響が及ぶ。

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

Kubernetes基礎(2):VM vs Container

VM vs Container

1. VMとContainer仮想化ソリューションの種類

vm_container.png
Containerを仮想化させてくれるソリューションの中ではDockerを最も多く使用している。

2. Container仮想化

vm_container2.png
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資源隔離技術

vm_container3.png
Dockerは、複数のContainer間でホストのリソースを分離して使えるようにしてくれる。
Linux技術の「cgroup」と「namespace」を使うことで可能になった。
・namespace:カーネルに関連した領域を分離をしてくれる。
・cgroup:リソースの領域を分離をしてくれる。

DockerのようなContainer仮想化ソリューションは、OSが提供するリソースの分離技術を利用してContainerという単位でサービスを分離できるようにしてくれる。
これを使うとContainer仮想化ソリューションがインストールされているOSでは、開発環境を気にせずにDeployが可能になる。

3. メリット&デメリット

vm_container4.png
処理速度
 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にも影響が及ぶ。

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

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=on

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

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

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=false

10080 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

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

Kubernetes基礎(1):Why Kubernetes

Kubernetes Introduction

1. Kubernetes関心度

最近5年間の傾向をみるとKubernetesの関心度が高まっていることがわかります。
kubernetes_trand.png

2. Kubernetes History

企業がKubernetesに注目している理由は、システムリソースを効率的に使う(=コスト削減)ことができるからです。
Kubernetesをもっとよく理解するには、仮想化技術の歴史を把握する必要があります。
kubernetes_history.png

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

why_kubernetes.png
As-is
 A、B、Cそれぞれのサービスを提供するためには9つのサーバーが必要になります。
 さらにサーバー障害等のことを考えると、BackUpとしても3つのサーバーが必要になります。

To-be
 A、B、Cの平均リソースを計算すると1日4つのサーバーと障害対応1つのサーバーが必要になります。
 ・Auto Scaling:trafficの状況によって自動にサービスにリソースを割り当ててくれる。
 ・Auto Healing:障害を起こしたサーバー上のサービスを自動に他のサーバーに移行してくれる。

Kubernetesは運用の自動化をサポートしています。
Kubernetesを使うと運用環境のメインテナンスが簡単にできるので、サービスの効率がよくなります。
サービスの効率向上のため、サーバーが少なくなるとメインテナンス費用の削減になり、大規模の運用環境こそ効果が多くなるので多くの企業がKubernetes環境への移行に興味を持ち始めています。

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

Kubernetes基礎:Why Kubernetes

Kubernetes Introduction

1. Kubernetes関心度

最近5年間の傾向をみるとKubernetesの関心度が高まっていることがわかる。
kubernetes_trand.png

2. Kubernetes History

企業がKubernetesに注目している理由は、システムリソースを効率的に使う(=コスト削減)ことができるからだ。Kubernetesをもっとよく理解するには、仮想化技術者の歴史を知る必要がある。
kubernetes_history.png

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

why_kubernetes.png
As-is
 A、B、Cそれぞれのサービスを提供するためには9つのサーバーが必要
 サーバー障害等のため、バックアップサーバーとして3つのサーバーが必要
To-be
 A、B、Cの平均リソースを計算すると1日4つのサーバーと障害対応1つのサーバーが必要
 ・Auto Scaling機能でトラピックの状況によって自動にサービスにリソースを割り当ててくれる
 ・Auto Healing機能で障害を起こしたサーバー上のサービスを自動に他のサーバーに移行してくれるため、バックアップサーバーは1台が必要

Kubernetesは色んな機能の運用自動化をサポートしている。
Kubernetesを使うと運用環境のメインテナンスが簡単にできるので、サービスの効率がよくなる。
サービスの効率によって、サーバーが少なくなるとメインテナンス費用の削減ができるし、大規模の運用環境こそ効果が多くなるから多くの企業がKubernetes環境への移行に興味を持ち始めている。

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

LaravelとVueでSPAを作るときにTypescriptとpugを使う設定をする

LaravelVue.jsTypescriptpugSPAを作ったときのメモ。

docker --version
Docker version 19.03.8, build afacb8b

扱ったDockerのバージョンは19.03.8。

Fig.1
project
├── 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 $_ ) 1docker-compose.yml, Dockerfile, .env ファイルを作成する( touch {docker-compose.yml,Dockerfile,.env} )。

この時点で Fig.2 の構成になる。

Fig.2
project_name
├── Dockerfile
├── docker-compose.yml
└── .env

各ファイルは以下の内容で書く。

docker-compose.yml

docker-compose.yml
version: '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/mysql

Dockerfile

Dockerfile
FROM 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

マルチステージビルド2Node.jsComposerDocker公式イメージ を利用する。

.env

.env
PROJECT=project_name
DB_USER=user_name
DB_PASSWORD=password
TZ=Asia/Tokyo

コンテナを起動

docker-compose up -d

この時点で Fig.1 の構成になる。

コンテナに入る

docker-compose exec web bash

コンテナの中ではcomposernpmが使える。

# composer --version
Composer version 1.10.6 2020-05-06 10:28:10

# node --version
v12.16.3

# npm --version
6.14.5

Laravelをインストール

# 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_HOSTdocker-compose.ymlservicesで設定したdbとする。
他の設定も .env で設定したものと同じ。

パッケージをインストール

# npm i
# npm i vue vue-router pug pug-plain-loader --save-dev  
# npm i -g typescript
# tsc --init

typescriptをグローバルにインストールするとtscコマンドが使えるようになり、

# tsc --version
Version 3.8.3

tsc --initとするとtsconfig.jsonが生成される。3
tsc --initgit init と混同して tsc init としないように注意。4

ファイルを編集

web/webpack.mix.js

webpack.mix.js
const 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.ts
import 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.jsweb/resources/ts/app.ts に書き換える。
ここで App.vuerouter.ts を読み込む。

web/resources/ts/App.vue

App.vue
<template lang="pug">
div
  main
    RouterView
</template>

ルートコンポーネント。
ここで Vue Router が提供する RouterView9 を使う。

web/resources/ts/router.ts

router.ts
import 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.ts
declare 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-poll

http://localhost:3000 にアクセスしてブラウザで確認する。

参考

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

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 pipefail

setでshellのオプションを色々設定しているらしい
[参考]https://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d

eオプションはエラーが発生したら中断
uオプションは未定義の変数をエラーにするもの
oオプションはpipefailとセットで使っていて、パイプの左側のコマンドが死んだときに止まってくれるというもの
https://qiita.com/progrhyme/items/6e522d83de3c94aadec9

if [ "${1#-}" != "$1" ]; then
    set -- wp "$@"
fi

これが全然わからなかったので実際に手元で動かして見ると以下のようなことがわかった。
${1#-}は引数の1番目の文字からハイフンを一つ取り除いたもの。例えば. hoge.sh -a testと実行したら${1#-}はaを返す。

なのでif文の意味は「ハイフンが付いていたら」という意味になる。わかりづれぇ。

set -- wp "$@"

これも全然わからなかった。
[参考]https://yash.osdn.jp/doc/ja/_set.html

Set コマンドにオペランドが与えられている場合またはオプションとオペランドを区切るハイフン二つ (--, コマンドの引数の構文参照) がコマンドライン引数に入っている場合は、現在の​位置パラメータは削除され、与えられたオペランドがそれぞれ新しく位置パラメータになります。ハイフン二つが与えられていてかつオペランドがない場合は位置パラメータはなくなります。

この文章を5分くらい見つめてようやく理解した。

つまり. hoge.sh -a testを実行すると$@-a testとなるが、 set -- wp "$@"を実行すると$@wp -a testとなるわけだ。

wpコマンドそのものに対してオプションを与えたい場合を想定していて、その他は普通にDockerfileのCMDコマンドを受け取っているのだな、と理解した。

たったこれだけの話なのに理解するのにものすごい時間を要してしまったので記録として残しておきます。

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

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)」を選択します。

screencapture-hub-docker-search-2020-05-01-18_39_06.png

「Start 1 Month Trial」ボタンをクリックすると、ユーザ情報を入力する画面に遷移するので、必要情報を入力します。

screencapture-hub-docker-editions-enterprise-docker-ee-server-ubuntu-2020-05-01-18_40_33.png

その後、サブスクリプション情報などを確認できるページに遷移します。

screencapture-hub-docker-u-cyberblack-content-sub-69f12d40-35d8-44e6-ae75-640b618b3867-2020-05-07-10_23_21.png

ライセンスファイルは、Universal Control Plane(UCP)インストール後に必要となるので、ダウンロードしておきます。

「License Key」をクリックします。

screencapture-hub-docker-u-cyberblack-content-sub-69f12d40-35d8-44e6-ae75-640b618b3867-2020-05-07-15_17_02.png

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

2.パッケージのインストール

$ 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で確認できます。

image.png

Dockerのバージョンの環境変数を作成します。

$ DOCKER_EE_VERSION=19.03

4.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... Done

6.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... Done

Docker 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:        fec3683

sudoなしでdockerコマンドを実行する場合は、以下コマンドを実行して、再ログインします。

$ sudo usermod -aG docker $USER
$ exit

2.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 Completed

8.UCPアクセス

ブラウザを起動して、インスタンスの外部IPアドレスにアクセスして、インストール時に設定した、UsernameとPasswordでログインします。

screencapture-34-84-168-193-login-2020-05-07-15_06_45.png

「Upload License」ボタンをクリックして、事前にダウンロードしたライセンスファイルを選択します。

screencapture-34-84-168-193-login-2020-05-07-15_09_37.png

ログイン完了となります。

screencapture-34-84-168-193-manage-dashboard-2020-05-07-15_19_30.png

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

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 を設定してやります。

Dockerfile
FROM 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 には pythonaws も入ってないけど、ちゃんと動いてますね。

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

ビルド

Dockerfile
FROM redis:5 as redis

FROM ubuntu:20.04

COPY --from=redis /usr/local/bin/redis-cli /usr/local/bin/redis-cli
bash
[ホスト側]$ 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

おわり。

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

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

これで完了。めっちゃ簡単だね!!!

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

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/91311

lvh.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 1110ad01

docker-compose.ymlを作成

docker-compose.yml
version: '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 ps

image確認

$ 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 AWS

AWS ECS の利用

Amazon ECSの主な機能と使い方
WordPressをAWSのDockerで公開
Docker環境をAWS ECSでデプロイするまで
AWS ECSでDockerコンテナ管理入門
CodePipelineからECSにBlue/Greenデプロイする

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

【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

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