본문 바로가기
AI Study/AI Agent

[AI Agent] ollama 외부 연결 Setting(Container + local)

by 하람 Haram 2025. 10. 30.
728x90

하고자 하는 목표는 다음과 같다.

 

local 환경의 ollama : port 11500 사용

Container 기반의 ollama : port 11434 사용

이렇게 하면 두 환경 모두 사용이 가능하지 않을까 라는 생각

 

1. local 환경 세팅 (Window)

https://aisj.tistory.com/245

 

Ollama를 이용한 환경 세팅

Ollama를 왜 사용하냐?그냥 너도 나도 LLM 모델을 Ollama에 올리길래Hugging Face 말고 Ollama 써봐야지 하고 환경 세팅을 해봤다 Ollama의 장점은- 오프라인 LLM 이 가능하다는 것이다 (인터넷없이 개인 PC에

aisj.tistory.com

여기에서 받은 ollama에서 시작을 해보자

 

지금 port가 11434로 되어 있는데 이것을 11500으로 바꾸자.

 

- 임시로 Port 바꾸기

임시적으로 바꿀 때는

#CMD
set OLLAMA_HOST=0.0.0.0:11500

#PowerShell
$env:OLLAMA_HOST = "0.0.0.0:11500"

이렇게 바꾸면 된다

 

하지만 우리는 영구적으로 바꾸고 싶기 때문에

 

- 영구적으로 Port 바꾸기

 

직접 환경변수창에 들어가서

OLLAMA_HOST 0.0.0.0:11500

으로 설정해주면 된다

 

근데 나는 CMD 창에서 바꾸고 싶다고 하면

setx OLLAMA_HOST "0.0.0.0:11500"

 

이걸 실행시켜주면 된다

 

실행 

그리고 실행해보면

ollama serve

 

....INFO OLLAMA_FLASH_ATTENTION:false OLLAMA_GPU_OVERHEAD:0 OLLAMA_HOST:http://0.0.0.0:11500 OLLAMA_INTEL ....(생략)

이렇게 환경변수가 잘 적용된 것을 볼 수 있다

 

 

 

2. Container를 통한 세팅

 

 

먼저 다음 cmd를 실행시켜 주자 (ollama라는 이름에 Container가 만들어져 있다고 가정)

docker exec -it ollama ollama pull gpt-oss:20b
  • exec : 이미 실행 중인 컨테이너 내부에서 명령을 실행하라는 Docker 명령입니다.
  • -i (interactive) : 표준 입력(STDIN)을 계속 열어둬서, 명령 실행 중에 입력을 받을 수 있게 합니다.
  • -t (tty) : 터미널(TTY)을 할당해서, 명령 실행 결과를 터미널 형식으로 보여줍니다.

docker exec -it <컨테이너명> <명령>실행 중인 컨테이너 안에 터미널을 연결하고, 그 안에서 명령을 직접 실행 방식

 

이러면 모델까지 가져와 진다.

자세한 설명은 https://aisj.tistory.com/245 

 

Ollama를 이용한 환경 세팅

Ollama를 왜 사용하냐?그냥 너도 나도 LLM 모델을 Ollama에 올리길래Hugging Face 말고 Ollama 써봐야지 하고 환경 세팅을 해봤다 Ollama의 장점은- 오프라인 LLM 이 가능하다는 것이다 (인터넷없이 개인 PC에

aisj.tistory.com

참고

 

그리고 serve를 해주면

docker exec -it ollama ollama serve
Error response from daemon: container fc....3419a15 is not running

다음과 같은 오류가 나오면 container가 실행되지 않고 있다는 것이다

이는 좀 더 Real 하게 보이기 위해 내가 강제로 container를 꺼서 생긴 문제이다

docker ps

를 한다면

이렇게 아무것도 실행되지 않아 위에 같은 에러가 나온 것을 볼 수 있다

docker ps -a

-a 옵션을 보면 위에 첨부한 링크 같이 docker로 ollama 와 webui를 다운 받았으면 (명령어 하나로 둘다 다운)

이렇게 두 개의 Container가 다운 된 것을 볼 수 있다

docker start ollama

ollama를 실행 시켜주고 (참고로 지금 local에서는 11500 port로 ollama가 serve되고 있는 상태이다)

 

다시 Container를 실행시켜주면

docker exec -it ollama ollama serve

다음과 같은 오류가 나온다

Error: listen tcp 0.0.0.0:11434: bind: address already in use

단순하게 보면 지금 local에서 serve 되고 있는 ollama 영향아닐까 생각할 수 있는데

로컬 ollama를 꺼도 증상은 똑같았다

 

자 컨테이너 속으로 들어가 보자 (CTRL + D 누르면 나와짐)

docker exec -it ollama

이러면 프롬포트가 바뀌면서 ollama container 내부로 들어가진다

Error: listen tcp 0.0.0.0:11434: bind: address already in use

의 오류가 나는 이유는 

COMMAND 항목에 /bin/ollama serve가 표시되어 있는데,

해당 컨테이너가 시작될 때 그 명령어를 메인 프로세스로 실행하고 있기 때문에

이미 bind를 걸었다는 것이다.

그럼 실행되고 있는데 왜 외부에서는 접속이 안 되었던 걸까

ollama ps

실행되고 있는 것을 찍어보면 지금 port가 11434/tcp로 되어있는데

0.0.0.0:11434->11434/tcp처럼 되어야 외부 바인딩이 걸리는 것이다

이거는 Container를 만들 때 지정을 해줘야 하는데

기존에 container를 만들 때

docker-compose up -d

으로 docker-compose.yaml을 실행시켜서 만들었으나

공식 Github는 외부 바인딩을 고려하지 않고 yaml을 만들었기 때문에

아래같이 바꿔줘야 한다

#docker-compose.yaml
services:
  ollama:
    volumes:
      - ollama:/root/.ollama
    container_name: ollama
    pull_policy: always
    tty: true
    restart: unless-stopped
    image: ollama/ollama:${OLLAMA_DOCKER_TAG-latest}
    ports:
      - "11434:11434"   # 외부 바인딩 추가

 

해결 방법

근데 나는 이미 늦었는데 우짜냐....

Container 삭제하고 다시 만드는 방법이 정답이다

docker stop ollama
docker rm ollama

 

자 새로 받기 전에 docker-compose.yaml을 다음과 같이 바꿔주자

#docker-compose.yaml
services:
  ollama:
    # GPU support
    deploy:
      resources:
        reservations:
          devices:
            - driver: ${OLLAMA_GPU_DRIVER-nvidia}
              count: ${OLLAMA_GPU_COUNT-1}
              capabilities:
                - gpu
    volumes:
      - ollama:/root/.ollama
    container_name: ollama
    pull_policy: always
    tty: true
    restart: unless-stopped
    image: ollama/ollama:${OLLAMA_DOCKER_TAG-latest}
    # Expose Ollama API outside the container stack
    ports:
      - ${OLLAMA_WEBAPI_PORT-11434}:11434


  open-webui:
    build:
      context: .
      args:
        OLLAMA_BASE_URL: '/ollama'
      dockerfile: Dockerfile
    image: ghcr.io/open-webui/open-webui:${WEBUI_DOCKER_TAG-main}
    container_name: open-webui
    volumes:
      - open-webui:/app/backend/data
    depends_on:
      - ollama
    ports:
      - ${OPEN_WEBUI_PORT-3000}:8080
    environment:
      - 'OLLAMA_BASE_URL=http://ollama:11434'
      - 'WEBUI_SECRET_KEY='
    extra_hosts:
      - host.docker.internal:host-gateway
    restart: unless-stopped

volumes:
  ollama: {}
  open-webui: {}

그 다음 새로 Container를 만들어 주고 그 안에 모델도 다운로드 해주자

cd open-webui
docker-compose up -d

이렇게 한다고 하면 이론적으로는 외부에서 연결이 되어야 한다

(방화벽 세팅까지 끝났다는 가정하에)


외부와 포트가 열려있는지 확인하려면 다음을 실행시켜보면

# PowerShell
netsh interface portproxy show all

# linux
netstat -tlnp

해당 포트가 수신 대기 중인지를 확인할 수 있다

이랬는데 왜 안되는 것일까

나같은 경우는 윈도우에 WSL를 이용하여 Linux처럼 쓰고 있는데

WSL → 윈도우 호스트 포트 포워딩 설정이 되지 않아 생겼던 문제 였다

#linux
netsh interface portproxy add v4tov4 listenport=11434 listenaddress=<서버 IP> connectport=11434 connectaddress=127.0.0.1

 

외부에서 정상 동작 확인 완료

 

Web_ui의 경우는

PS C:\Users\Administrator> netsh interface portproxy add v4tov4 listenport=3000 listenaddress=<서버IP> connectport=3000 connectaddress=localhost

으로 해결

Error Shooting 1

docker: Error response from daemon: could not select device driver with capabilities: [[gpu]]

이건 nvidia-container-toolkit 가 안 깔려 있어서 생기는 문제이다

나 같은 경우는 다음과 같이 해결하였다 (참고로 Window환경에서 WSL로 Linux를 사용하고 있다)

(Toolkit 관련 이것저것 삽질한 이력이 있다면 1번 부터 아니면 2번 부터)

# 1. 잘못된 저장소 파일 삭제
sudo rm /etc/apt/sources.list.d/libnvidia-container.list
sudo rm /etc/apt/sources.list.d/*nvidia*.list

# 2. 아키텍처 변수 설정
ARCH=$(dpkg --print-architecture)

# 3. GPG 키 등록
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

# 4. generic deb 저장소 등록 (배포판 이름 없이)
echo "deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] \
https://nvidia.github.io/libnvidia-container/stable/deb/${ARCH} /" | \
sudo tee /etc/apt/sources.list.d/libnvidia-container.list

# 5. 업데이트 및 설치
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit

# 6. Docker 재시작
sudo systemctl restart docker
728x90