batfishでコンフィグからネイバー機器を確認
logging.config.dictConfig()を使用してFilterを実装
はじめに
ログフィルターの実装はfileConfig()
では不可能でdictConfig()
では可能。
サンプルなどを探してはみたが自身の欲しかったものは見つからなかった。
だからまとめる。
ログフィルター
loggingでは出力するログメッセージはlogging.LogRecord
オブジェクトに格納されLogger間でやり取りされている。
Loggerが受け取ったLogRecordを出力するか否かを判断するために使用するものがログフィルター
HandlerやFormatterにはある程度テンプレートのようなクラスが存在したがFilterには存在せず、条件の記述がユーザー独自に柔軟にカスタマイズできるようになっている。 それゆえにサンプルコードもあまり落ちていない気がする。
要するに以下みたいなことができる
- メッセージ内に
password
が入っているからこのログはドロップする - INFOだけ出力し、それ以外(DEBUG,ERROR...)はドロップする
- 特定の時間に出力されたメッセージのみ出力する(こんな使い道は存在するのか不明だが可能)
やりたいこと
- loggingの設定記述を外部ファイルにまとめる
- main.pyの宣言部分をなるべく簡素にする
- メッセージ内に特定のメッセージが含まれる場合はメッセージにモザイクをかける
- フィルタリングする特定のメッセージは外部ファイルで複数定義できる
- 複数ファイル間で同一の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の設定記述を外部ファイルにまとめる
- JSONやYAMLなど好きな形式で外部ファイルに保存する(上記の例ではlogging.json)
- プログラム内では設定ファイルを辞書化してそれを
logging.config.dictConfig()
に渡す。
2. main.pyの宣言部分をなるべく簡素にする
- 別ファイルで定義(mylogging.py)
3. メッセージ内に特定のメッセージが含まれる場合はメッセージにモザイクをかける
logging.json
- dict["handlers"]["filters"]要素の追加
- 指定のHandlerに適用するFilterを配列で指定
- dict["filters"][<FILTER_NAME>]要素を追加
"()"
: ユーザ定義FilterClassを格納。別ファイルでは格納不可なので入れ物だけ定義
- dict["handlers"]["filters"]要素の追加
mylogging.setLoggerConfig()
- ユーザ定義FlterClassの作成
logging.Filter
を継承(推奨※filter()
さえちゃんとしてれば動くらしい)filter()
関数を定義(必須)- 引数は
logging.LogRecord
インスタンスを一つとる - 返り値はbooleanとし、Trueであれば出力、Falseであればドロップ
- 条件を自由に記述
- 引数は
- 設定格納辞書にユーザ定義FilterClassを登録
dict["filters"][<FILTER_NAME>]["()"]
の値に作成したユーザ定義FilterClassを代入
- ユーザ定義FlterClassの作成
4. フィルタリングする特定のメッセージは外部ファイルで複数定義できる
logging.json
- dict["filters"][<FILTER_NAME>]["words"]要素を追加
"()"
に格納されるユーザ定義FlterClassの__init__
に渡す引数。例ではwords
としたが__init__
の引数と一致すれば組み合わせは自由
- dict["filters"][<FILTER_NAME>]["words"]要素を追加
mylogging.setLoggerConfig()
- ユーザ定義FlterClassの編集
__init__
を実装する- 引数はキーワード引数とし、
dict["filters"][<FILTER_NAME>]
配下の"()"
以外のすべてが渡される
- 引数はキーワード引数とし、
- ユーザ定義FlterClassの編集
5. 複数ファイル間で同一のlogging設定を有効にする
main.py
- 他モジュールのimport位置を
logging.config.dictConfig()
以降にする
- 他モジュールのimport位置を
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")
orlogging.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]
- keys: 作成するLoggerインスタンス名を記述
[handlers]
- keys: 作成するHandlerインスタンス名を記述
[formatters]
- keys: 作成するFormatterインスタンス名を記述
[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コンテナ
アップデート実行
Gemfileを更新する
- gem 'rails', '~> 5.0.0', '>= 5.0.0.1' + gem 'rails', '5.2.0'
railsをアップデートする
docker-compose run web bundle update rails
Dockerイメージのリビルド
docker-compose build
バージョン差分修正
version5.2より削除された設定の削除
config/initializers/new_framework_default.rb
から該当箇所を削除- ActiveSupport.halt_callback_chains_on_return_false = false + # ActiveSupport.halt_callback_chains_on_return_false = false
form_with
ヘルパーの実装form_with
ヘルパーの使用が推奨されているらしいので変更する 参考ページに従って編集 要約すると今まで用途によって使い分けていたform_for
ヘルパーとform_tag
ヘルパーのどちらにも対応したform_with
ヘルパーができましたよというお話。外部キー制約のデフォルト値の変更 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
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 mounttmpfs
: 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)の切り替えを行うための環境変数一覧を表示するdocker-machine ssh <DockerHost>
DockerHostへSSH接続をするdocker-machine ip <DockerHost>
DockerHostのIPアドレスを表示するDockerHost on AWS
docker-machine create --driver amazonec2 <DockerHost>
認証情報は事前に~/.aws/credentials
設定されていること(オプション指定も可)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
Created
orcreated
コンテナが作成された状態Up
orrunning
コンテナが起動している状態Up (Paused)
orpaused
コンテナが一時停止された状態restarting
コンテナが再起動中の状態Exited
orexited
コンテナの動作が終了し、停止している状態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へのコネクトをすべて解除する必要あり
- bridge driver
MultiHostNetwork
- StandAloneSwarm
- キーバリューストアが必要(サービスディスカバリ)
DockerDataManagement
- Volume
- DockerHost上の
/var/lib/docker/volumes
が作成されコンテナ内に任意のディレクトリにマウントされる - 複数のコンテナで同一のVolumeを参照することができる
- DockerHost上の
- bind mount
- Host上のディレクトリやファイルをコンテナにマウントすることができる
- tmpfs
- Hostのメモリ上にデータを置き、コンテナにマウントすることができる
DockerCompose
ymlファイルに設定を記述することでアプリケーション環境を一度に起動する