Docker 小ネタ集(殴り書き)
cgroup v2 で使用できるコントローラ
- cpu
CPU 時間の割り当てやスケジューリングを行う - cpuset
プロセスが稼働する CPU コアの割り当て配置を設定する - device
デバイスへのアクセス制御を設定する - freezer
プロセスの一時停止,再開を制御する - hugetlb
サイズの大きい仮想メモリページを利用可能にする - io
ブロックデバイスの入出力を制御する - memory
メモリ使用量の制限,メモリ不足の制御をおこなう(OOM) - misc
特定の cgroup 内で利用できるリソース数を制限する - perf_event
性能情報の収集と分析を行う Perf 使用時のプロセス関連のイベントを取得する - pids
リソースの制限到達時のタスクの生成やクローンの停止を制御する - rdma
RDMA/IB デバイスに対するリソース制御とアカウンティングを調整する
Docker の導入を検討する場合の主なチェックポイント
- そもそも Docker が自社に必要なのか
- 既存の仮想環境における課題は何か
- 既存の仮想環境をコンテナ型環境に置き換えることは可能か
- 自社へ Docker を適用する際の最大の障害は何か
- 現在のシステムのどの部分に Docker を採用するのか
- 物理環境の高可用性に関する SLA を Docker でも実現できそうか
Docker 導入決定後,サーバOS選定における主なチェックポイント
- Docker を稼働させる OS 環境は,コミュニティ版の Linux でよいのか?商用版の Linux にすべきか?
- コミュニティ版 OS を採用する場合,どのディストリビューションを採用するのか
- 商用 Linux の場合,どのディストリビューションを採用するのか
- OS と Docker の保守サポートは同時に受けられるか
- 保守サポートが受けられない場合,問題の切り分け作業を自社で行えるか
OS インストール手順後に /dev/sdb を xfs で使用する方法
ディスク交換とかで自動的に xfs フォーマットされない場合などは自分でパーティション設定する必要がある。
- GPT パーティション作成
# parted -s /dev/sdb mklabel gpt
# parted -s /dev/sdb "mkpart primary 0 -1"
# parted -s /dev/sdb print
・・・
Disk /dev/sdb: 3221GB
・・・
Number Start End Size File system Name Flags
1 17.4kB 3221GB 3221GB primary
# partprobe /dev/sdb
- フォーマット
# mkfs.xfs -f -n ftype=1 /dev/sdb1
- fstab の編集
#フォーマットしたパーティションの UUID を調べて fstab に追記する
# blkid /dev/sdb1
/dev/sdb1: UUID="~~~~~~~~~~~~~~~~~~~~~~"
#vi /etc/fstab
・・・
UUID="~~~~~~~~~~~~~~~~~~~~~~" /var/lib/docker/ xfs defaults 0 0
- マウント
# mkdir /var/lib/docker
# mount /var/lib/docker
# df -hT
Filesystem Type Size Used Avail Use% Mount on
・・・
/dev/sdb1 xfs 3.0T 21G 3.0T 1% /var/lib/docker
- 自動的にマウントされているかの確認
OS を再起動して,自動的にマウントされているかを確認する
# reboot
# df -hT | grep docker
/dev/sdb1 xfs 3.0T 21G 3.0T 1% /var/lib/docker
コンテナ内での systemd の起動に関して
systemd を利用する条件
- /tmpディレクトリが tmpfs としてマウントされていること
- /run ディレクトリが tmpfs としてマウントされていること
- Docker ホストの全デバイスにアクセスできる権限が付与されていること
上記の条件が満たされていればコンテナで systemd を利用できる
条件1と条件2を満たすためには,コンテナ起動時に以下のオプションをつければいい
--tmpfs /tmp --tmpfs /run
条件3を満たすためには以下のオプションをつければいい
--privileged
ホスト OS 上のデータの参照方法
- bind mount
Docker ホスト上のデバイスファイルやディレクトリなどをコンテナから参照する - volume
Docker ホストが管理するボリューム(/var/lib/docker/volume 以下)をコンテナで利用する - tmpfs mount
Docker ホストのメモリをファイルシステムとしてコンテナで利用する
Dockerfile の命令
- ADD
ファイルやディレクトリをコピーし,アーカイブファイルを指定した場合は,展開する - ARG
docker build コマンドの引数を渡す - CMD
コンテナ内でコマンドを実行する(docker run 時のコマンド指定で上書き) - COPY
ファイルやディレクトリをコピーする - ENTRYPOINT
コンテナ内でコマンドを実行する - ENV
コンテナ内で環境変数を設定する - EXPOSE
コンテナ起動時に指定したポートでリッスンする - FROM
ベースイメージを取得する - HEALTHCHECK
コンテナ内のアプリケーションの死活監視を行う - LABEL
Docker イメージにメタデータ情報(ビルド日時,ライセンス,メンテナンス担当情報など)を付加する - ONBUILD
親となる Dockerfile 内の ONBUILD で指定したコマンドが,子の Dockerfile のビルド時に実行される - RUN
Docker イメージに含まれているコマンドを実行する - STOPSIGNAL
コンテナ終了時に送信するシステムコールシグナルを設定する - USER
ユーザを切り替える - VOLUME
指定したディレクトリを Docker ボリュームとして取り扱う - WORKDIR
作業ディレクトリを変更する
ADD 命令と COPY 命令の挙動の違い
ADD
tgz や tar.bz2 などの圧縮 tar アーカイブファイルを ADD 命令で指定すると,Docker イメージにおいて,圧縮 tar アーカイブファイルの解凍及び展開が行われるが,元の圧縮 tar アーカイブファイル自体はコピーされない
また,ADD 命令は URL で指定したリモートサイトのファイルなどをダウンロードしてイメージにコピー可能。
COPY
一方で,圧縮 tar アーカイブファイルを COPY 命令で指定すると Docker イメージにおいて解凍や展開もされず,そのまま元の圧縮 tar アーカイブファイル自体がコピーされる。
COPY 命令は URL で指定したリモートサイトのファイルのコピー操作はできない
ENTRYPOINT と CMD 命令の違い
ENTRYPOINT 命令の例
Dockerfile における ENTRYPOINT の例 | 意味 | 実行されるコマンド |
---|---|---|
ENTRYPOINT ["/usr/bin/uname"] | /usr/bin/uname を直接実行 | /usr/bin/uname |
ENTRYPOINT /usr/bin/uname | /usr/bin/uname をシェルで実行 | sh -c /usr/bin/uname |
CMD 命令の例
Dockerfile における CMDの例 | 意味 | 実行されるコマンド |
---|---|---|
CMD ["/usr/bin/uname"] | /usr/bin/uname を直接実行 | /usr/bin/uname |
CMD /usr/bin/uname | /usr/bin/uname をシェルで実行 | sh -c /usr/bin/uname |
CMD ["-a"] | ENTRYPOINT の引数を設定する | ENTRYPOINT の値 -a |
docker の CPU 使用率割り当て相対値をもとに各コンテナにどれほど割り当てられているかを求める公式
コンテナの CPU 使用率の割り当て相対値が以下のようになっているとする。
コンテナ1 | コンテナ2 | コンテナ3 | コンテナ4 |
---|---|---|---|
a | b | c | d |
※単位:%
例:
コンテナ1 | コンテナ2 | コンテナ3 | コンテナ4 |
---|---|---|---|
1024 | 256 | 256 | 1024 |
よって,コンテナ1に割り当てられる CPU は 40%
Docker が稼働する CPU コアの割り当て確認
現在稼働中のコンテナがどの CPU コアに割り当てられているかを知るには,そのコンテナ ID を取得し, cgroup で提供される cpuset.cpus の値を確認すること。
OS によって cgroup のバージョンが異なるため,絶対パスは mount コマンドで確認するのがよい。
$ mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2....
のような感じで出力される!!!
コンテナが利用可能なメモリ容量の確認
コンテナに設定されている現在のメモリ容量をホスト OS 上で確認するには,/sys ディレクトリは以下に存在するコンテナ ID を含むディレクトリいかに存在する「 memory.limit_in_bytes 」の値を確認すること
コンテナが OOM で死んだかどうかの確認
docker inspect コマンドで見る
# docker inspect container001 | grep -A 12 -i state
"State": {
"Status": "exited",
"Running": "false",
"Paused": "false",
"Restarting": "false",
"OOMKilled": "true",
"Dead": "false",
"Pid": "0",
"ExitCode": 137,
"Error": "",
"StaredAt": ~~~~,
"FinishedAt": ~~~~
},
コンテナが終了した際は,終了コードを確認して正常終了なのかどうかを確認するようにする。
docker compose による Docker コンテナのスケール
Docker compose でコンテナをスケールさせるには,以下のように docker compose コマンドに「 up --scale 」オプションを付与して,YAML ファイルで記述した Docker コンテナのサービス名とスケール数を付与することでできちゃう。コンテナを起動する際のタイムアウト値を COMPOSE_HTTP_TIMEOUT に明示的に指定してコマンドを実行する。
COMPOSE_HTTP_TIMEOUT=360 \
docker compose -f ./hoge.yml up --scale container001=8 -d