DEV Community

Alex Spinov
Alex Spinov

Posted on

Docker Has a Free API — Here's How to Manage Containers Programmatically

Docker provides a REST API that lets you manage containers, images, networks, and volumes programmatically. It runs on a Unix socket and is available on every Docker installation.

Enable the API

The Docker daemon exposes its API on a Unix socket by default:

curl --unix-socket /var/run/docker.sock http://localhost/v1.44/info | jq .Containers
Enter fullscreen mode Exit fullscreen mode

List Containers

const response = await fetch("http://localhost/v1.44/containers/json?all=true", {
  socketPath: "/var/run/docker.sock"
});
const containers = await response.json();
containers.forEach(c => console.log(`${c.Names[0]}: ${c.State}`));
Enter fullscreen mode Exit fullscreen mode

Using Dockerode (Node.js SDK)

npm install dockerode
Enter fullscreen mode Exit fullscreen mode
import Docker from "dockerode";

const docker = new Docker();

// List running containers
const containers = await docker.listContainers();
containers.forEach(c => {
  console.log(`${c.Names[0]}${c.Image}${c.State}`);
});
Enter fullscreen mode Exit fullscreen mode

Create and Start Container

// Pull image
await docker.pull("nginx:latest");

// Create container
const container = await docker.createContainer({
  Image: "nginx:latest",
  name: "my-nginx",
  ExposedPorts: { "80/tcp": {} },
  HostConfig: {
    PortBindings: { "80/tcp": [{ HostPort: "8080" }] },
    RestartPolicy: { Name: "unless-stopped" }
  },
  Env: ["NGINX_HOST=localhost"]
});

await container.start();
console.log("Container started!");
Enter fullscreen mode Exit fullscreen mode

Container Logs

const container = docker.getContainer("my-nginx");

// Get logs
const logs = await container.logs({
  stdout: true, stderr: true, timestamps: true, tail: 50
});
console.log(logs.toString());

// Stream logs in real-time
const stream = await container.logs({ follow: true, stdout: true });
stream.on("data", (chunk) => process.stdout.write(chunk));
Enter fullscreen mode Exit fullscreen mode

Execute Command in Container

const exec = await container.exec({
  Cmd: ["ls", "-la", "/usr/share/nginx/html"],
  AttachStdout: true
});

const { output } = await exec.start();
output.pipe(process.stdout);
Enter fullscreen mode Exit fullscreen mode

Image Management

// List images
const images = await docker.listImages();
images.forEach(img => {
  console.log(`${img.RepoTags?.[0]}${(img.Size / 1e6).toFixed(0)}MB`);
});

// Build from Dockerfile
const stream = await docker.buildImage({
  context: "./app",
  src: ["Dockerfile", "package.json", "src/"]
}, { t: "my-app:latest" });
Enter fullscreen mode Exit fullscreen mode

Need to extract or automate web content at scale? Check out my web scraping tools on Apify — no coding required. Or email me at spinov001@gmail.com for custom solutions.

Top comments (0)