Docker를 사용해 동일한 머신에서 Ollama Pro 구독 두 개 누적하기
게시: 08 May 2026
두 개의 Pro 구독, 한 대의 기계, 한 장의 신용카드, 그리고 네트워크 충돌 없음. Docker가 두 번째 PC를 구매하지 않고도 내 클라우드 추론 용량을 두 배로 늘릴 수 있도록 해준 방법.
소개
저는 Ollama Pro를 몇 달 동안 사용해 왔으며, 이를 통해 OpenCode 세션에 클라우드 모델을 공급하고 있습니다. 문제는, Pro 구독을 가지고 있더라도 동시에 여러 에이전트를 실행하면 rate limiting 때문에 금방 제한에 걸린다는 점입니다. 명백한 해결책: 두 번째 구독.
그런데 거기서는 비극이야.
Ollama는 각 머신을 고유한 SSH 키로 식별합니다 — 유명한 Device Key. 같은 OS 상의 두 인스턴스는 동일한 정체성을 공유하게 되며, 동일한 기기에 두 개의 Pro 계정을 연결하는 것은 불가능합니다. 그리고 예상하셨겠지만, 저는 단순히 그것을 위해 두 번째 랩톱을 구매하지는 않을 겁니다.
해결책: 속임수. Ollama에게 두 대의 다른 기계에서 실행되고 있다고 믿게 하다, 사실 같은 CPU, 같은 RAM, 같은 네트워크 연결을 공유하고 있다. 도커는 우리에게 완벽한 격리 버블을 제공할 것이다.
@startuml
!theme plain
skinparam BoxPadding 10
skinparam DefaultFontSize 12
left to right direction
node "물리적 기계" {
frame "Ollama 인스턴스 A (네이티브)" as Native {
database "신원
/usr/share/ollama/.ollama/id_ed25519" as KeyA
portin "API\n:11434" as PortA
}
frame "Ollama 인스턴스 B (Docker)" as Docker {
database "정체성
~/ollama-b-data/id_ed25519" as KeyB
portin "API
:11435" as PortB
}
}
cloud "올라마 클라우드" {
actor "프로 A 계정
(이메일 1)" as AccountA
actor "프로 B 계정
(이메일 2)" as AccountB
}
KeyA --> AccountA : "SSH 키 A"
KeyB --> AccountB : "SSH 키 B"
PortA --> AccountA : "요청 A"
PortB --> AccountB : "요청 B"
note bottom of Docker
Conteneur isolé : identité SSH distincte,
port réseau distinct, volume persistant
end note
@enduml
왜 두 번 같은 것인가요?
정신병 환자라고 부르기 전에, 사용 사례를 설명해 드리겠습니다.
하나의 Pro 구독만 있으면 모델을 실행할 수 있어`deepseek-v4-pro:cloud`OpenCode 세션에서. 문제가 두 개의 동시 세션을 원할 때 발생합니다. Rate limiting quotas 때문에 두 번째 세션이 느려지거나 완전히 거부됩니다.
두 개의 독립된 Pro 구독:
-
세션 OpenCode 1 → 프로 계정 A`localhost:11434`)
-
세션 OpenCode 2 → 계정 프로 B (
localhost:11435)
각 세션은 자체 할당량과 자체 컨텍스트를 가지고 있으며, 서로 방해하지 않습니다. 이것은 인간의 멀티프로세싱입니다.
|
두 개의 Pro 구독 = 서로 다른 두 개의 이메일. 동일한 은행 카드가 작동합니다 — Ollama 결제 시스템은 동일한 결제 수단에서 여러 구독을 차단하지 않습니다. 저는 확인했습니다. |
문제의 핵심: 디바이스 키
Ollama를 설치하면, ed25519 SSH 키 쌍이 identity 디렉터리에 생성됩니다 :
$ cat /usr/share/ollama/.ollama/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...
이 키는 Ollama 서버로 업로드됩니다 동안의`ollama signin`. 그녀가 이렇게 말한다: « 이 기계는 해당 Pro 계정에 속합니다 ». 두 인스턴스가 같은 파일을 공유하면`id_ed25519`, 그들은 같은 정체성을 공유합니다. 게임 끝.
퍼레이드: 우리 두 번째 인스턴스에 자체 ID 디렉터리를 제공하고, 이를 Docker 볼륨에 격리합니다.
준비 — 단계별로
선행 조건
-
기능적인 네이티브 Ollama 설치 (공식 스크립트`curl | sh`)
-
도커가 설치되어 작동 중
-
배포를 위한 Portainer 또는 docker-compose
-
두 개의 Ollama 계정, 두 개의 다른 이메일 주소
나는 버전을 사용했다`0.20.2`— 공식 스크립트가 제공하는 것과 해당하는 Docker 이미지.
단계 1 : 볼륨 생성
호스트의 간단한 디렉터리가 인스턴스 B의 ID에 대한 영구 볼륨으로 사용됩니다.
mkdir -p ~/ollama-b-data
이 폴더는 Docker 컨테이너에 마운트될 것입니다./root/.ollama, Ollama가 신원 키, 기록 및 모델을 저장하는 곳.
단계 2: 도커 컨테이너 실행
# docker-compose.yml
services:
ollama-instance-b:
image: ollama/ollama:0.20.2
container_name: ollama-instance-b
ports:
- "11435:11434"
volumes:
- /home/cheroliv/ollama-b-data:/root/.ollama
environment:
- OLLAMA_HOST=0.0.0.0
restart: always
여기서 일어나는 일 :
-
항구11435호스트의 …에 매핑됨11434컨테이너 내부. 따라서 Docker 인스턴스는 에서 수신 대기합니다.
:11435`네이티브 인스턴스가 점유하고 있는 것과 충돌 없이:11434`. -
볼륨`~/ollama-b-data`장착된`/root/.ollama`— 여기서 SSH 신분이 저장됩니다.
-
`OLLAMA_HOST=0.0.0.0`컨테이너가 외부 연결을 수락할 수 있게 합니다.
나는 Portainer를 통해 이 스택을 배포했지만, 간단한`docker compose up -d`같은 방식으로도 잘 작동합니다.
단계 3: 공개 키를 가져오기
컨테이너가 처음 시작할 때 비어 있으므로, Ollama는 볼륨 내에서 새 SSH 키 쌍을 자동으로 생성합니다. 공개 키를 가져옵니다 :
$ docker exec ollama-instance-b cat /root/.ollama/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDDQ+dvnfmuo49q5O8LOlvgZ39SKORFw47ry9k4H2jPc
저는 이 키가 기본 인스턴스의 키와 다른 것을 확인합니다 :
# Instance native
$ cat /usr/share/ollama/.ollama/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGyF...(différente)
# Instance Docker
$ cat ~/ollama-b-data/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDDQ...(différente)
두 개의 서로 다른 열쇠, 두 개의 별개 정체성. 다 끝났어.
|
컨테이너가 다시 시작되면, 그것은 *재사용*하는 볼륨에 있는 키를 재사용합니다. 정체성은 지속됩니다. Pro 계정과의 연관을 잃지 않을 것입니다. |
4단계: Ollama.com에 키 저장하기
지시 https://ollama.com/settings/keys → SSH 키 추가. Docker 인스턴스의 공개 키를 붙여넣고 확인합니다.
그다음에, 이 신분을 Pro B 계정에 연결합니다:
$ docker exec -it ollama-instance-b ollama signin
브라우저가 열립니다, 계정 B의 이메일로 로그인합니다, 그리고 토큰은 컨테이너의 SSH 키와 연결됩니다. 모든 것이 정상인지 확인합니다 :
$ docker exec -it ollama-instance-b ollama signin
User: cherolivpro
단계 5 : 작은 무료 모델로 테스트하기
프로 구독 가격을 얘기하기 전에, 파이프가 잘 작동하는지 확인하고 싶어요. 연결성을 검증하기 위해 작은 로컬 무료 모델을 pull합니다 :
$ docker exec ollama-instance-b ollama pull qwen3:0.6b
pulling manifest
pulling 7f4030143c1c: 100% ▕██████████████████▏ 522 MB
success
$ curl -s http://localhost:11435/api/tags
{"models":[{"name":"qwen3:0.6b","model":"qwen3:0.6b",...}]}
항구`11435`답하고, 모델은 제공됩니다. 인스턴스 B는 살아 있습니다.
안심하고 나서, 나는 진짜 클라우드 프로 모델의 풀로 넘어간다:
$ docker exec ollama-instance-b ollama pull deepseek-v4-pro:cloud
pulling manifest
pulling 31c3059e137e: 100% ▕██████████████████▏ 344 B
success
클라우드 모델의 매니페스트가 344 바이트 — 정상입니다. 추론은 로컬이 아닌 서버 쪽에서 이루어집니다. 그리고 이것이 궁극적인 테스트입니다:
$ curl -s http://localhost:11435/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-pro:cloud","messages":[{"role":"user","content":"Dis bonjour en une phrase courte."}]}'
{
"id": "chatcmpl-480",
"model": "deepseek-v4-pro",
"choices": [{
"message": { "content": "Bonjour !" },
"finish_reason": "stop"
}],
"usage": { "total_tokens": 181 }
}
B 인스턴스도 안녕하세요.
API 함정 `/v1/models
바보 같은 디테일에 20분을 허비했다. provider를 설정했을 때`ollama-b`OpenCode에서는 모델 선택기에 아무것도 나타나지 않았습니다. 아무것도요. 전혀 없었어요.
이유는? API`/v1/models`인스턴스 B에서 돌아가고 있었다`{"object":"list","data":null}`대신에`{"object":"list","data":[]}`어떤 모델도 끌어오지 않았을 때. 값`null`OpenCode 측에서 파싱을 중단시켰고, 제공자를 표시하지 않았습니다.
솔루션: OpenCode 구성에서 모델을 명시적으로 선언하고 동적 탐색에 의존하지 않는 것입니다.
{
"$schema": "https://opencode.ai/config.json",
"provider": {
"ollama": {
"npm": "@ai-sdk/openai-compatible",
"name": "Ollama (local)",
"options": { "baseURL": "http://localhost:11434/v1" },
"models": {
"gemma4:e2b": { "name": "Gemma 4 E2B (local)" }
}
},
"ollama-b": {
"npm": "@ai-sdk/openai-compatible",
"name": "Ollama Instance B (Docker)",
"options": { "baseURL": "http://localhost:11435/v1" },
"models": {
"qwen3:0.6b": { "name": "Qwen3 0.6B (B)" },
"deepseek-v4-pro:cloud": { "name": "DeepSeek V4 Pro (B)" }
}
}
}
}
이 명시적 선언과 함께, OpenCode는 즉시 provider B와 그 모델을 확인합니다. 세션을 재시작하고, 셀렉터`/models`두 인스턴스를 나란히 표시합니다.
|
사용자 지정 공급자를 보지 못하면`/models`, 세 시간 동안 터미널을 재시작하는 데 시간을 낭비하지 마세요. 수동으로 모델을 선언하세요 안에`opencode.json`— 이것이 문제를 즉시 해결합니다. |
결과 : 두 세션, 두 계정, 갈등 없음
결국, 저는 두 개의 OpenCode 세션을 동시에 시작할 수 있습니다:
Session 1 → /models → Ollama (local) → deepseek-v4-pro:cloud → Compte A
Session 2 → /models → Ollama Instance B (Docker) → deepseek-v4-pro:cloud → Compte B
각 세션마다 자체 할당량과 자체 레이트 제한이 있으며 서로 간섭하지 않습니다. 같은 기기, 같은 신용카드, 두 개의 다른 이메일.
그리고 가장 좋은 점은? Docker 컨테이너는 진행 중`restart: always`. 시스템 재부팅에도 수동 개입 없이 살아남습니다.
배운 교훈
-
Docker는 모든 것을 격리합니다, 심지어 정체성까지도— 볼륨에 대한 간단한 바인드 마운트만으로도 컨테이너에 자체 SSH 키 세트를 제공할 수 있어, Ollama 입장에서는 물리적으로 다른 기계와 구분되지 않는다.
-
두 개의 이메일, 동일한 CB— Ollama는 동일한 결제 수단으로부터 여러 구독을 차단하지 않습니다. 이메일만 달라야 합니다.
-
무료로 테스트해보다 결제하기 — Un
ollama pull qwen3:0.6b(modèle libre, 522 Mo) permet de valider toute la chaîne réseau sans débourser un centime. Vous validez le plomberie d’abord, vous activez le Pro ensuite. -
/v1/models`와
data: null`은 OpenCode을 깨뜨립니다.— 커스텀 제공자를 구성하면`"models": {}, OpenCode는 API를 통해 모델을 발견하려고 시도합니다. 만약 API가 응답하면`data: null`, provider가 나타나지 않습니다. 모델을 명시적으로 선언하세요. -
두 개의 계정은 인간 다중 처리다.— Pro 계정 = 활성화된 OpenCode 세션. 두 개의 계정 = 두 개의 병렬 세션. 여러 Gradle 프로젝트를 동시에 다루는 사람에게 이것은 게임 체인저입니다.
더 나아가기
관련 기사
31 May 2026
14 May 2026