Open13

Docker 小ネタ集(殴り書き)

ymz_noteymz_note

cgroup v2 で使用できるコントローラ

  1. cpu
    CPU 時間の割り当てやスケジューリングを行う
  2. cpuset
    プロセスが稼働する CPU コアの割り当て配置を設定する
  3. device
    デバイスへのアクセス制御を設定する
  4. freezer
    プロセスの一時停止,再開を制御する
  5. hugetlb
    サイズの大きい仮想メモリページを利用可能にする
  6. io
    ブロックデバイスの入出力を制御する
  7. memory
    メモリ使用量の制限,メモリ不足の制御をおこなう(OOM)
  8. misc
    特定の cgroup 内で利用できるリソース数を制限する
  9. perf_event
    性能情報の収集と分析を行う Perf 使用時のプロセス関連のイベントを取得する
  10. pids
    リソースの制限到達時のタスクの生成やクローンの停止を制御する
  11. rdma
    RDMA/IB デバイスに対するリソース制御とアカウンティングを調整する
ymz_noteymz_note

Docker の導入を検討する場合の主なチェックポイント

  • そもそも Docker が自社に必要なのか
  • 既存の仮想環境における課題は何か
  • 既存の仮想環境をコンテナ型環境に置き換えることは可能か
  • 自社へ Docker を適用する際の最大の障害は何か
  • 現在のシステムのどの部分に Docker を採用するのか
  • 物理環境の高可用性に関する SLA を Docker でも実現できそうか

Docker 導入決定後,サーバOS選定における主なチェックポイント

  • Docker を稼働させる OS 環境は,コミュニティ版の Linux でよいのか?商用版の Linux にすべきか?
  • コミュニティ版 OS を採用する場合,どのディストリビューションを採用するのか
  • 商用 Linux の場合,どのディストリビューションを採用するのか
  • OS と Docker の保守サポートは同時に受けられるか
  • 保守サポートが受けられない場合,問題の切り分け作業を自社で行えるか
ymz_noteymz_note

OS インストール手順後に /dev/sdb を xfs で使用する方法

ディスク交換とかで自動的に xfs フォーマットされない場合などは自分でパーティション設定する必要がある。

  1. 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
  1. フォーマット
# mkfs.xfs -f -n ftype=1 /dev/sdb1
  1. fstab の編集
#フォーマットしたパーティションの UUID を調べて fstab に追記する
# blkid /dev/sdb1
/dev/sdb1:     UUID="~~~~~~~~~~~~~~~~~~~~~~"

#vi /etc/fstab
・・・
UUID="~~~~~~~~~~~~~~~~~~~~~~"   /var/lib/docker/ xfs defaults 0 0
  1. マウント
# 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
  1. 自動的にマウントされているかの確認
    OS を再起動して,自動的にマウントされているかを確認する
# reboot
# df -hT | grep docker
/dev/sdb1     xfs      3.0T     21G     3.0T      1%         /var/lib/docker
ymz_noteymz_note

コンテナ内での systemd の起動に関して

systemd を利用する条件

  1. /tmpディレクトリが tmpfs としてマウントされていること
  2. /run ディレクトリが tmpfs としてマウントされていること
  3. Docker ホストの全デバイスにアクセスできる権限が付与されていること

上記の条件が満たされていればコンテナで systemd を利用できる
条件1と条件2を満たすためには,コンテナ起動時に以下のオプションをつければいい

--tmpfs /tmp --tmpfs /run

条件3を満たすためには以下のオプションをつければいい

--privileged
ymz_noteymz_note

ホスト OS 上のデータの参照方法

  1. bind mount
    Docker ホスト上のデバイスファイルやディレクトリなどをコンテナから参照する
  2. volume
    Docker ホストが管理するボリューム(/var/lib/docker/volume 以下)をコンテナで利用する
  3. tmpfs mount
    Docker ホストのメモリをファイルシステムとしてコンテナで利用する
ymz_noteymz_note

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
    作業ディレクトリを変更する
ymz_noteymz_note

ADD 命令と COPY 命令の挙動の違い

ADD

tgz や tar.bz2 などの圧縮 tar アーカイブファイルを ADD 命令で指定すると,Docker イメージにおいて,圧縮 tar アーカイブファイルの解凍及び展開が行われるが,元の圧縮 tar アーカイブファイル自体はコピーされない
また,ADD 命令は URL で指定したリモートサイトのファイルなどをダウンロードしてイメージにコピー可能。

COPY

一方で,圧縮 tar アーカイブファイルを COPY 命令で指定すると Docker イメージにおいて解凍や展開もされず,そのまま元の圧縮 tar アーカイブファイル自体がコピーされる。
COPY 命令は URL で指定したリモートサイトのファイルのコピー操作はできない

ymz_noteymz_note

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
ymz_noteymz_note

docker の CPU 使用率割り当て相対値をもとに各コンテナにどれほど割り当てられているかを求める公式
コンテナの CPU 使用率の割り当て相対値が以下のようになっているとする。

コンテナ1 コンテナ2 コンテナ3 コンテナ4
a b c d
[コンテナ1 へ割り当てられる CPU] = \frac{100a}{a+b+c+d}

※単位:%

例:

コンテナ1 コンテナ2 コンテナ3 コンテナ4
1024 256 256 1024
[コンテナ1 へ割り当てられる CPU] = \frac{100*1024}{1024+256+256+1024} = \frac{100*1024}{2560} = \frac{2*100}{5} = 40

よって,コンテナ1に割り当てられる CPU は 40%

ymz_noteymz_note

Docker が稼働する CPU コアの割り当て確認

現在稼働中のコンテナがどの CPU コアに割り当てられているかを知るには,そのコンテナ ID を取得し, cgroup で提供される cpuset.cpus の値を確認すること。
OS によって cgroup のバージョンが異なるため,絶対パスは mount コマンドで確認するのがよい。

$ mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2....

のような感じで出力される!!!

ymz_noteymz_note

コンテナが利用可能なメモリ容量の確認

コンテナに設定されている現在のメモリ容量をホスト OS 上で確認するには,/sys ディレクトリは以下に存在するコンテナ ID を含むディレクトリいかに存在する「 memory.limit_in_bytes 」の値を確認すること

ymz_noteymz_note

コンテナが 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": ~~~~
        },

コンテナが終了した際は,終了コードを確認して正常終了なのかどうかを確認するようにする。

ymz_noteymz_note

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