Dockerコンテナ内からnode.jsアプリケーションを実行しています。 node.jsアプリケーションが実行されているコンテナーのシステム使用状況メトリックを取得しようとしています。現在、私は https://www.npmjs.com/package/dockerstats を使用していますが、CPUまたはメモリの使用量は常に表示されず、dockerstatsを実行するとそれぞれの使用量が表示されます。
私のコードは次のようになります。
let dockerId = setUp.getDockerId();
dockerId.then(dockerId => {
if (dockerId !== null) {
console.log(`dockerId: ${dockerId}`);
dockerstats.dockerContainerStats(dockerId, data => {
console.log(`cpu_percent: ${data.cpu_percent}`);
console.log(`memPercent: ${data.memPercent}`);
console.log(`memUsage: ${data.memUsage}`);
});
}
});
SetUpクラスは次のようになり、 https://www.npmjs.com/package/docker-container-id を使用します。
const getId = require('docker-container-id');
module.exports = class setUp {
getDockerId () {
return getId().then(id => {
if (!id) {
return null;
}
return id;
});
}
}
あなたが言ったように、あなたはコンテナIDを取得するためにdocker-container-id
パッケージを使用しています。このパッケージは、/proc/self/cgroup
ファイルを検査することで機能するため、コンテナー内からのみ機能する必要があります(つまり、コンテナー化されたプロセスからgetContainerId()
が実行される場合のみ)。とは言うものの、さらに、アプリケーションが実行されているコンテナー内からメトリックを取得しようとしていると仮定します(この事実については明示的に言及していません)。
ここでの問題は、dockerstats
パッケージの説明に記載されているように、このパッケージはDocker APIを使用し、 パッケージソース に従って、クライアントがDockerソケット(/var/run/docker.sock
)に接続することです。デフォルトでは、コンテナ内では使用できません。これを回避する簡単な(しかし危険な)方法は、コンテナーの起動時に次のオプションを使用して、ホストの/var/run/docker.sock
をコンテナーにマウントすることです。
-v /var/run/docker.sock:/var/run/docker.sock
例えば。
docker run -v /var/run/docker.sock:/var/run/docker.sock $MY_IMAGE_NAME
ただし、これは強くお勧めしませんです。重大なセキュリティリスクが発生するためです。これは本番環境では絶対に行わないでください。そうすることで、コンテナがDockerを制御できるようになります。これは、コンテナに root アクセスをホストシステムに与えることと本質的に同じです。
ただし、実際には、リソース消費メトリックにアクセスするためにDockerAPIを使用する必要はありません。重要なのは、プロセスのcpuacct
およびmemory
コントロールグループ(それぞれCPUとメモリ消費の追跡と制限を担当)に関する情報を/sys/fs/cgroup
から直接読み取ることができるということです。たとえば、/sys/fs/cgroup/memory/memory.usage_in_bytes
ファイルを読み取ると、コンテナで使用されているメモリの量(バイト単位)がわかります。
# cat /sys/fs/cgroup/memory/memory.usage_in_bytes
164823040
また、/sys/fs/cgroup/cpuacct/cpuacct.usage
ファイルを読み取ると、コンテナーの合計CPU使用率(ナノ秒単位)がわかります。
# cat /sys/fs/cgroup/cpuacct/cpuacct.usage
2166331144
したがって、アプリケーションからこれらのメトリックを読み取り、処理することができます。また、procfs
の統計を使用することもできます。詳細については、 このディスカッション を参照してください。
コメントするのに十分な評判がないので、 @ danila-kiverからの回答 をメガバイト単位のメモリ使用量をチェックする簡単な方法で補完したいと思います:
cat /sys/fs/cgroup/memory/memory.usage_in_bytes | awk '{ byte =$1 /1024/1024; print byte " MB" }'
またはギガバイト:
cat /sys/fs/cgroup/memory/memory.usage_in_bytes | awk '{ byte =$1 /1024/1024/1024; print byte " GB" }'
困っている人のために。