BUNSEN

個人的な学習ログ

logging.config.dictConfig()を使用してFilterを実装

はじめに

ログフィルターの実装はfileConfig()では不可能でdictConfig()では可能。

サンプルなどを探してはみたが自身の欲しかったものは見つからなかった。

だからまとめる。

ログフィルター

loggingでは出力するログメッセージはlogging.LogRecordオブジェクトに格納されLogger間でやり取りされている。

Loggerが受け取ったLogRecordを出力するか否かを判断するために使用するものがログフィルター

HandlerやFormatterにはある程度テンプレートのようなクラスが存在したがFilterには存在せず、条件の記述がユーザー独自に柔軟にカスタマイズできるようになっている。 それゆえにサンプルコードもあまり落ちていない気がする。

要するに以下みたいなことができる

  • メッセージ内にpasswordが入っているからこのログはドロップする
  • INFOだけ出力し、それ以外(DEBUG,ERROR...)はドロップする
  • 特定の時間に出力されたメッセージのみ出力する(こんな使い道は存在するのか不明だが可能)

やりたいこと

  1. loggingの設定記述を外部ファイルにまとめる
  2. main.pyの宣言部分をなるべく簡素にする
  3. メッセージ内に特定のメッセージが含まれる場合はメッセージにモザイクをかける
  4. フィルタリングする特定のメッセージは外部ファイルで複数定義できる
  5. 複数ファイル間で同一のlogging設定を有効にする

構成

├main.py
├mylogging.py # Logger設定実行ファイル
├account.py # クラス定義ファイル
└logging.json # Logger設定ファイル

実行結果

> python .\main.py
[DEBUG]account -> account has been imported
[DEBUG]__main__ -> default id:example
[DEBUG]__main__ -> Filterd: password
[DEBUG]account.GoogleAccount -> id:example@gmail.com
[DEBUG]account.GoogleAccount -> Filterd: password
[DEBUG]account.YahooAccount -> id:example@yahoo.com
[DEBUG]account.YahooAccount -> Filterd: password
[DEBUG]__main__ -> accounts initialize finish
[DEBUG]__main__ -> Filterd: secret

main.py

import mylogging
from logging import getLogger

mylogging.setLoggerConfig("./logging.json")
logger = getLogger(__name__)

import account

def main():
    username = "example"
    password = "P@ssw0rd"

    logger.debug("default id:" + username)
    logger.debug("default password:" + password)

    google = account.GoogleAccount(username, password)
    yahoo = account.YahooAccount(username, password)

    logger.debug("accounts initialize finish")
    logger.debug("secret word!")
    

if __name__ == "__main__":
    main()

mylogging.py

def setLoggerConfig(file_path):
    from json import load
    from logging import config, Filter
    
    class MyFilter(Filter):
        def __init__(self, words=None):
            if not isinstance(words, list):
                words = None
            self.words = words

        def filter(self, record):
            if self.words is not None:
                for word in self.words:
                    if word in record.msg:
                        record.msg = "Filterd: " + word
                        break
            return True

    with open(file_path, "r", encoding="utf-8") as f:
        log_conf_dic = load(f)
    
    log_conf_dic["filters"]["filterExample"]["()"] = MyFilter

    config.dictConfig(log_conf_dic)

account.py

from logging import getLogger

logger = getLogger(__name__)
logger.debug("account has been imported")

class Credential(object):
    domain = ""
    def __init__(self, username, password):
        self.logger = logger.getChild(self.__class__.__name__)

        self.username = username + "@" + self.domain
        self.password = password

        self.logger.debug("id:" + self.username)
        self.logger.debug("password:" + self.password)

class GoogleAccount(Credential):
    domain = "gmail.com"
    pass

class YahooAccount(Credential):
    domain = "yahoo.com"
    pass

logging.json

{
  "version": 1,
  "disable_existing_loggers": false,
  "root": {
    "level": "DEBUG",
    "handlers": [
      "consoleHandler"
    ]
  },
  "handlers": {
    "consoleHandler": {
      "class": "logging.StreamHandler",
      "level": "DEBUG",
      "formatter": "simpleFormatter",
      "filters": [
        "filterExample"
      ],
      "stream": "ext://sys.stdout"
    }
  },
  "formatters": {
    "simpleFormatter": {
      "format": "[%(levelname)s]%(name)s -> %(message)s"
    }
  },
  "filters": {
    "filterExample": {
      "()": "",
      "words": [
        "password",
        "secret"
      ]
    }
  }
}

解説

上のほうに書いたやりたいことリストをもとに解説

1. loggingの設定記述を外部ファイルにまとめる

  • JSONYAMLなど好きな形式で外部ファイルに保存する(上記の例ではlogging.json)
  • プログラム内では設定ファイルを辞書化してそれをlogging.config.dictConfig()に渡す。

2. main.pyの宣言部分をなるべく簡素にする

  • 別ファイルで定義(mylogging.py)

3. メッセージ内に特定のメッセージが含まれる場合はメッセージにモザイクをかける

  • logging.json

    • dict["handlers"]["filters"]要素の追加
      • 指定のHandlerに適用するFilterを配列で指定
    • dict["filters"][<FILTER_NAME>]要素を追加
      • "()": ユーザ定義FilterClassを格納。別ファイルでは格納不可なので入れ物だけ定義
  • mylogging.setLoggerConfig()

    • ユーザ定義FlterClassの作成
      • logging.Filterを継承(推奨※filter()さえちゃんとしてれば動くらしい)
      • filter()関数を定義(必須)
        • 引数はlogging.LogRecordインスタンスを一つとる
        • 返り値はbooleanとし、Trueであれば出力、Falseであればドロップ
        • 条件を自由に記述
    • 設定格納辞書にユーザ定義FilterClassを登録
      • dict["filters"][<FILTER_NAME>]["()"]の値に作成したユーザ定義FilterClassを代入

4. フィルタリングする特定のメッセージは外部ファイルで複数定義できる

  • logging.json
    • dict["filters"][<FILTER_NAME>]["words"]要素を追加
      • "()"に格納されるユーザ定義FlterClassの__init__に渡す引数。例ではwordsとしたが__init__の引数と一致すれば組み合わせは自由
  • mylogging.setLoggerConfig()
    • ユーザ定義FlterClassの編集
      • __init__を実装する
        • 引数はキーワード引数とし、dict["filters"][<FILTER_NAME>]配下の"()"以外のすべてが渡される

5. 複数ファイル間で同一のlogging設定を有効にする

  • main.py
    • 他モジュールのimport位置をlogging.config.dictConfig()以降にする
  • account.py
    • あまりやりたいことと関係ないけど子Loggerを作成したりしてる

logging.config.dictConfig()についてまとめる

概要

log出せ、指定の形式でだせ、ファイルに保存しろ、コンソールにも出力しろ。

logging.config.fileConfigにて対応しようと一所懸命に頑張ってみました。しかし、どうもFilterの設定はfileConfigでは不可能らしいのです。

ということでdictConfigについてまとめます。

Loggerの基本

過去記事こちらを参照してください

注意事項

※Filterに関する記述は別記事でまとめます。(量が多くなりそうだから)※

dictConfigは引数に辞書を取り、その内容をもとにLoggerへ設定を入れていきます。

引数に使用する辞書変数はその場で定義することも可能ですが、私が個人的に設定を別ファイルに置くことがきれいだと考えているので別ファイルに保存しています。

以降で使用している別ファイルのサンプルはJSON形式で書かれていますが、最終的に辞書型に変換することが可能な形式でしたらなんでも可能です。

dictConfig()使用方法

gist605edf7e84fc87286084ff6892f51685

dictConfig() 設定ファイル書式

以下の例では、これらの設定をしている

  • rootLogger
    • logFileHandler: Debug以上をファイルに書き出し
    • consoleHandler: Info以上を標準出力に書き出し

gist4252d26a4c244e84556ca2a1fd1287a0

内容的に以前の記事で書いたfileConfig()とさほど変わらないので差分だけ。

dict["version"]

現在指定できる値は1のみ。今後のバージョンアップ時の後方互換性確保のための項目。

dict["disable_existing_loggers"]

booleanで指定する。 dictConfig()実行時にすでに存在するLoggerと同名のLoggerを設定しようとした際の挙動を指定する。

  • True: 既存のLoggerと同名の新規Loggerを使用不可にする。
  • False: 既存のLoggerを上書きして新規Loggerとして使用可能にする。

dict["handlers"][**]["class"]

fileConfig()の際はStreamHandlerのようにクラス名のみでよかったがdictConfig()ではlogging.StreamHandlerのようにloggingから指定する必要がある。

dict["handlers"][**][xx]

class,formatter,level以外の要素について(Handlerクラスの初期化引数)

fileConfig()の際は、tuple形式であったため位置引数として渡していたが、dictConfig()ではtuple廃止に伴いすべてキーワード引数で渡す。(※class要素と同じ階層にいることに注意)

dict["handlers"][**]["stream"]

StreamHandlerクラスの初期化引数

この要素では値に外部オブジェクトを指定する必要があります。 外部オブジェクトをファイル経由で指定する際、入力されている値が文字リテラル、またはオブジェクトなのか判断するためext://を文字列の先頭に付加する。

logging.config.fileConfig()についてまとめる

概要

log出せ、指定の形式でだせ、ファイルに保存しろ、コンソールにも出力しろ。

そんな時に出会ったloggingモジュール、今まで設定をちまちま毎回書いていてめんどくさいなと感じていた。 たがファイルに設定を記述しておくだけで読み込んでloggerを初期化してくれる便利な機能があるらしい!そんなfileConfigについて調べたところどうも覚えることは難しそう。

だからまとめる。

Logger の構造

PythonのLoggerの構造は以下のようになっている

    root
    ├───────────────────┐
    user1               user2
    ├─────────┐         ├─────────┐
    user1_1   user1_2   user2_1   user_2_2

rootのみがデフォルトで作成されており、logging.info()logging.error()などのlogging直下のコマンドを使用すると参照される。 また、logging.getLogger()で引数なしまたはrootを引数にするとrootLoggerが返却される

rootLogger以外はすべてユーザが定義する必要がある。

e.g.)

  • user1:logging.getLogger("user1")
  • user1_1: logging.getLogger("user1.user1_1") or logging.getLogger("user1").getChild("user1_1")

ちなみにLogger間のLogメッセージの遷移は以下のようになっている。 それぞれのLoggerの設定に従い処理をした後に上位のLoggerにLogメッセージを伝搬する。

log_message > user1_1 > user1 > root
              ↓output   ↓output ↓output

Logger の設定

Loggerを設定するにはHandlerやFormatter、Filterなどを定義し、Loggerオブジェクトに投入する必要がある。

しかし、その設定は長くなりプログラムファイル上部を大きく占めてしまう。

これらの設定を別ファイルに保存し、プログラムファイル自体を簡潔にするのがlogging.config.fileConfig()である。

fileConfig()使用方法

  • 1ファイル単体でのみLoggerを使用する場合

    • main.py

      from logging import getLogger, config
      
      config.fileConfig('./config/logging.conf')
      logger = getLogger(__name__)
      
      logger.info("this is a information message.")
      
  • 複数ファイルで設定を共有する場合(特別異なることはないがimportの順番で詰まった)

    • main.py

      from logging import getLogger, config
      
      config.fileConfig('./config/logging.conf')
      logger = getLogger(__name__)
      
      import child
      
      logger.info("this message from main.py")
      
    • child.py

      from logging import getLogger
      
      logger = getLogger(__name__)
      
      logger.info("this message from child.py")
      

fileConfig() 設定ファイル書式

以下の例では、これらの設定をしている

  • rootLogger
    • logFileHandler: Debug以上をファイルに書き出し
    • consoleHandler: Info以上を標準出力に書き出し
[loggers]
keys=root

[handlers]
keys=logFileHandler,consoleHandler

[formatters]
keys=logFileFormatter,consoleFormatter

[logger_root]
level=DEBUG
handlers=logFileHandler,consoleHandler

[handler_logFileHandler]
class=FileHandler
level=DEBUG
formatter=logFileFormatter
args=("./log/app.log", "w", "utf-8")

[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=consoleFormatter
args=(sys.stdout,)

[formatter_logFileFormatter]
format=%(asctime)s|%(levelname)-8s|%(name)s|%(funcName)s|%(message)s

[formatter_consoleFormatter]
format=[%(levelname)-8s]%(funcName)s - %(message)s

[loggers]

[handlers]

[formatters]

[loger_<logger_name>]

  • level: メッセージを出力する最低レベルを指定する。Handlerに渡す前に処理されるので注意。
  • handlers: 適用するHandlerインスタンス名を指定する

[hander_<handler_name>]

  • class:実装するHandlerクラスを指定する
    • StreamHandler: メッセージを指定されたストリームに出力する。
    • FileHandler: メッセージを指定されたファイルに出力する。
  • level: 指定されたレベル以上のメッセージのみが出力される。
  • formatter: 出力時のメッセージ成型に使用するFormatter名を指定する。
  • args: Handlerクラスをインスタンス化する際に使用する引数。Handlerクラスの公式ドキュメントを参照すること。

    ※tuple形式で渡すので引数のキーワード指定は使用不可、位置指定で渡す。

    ※tuple形式で渡すので引数が1つの場合は,を忘れないこと

[formatter_<formatter_name>]

  • format: 使いそうなもののみ抜粋。詳細はこちらまで
書式 説明
%(asctime)s ログ生成日時 "yyyy-mm-dd HH:MM:SS,sss"
%(filename)s 呼び出し元ファイル名
%(funcName)s 呼び出し元関数名
%(levelname)s ログレベル ('DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL')
%(lineno)d 呼び出し元ファイル内の行番号
%(message)s 呼び出し時に引数で指定した値logger.info("ここ")
%(module)s 呼び出し元モジュール名
%(name)s 使用されたlogger名

注意事項

fileConfig()ではFilterの項目は設定できない。

使用したい場合はdictConfig()を使用しろと公式にあったので合わせて参照してほしい。

rails のバージョンアップする(5.0 -> 5.2)

概要

とある学習コンテンツを使用してrailsについて学習し、一通り終了したところでrailsをバージョンアップしてみた。 いろいろと修正すべきところがあったのでそれについて残してみる。 railsはDockerコンテナ上に立っているため使用したコマンドをすべてDocker経由のもの。 railsサーバのローカルでコマンドを使用する場合はdocker-compose *** webを排除すれば使用できると思われる。(未検証)

環境

Docker for Windows 上の railsコンテナ

アップデート実行

  1. Gemfileを更新する

     - gem 'rails', '~> 5.0.0', '>= 5.0.0.1'
     + gem 'rails', '5.2.0'
    
  2. railsをアップデートする

     docker-compose run web bundle update rails
    
  3. Dockerイメージのリビルド

     docker-compose build
    

バージョン差分修正

  1. version5.2より削除された設定の削除 config/initializers/new_framework_default.rbから該当箇所を削除

     - ActiveSupport.halt_callback_chains_on_return_false = false
     + # ActiveSupport.halt_callback_chains_on_return_false = false
    
  2. form_withヘルパーの実装 form_withヘルパーの使用が推奨されているらしいので変更する 参考ページに従って編集 要約すると今まで用途によって使い分けていたform_forヘルパーとform_tagヘルパーのどちらにも対応したform_withヘルパーができましたよというお話。

  3. 外部キー制約のデフォルト値の変更 version5.1からの変更だそうです。 参照元DBで生成される外部キー制約のデフォルトの型がint->bigintに変更になっています。以下のいずれかの対応が必要になる。

    • 参照先DBのキーカラムのタイプをbigintにする

        + t.string :member_id, type: :bigint
      
    • 参照元DBの外部キーのタイプをintにする

        - t.references :member, foreign_key: true
        + t.references :member, foreign_key: true, type: :integer
      
  4. redirect_to :back廃止 前のページに戻るのに使用していたリダイレクト文ですが廃止されてしまったようです。

     - redirect_to :back
     + redirect_back(fallback_location: :me)
    

    flash を使用していた場合は

     - redirect_to :back, flash {
     -   member: @member,
     -   messages: @member.error.messages
     - }
     + redirect_back(fallback_location: new_member_path, flash: {
     +     member: @member,
     +     messages: @member.error.messages
     + }
    

Dockerチートシート

概要

Dockerについて勉強しましたが、コマンド多くてなかなか覚えられない。そんな私のためによく使用しそうなコマンドをかき出しました。

Dockerコマンド一覧

docker

for docker images

  • docker run <DockerImage> [<command> [<command option>]] pull->create->startを実行
    • --name <container name>: 任意のコンテナ名でImageを起動する
    • -p <host port>:<container port>: コンテナのポートとホストマシンのポートどこにホスティングするか指定する
    • -d: dettachモードで起動する。コンテナの動作をバックグラウンドで実行する。主にデーモンプログラムをコンテナで起動する際に指定する。
    • -i: コンテナの標準入力を取得し、双方向に操作できるようにする
    • -t: コンテナ内にホストをttyとして設定する(ホストを入出力用の実端末として登録する)
    • --rm: コンテナが停止した時点で自動的に削除される
    • <command>,<command option>: 指定した場合、コンテナ起動後にコンテナ上で実行される
    • --link <DockerContainer>:<alias>: 作成されるコンテナからAliasで別コンテナへの通信経路が確立される。※レガシー機能のため削除される予定
    • --network <dockerhost network name>: 作成時点で指定したDockerNetworkのみに接続される(デフォルトはbridge)
    • -h <container host name>: 作成されるコンテナのホスト名を指定する
    • --mount src=<src>,dst=<dst>[,type=<type>][,tmpfs-size=<memory size>][,tmpfs-mode=<tmpfs mode>][,<option>]
      • <src>: <dockerhost volume name>or<dockerhost dir path>or<dockerhost file path>
      • <dst>: <container dir path>or<container file path>
      • <type>: 使用するマウントタイプを指定する
        • bind: bind mount
        • tmpfs: tmpfs
      • <memory size>: tmpfsでマウントする場合に使用するために確保するメモリの上限
      • <tmpfs mode>: ファイルモードを設定する
      • <option>
        • readonly: read-only
  • docker pull <DockerImage> DockerImageの取得(未ダウンロードの場合はDocker Hub上からダウンロード)
  • docker push <DockerImage> レジストリサーバへDockerImageを登録する
  • docker create <DockerImage> Dockerコンテナの作成
  • docker images ローカルのDockerImage情報を表示する
  • docker tag <DockerImage> <DockerImageAlias> 取得済みのDockerImageのAliasを作成する
  • docker inspect (<docker image name> | <docker image id>) DockerImageの詳細情報を表示する
  • docker rmi <DockerImage> 削除時に対象Imageを使用したコンテナが起動中の場合はコンテナを終了する必要がある
    • -f: コンテナが存在する状態であっても強制的にImageを削除する
  • docker buid [option] <build context> DockerFileからDockerImageを作成する <build context>で指定されたディレクトリ上のファイルがすべてDockerデーモンに送信され、そこにあるDockerFileでビルドされる
    • -t <docker image name>: 作成するImageの名前を付ける
    • --no-cache: ビルドキャッシュが存在する場合でも強制的に再ビルドする

for docker containers

  • docker start <DockerContainer> Dockerコンテナの起動
  • docker stop <DockerContainer> Dockerコンテナの停止
  • docker pause <DockerContainer> Dockerコンテナの一時停止
  • docker unpause <DockerContainer> Dockerコンテナの一時停止解除
  • docker restart <DockerContainer> Dockerコンテナの再起動
  • docker rm <DockerContainer> 停止状態のDockerコンテナの削除
    • -f: 停止状態以外でも強制的に削除(一度停止状態に変更してから)
  • docker ps ステータスがRunningのDockerコンテナ一覧表示
    • -a: その他ステータスのコンテナを含めて表示
  • docker cp <src file path> <DockerContainer>:<dst file path> ホスト上のファイルをコンテナ上に転送する
  • docker cp <DockerContainer>:<src file path> <dst file path> コンテナ上のファイルをホスト上に転送する
  • docker inspect <DockerContainer> コンテナの詳細情報を表示
  • docker attach <DockerContainer> コンテナのPID1の標準入出力に接続 exitで抜けるとPID1のプロセスも終了し、コンテナが終了する Ctrl+P->Ctrl+Qで抜けることができるが、コンテナ起動時に-itオプションを指定していない場合は使用不可
  • docker exec <DockerContainer> <command> コンテナ内で任意のコマンドを実行することができる exitで抜ける
    • -i: コンテナの標準入力を取得し、双方向に操作できるようにする
    • -t: コンテナ内にホストをttyとして設定する(ホストを入出力用の実端末として登録する)
    • docker exec -it <DockerContainer> /bin/bashで任意のコンテナの標準入出力をマウントできる

for docker networks

  • docker network ls DockerHostの構成するネットワークの一覧を表示する
  • docker network inspect <dockerhost network name> DockerNetworkの詳細情報を表示する
  • docker network create <dockerhost network name> ユーザ定義のBridgeNetworkを作成する
    • --driver <network type>: 作成されるネットワークの種別を指定する
  • docker network connect <dockerhost network name> <DockerContainer> コンテナをDockerNetworkに接続する
  • docker network disconnect <dockerhost network name> <DockerContaier> コンテナをDockerNetworkから外す

for docker volunes

  • docker volume create <dockerhost volume name> DockerHost上にDockerVolumeを作成する
  • docker volume ls DockerHost上のDockerVolumeの一覧を表示する
  • docker volume inspect <dockerhost volume name> DockerVolumeの詳細情報を表示する
  • docker volume rm <dockerhost volume name> DockerVolumeを削除する

for docker swarm

  • docker swarm init 現在のDockerHostをMasterとするDocker Swarmを初期構築する
    • --advertise-addr <docker host ip address>: 指定したアドレスをSwarmに参加するDockerHostへ通知する
  • docker swarm join-token (manager | worker) DockerSwarmに参加するためのコマンドを表示する(only manager node)
  • docker node ls DockerSwarmに参加しているDockerHostの一覧を表示する(only manager node)
  • docker service create <DockerImage> DockerSwarmで稼働するServiceを生成する
    • --replicas <number>: 生成するタスクの数を指定する
    • -d: detachモードでコンテナを起動
    • --name <container name>: コンテナの名称
    • -p <host port>:<container port>: コンテナのポートとホストマシンのポートどこにホスティングするか指定する
    • --constraint <condition>: タスクを起動するNodeの条件を指定する
  • docker service update <service name> Serviceの情報を変更する
    • -d: detach
    • --XXX-add <value>: 設定の追加
    • --XXX-rm <value>: 設定の削除
  • docker service rollback <service name> Serviceの変更を一つ前の状態に戻す(2回連続で実行するとrollbackの取り消しになる)
    • -d: detach
  • docker service ps <service name> サービスにおけるタスクの状況を表示
  • docker service ls DockerSwarm上で稼働しているService一覧を表示する
  • docker service inspect <service name> Service の情報を詳細に表示
    • --pretty: 表示を見やすくする
  • docker service rm <service name> Service を削除する

for others

  • docker login [<hosting site>] レジストリサーバへログインする <hosting site>が省略された場合は、DockerHubが指定される
  • docker commit <DockerContainer> <DockerImage> コンテナの状態をイメージ化する ※DockerImage内にコンテナの操作履歴は残らないため透明性が低いDockerImageが完成する。

docker-machine

General

  • docker-machine ls DockerHostの一覧を表示する
  • docker-machine create <DockerHost> DockerHostの作成
    • --driver <hosted hypervisor>: 使用する仮想化ソフトウェアを指定する(default:virtualbox)
    • --swarm: SwarmClusterに追加する
    • --swarm-master: SwarmCluster内での役割をマスターに設定する
    • --swarm-discovery="<keyvalue store type>:<keyvalue store ip>:<keyvalue store connection port>": Swarmが使用するキーバリューストアの場所を指定する
    • --engine-opt="cluster-store=<keyvalue store type>:<keyvalue store ip>:<keyvalue store connection port>": オーバーレイネットワーク用にキーバリューストアの場所を指定する。DockerEngineがコンテナ・ネットワーク・ボリュームの情報を共有するのに使用する
    • --engine-opt="cluster-advertise=<dockerhost nwif>:<dockerhost port>": DockerHost間の通信に使用するNWIFとポートを指定する
  • docker-machine stop <DockerHost> DockerHostを停止する
  • docker-machine start <DockerHost> DockerHostを起動する
  • docker-machine env <DockerHost> dockerコマンドを実行するDockerHost(ActiveなDockerHost)の切り替えを行うための環境変数一覧を表示する
    • -u: DockerHostのActive解除用の環境変数一覧を表示する
    • --swarm: Dockerコマンドの情報がSwarmのみになるSwarmActive用環境変数一覧になる
    • | Invoke-Expression: 環境変数を一度に設定する
  • docker-machine ssh <DockerHost> DockerHostへSSH接続をする
  • docker-machine ip <DockerHost> DockerHostのIPアドレスを表示する

    DockerHost on AWS

  • docker-machine create --driver amazonec2 <DockerHost> 認証情報は事前に~/.aws/credentials設定されていること(オプション指定も可)
    • --amazonec2-open-port <port num>: EC2の公開するポートを指定
    • --amazonec2-region <aws region>: EC2の作成されるAWSリージョンを指定。東京リージョン:ap-noutheast-1
    • --amazonec2-access-key <aws access key>: AWSへのアクセスキーを指定する
    • --amazonec2-secret-key <aws secret key>: AWSへのシークレットキーを指定する

      DockerHost on GCP

  • docker-machine create --driver google 認証情報は事前にダウンロードし、GOOGLE_APPLICATION_CREDENTIALSに認証ファイルパスを指定する
    • --google-project <gcp project id>:
    • --google-zone <gcp region>: DockerHostが作成されるGCPのリージョンを指定。東京リージョン:asia-northeast1-a

docker-compose

  • docker-compose run <service name> [<command>] DockerComposeを起動する。初回ファイルの作成など一度だけの実行の場合に実行する。 <service name>docker-compose.ymlで定義したサービス名を記述する
  • docker-compose up DockerComposeを開始/再起動する
    • -d: デタッチモードで起動する
  • docker-compose build docker-composeに記述されているImageBuildを明示的に実行する。

Docker用語説明

DockerImage

<DockerImage> = [<repository name>/]<docker image name>[:<docker image tag>] * <repository name>を指定しない場合はDocker社の提供するオフィシャルレポジトリが参照される。 * <docker image tag>を指定しない場合は自動的にlatestが指定される。 * latestが最新版である保証はない * AUFSと呼ばれるファイルシステムをもとにコンテナに必要なファイルを積み上げたファイルシステム * DockerImageレイヤは読み取り専用 * コンテナレイヤのみ読み書き可能(コンテナ作成時またはコンテナからの操作によってDockerImageレイヤの上に積み上げられる) * 同一イメージを利用する複数のイメージがある場合は、同一のデータを参照するため合計データ量が削減される

DockerContainer

<DockerContainer> = (<docker container name> | <docker container ID>) * <docker container name>docker runまたはdocker createコマンドで--nameオプションで指定した値 * <docker container ID>docker psコマンドで確認できる値

Status

  • Createdorcreated コンテナが作成された状態
  • Uporrunning コンテナが起動している状態
  • Up (Paused)orpaused コンテナが一時停止された状態
  • restarting コンテナが再起動中の状態
  • Exitedorexited コンテナの動作が終了し、停止している状態
  • removing コンテナ削除中の状態
  • dead コンテナの異常状態(削除するしかない)

DockerFile

  • DockerFile→DockerImageの作業をイメージビルドと呼ぶ
  • イメージビルドはDockerFileが更新されない限り再実行してもキャッシュが使用されてビルドされない

構文

  • FROM <DockerImage>
    • 作成するDockerImageの継承元DockerImageを指定する
  • RUN <command>
    • イメージビルド時に実行され、結果がDockerImage内に保存される
  • CMD <command>
    • docker create実行時にコンテナで実行される
  • COPY <host src path> <containers dst abs-path>
    • イメージビルド時にホスト上のファイルがDockerImage内に転送される
  • ENV <environmental variable name> <value>
    • 作成されたコンテナ上に環境変数を設定する
  • WORKDIR <path>

DockerHub

  • Docker社が提供する公式のImage公開サイト
  • Imageの登録・公開が可能

AutomatedBuild

  • Githubなどでビルドコンテキストを管理し、変更があるとDockerHubが自動的にビルドを行い、そのDockerImageをDockerHubに登録する

Docker Machine

  • DockerHostを管理するツール

DocekrHost

<DockerHost> = <docker host name> * <docker host name>は指定しないことも可能。その場合defaultというDockerHostを指定したことになる

  • DockerHostはDockerEngineを積んだ仮想マシンのこと
  • DockerHostの起動には仮想化ソフトウェアを利用する
  • DockerHostのOSはboot2docker軽量LinuxでDockerEngineのインストールが自動的に行われる
  • docker-machine env <DockerHost> | Invoke-Expressionを実行することでdockerコマンドの実行するDockerDeamonを指定したDockerHostのDockerDeamonに切り替えることが可能(Active化)
  • ActiveなDockerHostはdocker-machine ls*が付加されているDockerHost

BridgeNetwork

  • DockerHost内で構成されるネットワーク
    • bridge driver
      • 同一DockerHost上のコンテナ同士で通信することができる
      • ユーザ定義型の場合はネットワーク上にてDockerDNSの機能を提供し、コンテナ名にて通信を行うことが可能
      • 外部接続可能(コンテナのポートを開放する必要あり)
    • host driver
      • DockerHostと同じネットワーク設定を提供
      • コンテナのポート開放をしなくても接続できる
    • null driver
      • Loopbackインターフェースのみを提供する
      • その他NWへのコネクトをすべて解除する必要あり

MultiHostNetwork

  • StandAloneSwarm
    • キーバリューストアが必要(サービスディスカバリ)

DockerDataManagement

  • Volume
    • DockerHost上の/var/lib/docker/volumesが作成されコンテナ内に任意のディレクトリにマウントされる
    • 複数のコンテナで同一のVolumeを参照することができる
  • bind mount
    • Host上のディレクトリやファイルをコンテナにマウントすることができる
  • tmpfs
    • Hostのメモリ上にデータを置き、コンテナにマウントすることができる

DockerCompose

ymlファイルに設定を記述することでアプリケーション環境を一度に起動する