Docker in Docker 2가지

Docker in Docker 2가지

TCP/DinD 방식을 socket(DooD) 대신 선택한 주요 이유는 격리성, 안정성, 멀티 컨테이너 환경 때문입니다.[1][2][3]

Socket(DooD) vs TCP(DinD) 비교

| 방식 | 장점 | 단점 | OpenCode DinD에 적합한 이유 |
|——|——|——|--—————————|
| Socket 마운트 (DooD)
-v /var/run/docker.sock [1][2][3] | 빠름 (Unix socket 저지연), 호스트 Docker 그대로 사용 [4][5] | 호스트 Docker 직접 제어 → 보안 위험 (root 권한 노출), Docker 업그레이드 시 연결 끊김 [1][6], 싱글 호스트 한정 [2] | ❌ OpenCode가 컨테이너 빌드/푸시할 때 호스트 오염 위험 |
| TCP/DinD
tcp://dind:2376 [1][2][7] | 완전 격리 (호스트 영향 없음), 멀티 컨테이너 독립 Docker 데몬, K8s 친화적 [2][3], 네트워크 기반 연결 안정적 [6][8] | 약간 느림 (TCP 오버헤드), privileged 필요 [2][9] | ✅ AI 에이전트 보안 격리, workspace별 독립 테스트 환경 |

OpenCode DinD 선택 이유 (당신의 워크플로우 관점)

1. AI 에이전트 보안 격리

OpenCode 프롬프트: "이 악성 코드 포함 Dockerfile 빌드해줘"
  ↓ Socket 방식: 호스트 Docker 오염 → 전체 시스템 위험
  ↓ TCP/DinD: 격리된 Docker 데몬 → 안전 테스트

AI 코딩 에이전트 특성상 실수/악성 코드 실행 위험이 크므로 완전 격리가 필수입니다.[10][9]

2. 멀티 컨테이너 독립성

docker compose exec opencode-client opencode  # client1
docker compose run --name client2 opencode-client opencode  # client2

각 클라이언트가 별도 Docker 데몬 사용 → 충돌 없음, 병렬 워크플로우 가능.[2][3]

3. 인프라 재현성

# 호스트 Docker 버전 상관없이 항상 docker:27.3 사용
image: docker:27.3-dind-alpine

서버 배포/K8s에서 예측 가능한 Docker 버전 보장, 버전 롤백 쉬움.[1][3]

4. 원격/분산 워크플로우

# Termux 모바일에서 접속
opencode --server http://seoul-server:8080 --docker-host tcp://dind.seoul-server:2376

# K8s 멀티 노드
DOCKER_HOST=tcp://dind-namespace.svc.cluster.local:2376

당신의 VPS/클라우드/모바일 멀티 디바이스 환경에 최적.[6][8][7]

Socket 방식으로 바꾸고 싶다면 (간단 수정)

docker-compose.yml에서 docker-dind 서비스 제거하고:

services:
  opencode-server:
    # docker-dind 제거
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro  # 호스트 socket
      - opencode-config:/root/.config/opencode
      - ./workspace:/workspace
    environment:
      - DOCKER_HOST=unix:///var/run/docker.sock  # socket 방식

하지만 추천하지 않습니다 – AI 워크로드에서는 격리 > 성능입니다.[1][3]

DinD가 당신의 "서버 인프라 + AI 실험" 환경에 딱 맞는 선택입니다![2][3]

인용:
[1] [Docker] DinD vs DooD https://velog.io/@showui96/Docker-DinD-vs-DooD
[2] [개념] DinD(Docker in Docker)와 DooD(Docekr out of Docker) https://융융이.com/140
[3] [Docker] Dind (Docker in docker) / Dood(Docker out of docker) https://ssnotebook.tistory.com/entry/Docker-Dind-Docker-in-docker-DoodDocker-out-of-docker
[4] How to Set Up Docker Containers with Unix Socket ... https://oneuptime.com/blog/post/2026-02-08-how-to-set-up-docker-containers-with-unix-socket-communication/view
[5] Why does Docker use Unix Domain Socket instead of TCP ... https://www.reddit.com/r/docker/comments/a3mlpd/why_does_docker_use_unix_domain_socket_instead_of/
[6] Connect agent to docker via tcp:// rather than docker.sock https://www.reddit.com/r/portainer/comments/1nx1xn7/connect_agent_to_docker_via_tcp_rather_than/
[7] Expose Docker socket via TCP https://github.com/tobilg/docker-expose-socket
[8] $DOCKER_HOST - tcp://127.0.0.1:2375 works but tcp://localhost:2375 does not.. why? https://www.reddit.com/r/docker/comments/iusupk/docker_host_tcp1270012375_works_but/
[9] Claude Code를 위험하게(안전하게) 실행하기 - GeekNews https://news.hada.io/topic?id=26002
[10] 쉘 액세스 권한을 가진 AI 에이전트를 만들었어. 그게 왜 나쁜 ... https://www.reddit.com/r/LocalLLaMA/comments/1qocvd4/built_an_ai_agent_with_shell_access_found_out_the/
[11] Codex MCP 서버를 활용한 Subagent 환경 구축 - hou27의 블로그 https://hou27.tistory.com/entry/Codex-MCP-서버를-활용한-Subagent-환경-구축
[12] 도커 컨테이너 안에서 도커 실행하기(Docker in Docker, Docker Out of Docker) https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=isc0304&logNo=222274955992
[13] DinD, DooD 구조, 컨테이너 내부에서 도커 사용에 대하여 - velog https://velog.io/@dev98/DinD-문제
[14] DinD, DooD..? - 최소양의 블로그 - 티스토리 https://mns010.tistory.com/25
[15] 도커 컴포즈로 도커 네트워킹 톺아보기 - CodeSnap https://codesnapmag.hashnode.dev/docker-networking-docker-compose

개인정보보호링크