在 Docker 環境呼叫系統 Docker 指令

最近有一個需求是希望使用 Docker 可以直接呼叫外面系統的 Docker 讓程式可以直接控制其他 Docker 的開關,所以這邊介紹一個 Docker 使用 Ubuntu docker 為範例使用 Node.js 呼叫 Docker 指令的方法

Dockerfile 安裝 Docker 與 Node.js

要讓 docker 內部可以呼叫 docker 指令需要先建立環境,有幾個必要的軟體需要先安裝

安裝必要軟體

apt-get update -qq && apt-get install -qqy \
    apt-transport-https \
    ca-certificates \
    curl \
    lxc \
    iptables

安裝 Docker

curl -sSL https://get.docker.com/ | sh

安裝 Node.js

curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \
    apt-get install -y nodejs

使用 Node.js 呼叫 Docker 指令

Node.js 可以直接使用呼叫指令的方法呼叫 Docker command,通常直接使用 exec 的方法呼叫就可以了

const util = require('util');
const exec = util.promisify(require('child_process').exec);

async function dockerVersion() {
  const { stdout, stderr } = await exec('docker version');
  console.log('stdout:', stdout);
  console.log('stderr:', stderr);
}
dockerVersion();

Docker build image

Docker build docker image 來使用範例先把它 build 成 image 名稱 node-docker

docker build -t node-docker .

呼叫 Docker 前掛載本機檔案

執行 Docker 前掛載本地 docker.sock 資料夾讓 Docker 裏面可以呼叫到外部系統的 Docker

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock node-docker

完整範例參考:https://github.com/clarencetw/node-docker