Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

Docker-in-Docker を実行する

最終更新 Markdown で表示Agent セットアップ

このガイドでは、Sandbox 内で Docker を動かし、セキュアなサンドボックスからコンテナイメージをビルドして実行する方法を説明します。

Docker-in-Docker を使うとき

Docker-in-Docker は、次が必要なときに使います。

  • コンテナ化したアプリケーションの開発 - Dockerfile からイメージを作るために docker build を実行します
  • CI/CD の一部として Docker を動かす - コード変更に応じて、Cloudflare Containers でイメージをビルドしてプッシュします
  • 任意のコンテナイメージを実行する - エンドユーザーが指定したイメージからコンテナを起動します

Docker 対応イメージを作成する

Cloudflare Containers は root 権限なしで動くため、rootless の Docker イメージを使います。サンドボックスバイナリと Docker を組み合わせたカスタム Dockerfile を作成します。

Dockerfiledockerfile
FROM docker:dind-rootless
USER root

# Use the musl build so it runs on Alpine-based docker:dind-rootless
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /container-server/sandbox /sandbox
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /usr/lib/libstdc++.so.6 /usr/lib/libstdc++.so.6
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /usr/lib/libgcc_s.so.1 /usr/lib/libgcc_s.so.1
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /bin/bash /bin/bash
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /usr/lib/libreadline.so.8 /usr/lib/libreadline.so.8
COPY --from=docker.io/cloudflare/sandbox:0.7.4-musl /usr/lib/libreadline.so.8.2 /usr/lib/libreadline.so.8.2

# Create startup script that starts dockerd with
# iptables disabled, waits for readiness, then keeps running
RUN printf '#!/bin/sh\n\
  set -eu\n\
  dockerd-entrypoint.sh dockerd --iptables=false --ip6tables=false &\n\
  until docker version >/dev/null 2>&1; do sleep 0.2; done\n\
  echo "Docker is ready"\n\
  wait\n' > /home/rootless/boot-docker-for-dind.sh && chmod +x /home/rootless/boot-docker-for-dind.sh

ENTRYPOINT ["/sandbox"]
CMD ["/home/rootless/boot-docker-for-dind.sh"]

サンドボックスで Docker を使う

デプロイ後は、サンドボックス経由で Docker コマンドを実行できます。

import { getSandbox } from "@cloudflare/sandbox";

const sandbox = getSandbox(env.Sandbox, "docker-sandbox");

// Build an image
await sandbox.writeFile(
	"/workspace/Dockerfile",
	`
FROM alpine:latest
RUN apk add --no-cache curl
CMD ["echo", "Hello from Docker!"]
`,
);

const build = await sandbox.exec(
	"docker build --network=host -t my-image /workspace",
);
if (!build.success) {
	console.error("Build failed:", build.stderr);
}

// Run a container
const run = await sandbox.exec("docker run --network=host --rm my-image");
console.log(run.stdout); // "Hello from Docker!"
import { getSandbox } from "@cloudflare/sandbox";

const sandbox = getSandbox(env.Sandbox, "docker-sandbox");

// Build an image
await sandbox.writeFile(
	"/workspace/Dockerfile",
	`
FROM alpine:latest
RUN apk add --no-cache curl
CMD ["echo", "Hello from Docker!"]
`,
);

const build = await sandbox.exec(
	"docker build --network=host -t my-image /workspace",
);
if (!build.success) {
	console.error("Build failed:", build.stderr);
}

// Run a container
const run = await sandbox.exec("docker run --network=host --rm my-image");
console.log(run.stdout); // "Hello from Docker!"

制限

Cloudflare Containers 上の Docker-in-Docker には、次の制限があります。

  • iptables なし - iptables に依存するネットワーク隔離機能は使えません
  • rootless モードのみ - 特権コンテナや、root が必要な機能は使えません
  • 一時ストレージ - ビルドしたイメージとコンテナは、サンドボックスがスリープすると失われます。手動で永続化する必要があります。

関連リソース

役に立ちましたか?