Открытие порта 11434 в контейнере Docker для доступа к локальной модели Ollama

Я пытаюсь подключить локальную модель Ollama 2, которая использует порт 11434 на моем локальном компьютере, к моему контейнеру Docker под управлением Linux Ubuntu 22.04. Я могу подтвердить, что модель Олламы определенно работает и доступна через http://localhost:11434/. В моем контейнере Docker я также запускаю службу GmailCTL и смог успешно подключиться к API Google/Gmail для чтения и отправки электронных писем из учетной записи Google. Теперь я хочу дождаться электронного письма и позволить LLM ответить на него отправителю. Однако я не могу опубликовать порт 11434, чтобы соединить модель с контейнером.

Я попытался настроить файл devcontainer.json для перенаправления портов: { "name": "therapyGary", "build": { "context": "..", "dockerfile": "../Dockerfile" }, "forwardPorts": [80, 8000, 8080, 11434] }

Я попытался открыть порты в Dockerfile:

РАЗВЕРНУТЬ 80 ВЫСТАВКА 8000 ВЫСТАВКА 8080 ЭКСПОЗИЦИЯ 11434`

Кажется, они добавляют порты в контейнер, и Docker знает о них, но когда я проверяю статус порта для используемого в данный момент образа, я получаю следующее сообщение: «Ошибка: для 5ae41009199a не опубликован общедоступный порт «11434»»

Я также попробовал настроить файл docker-compose.yaml: services: my_service: image: 53794c7c792C# Replace with your actual Docker image name ports: - "11434:11434" - "8000:8000" - "8080:8080" - "80:80"

Но похоже с ним есть проблема, когда любой контейнер с ним автоматически останавливается.

Я попытался остановить модель Олламы перед запуском контейнера, чтобы не создавать конфликт, но это тоже не помогло. Любые предложения очень приветствуются.

Спасибо!

-- редактировать -- добавление кода Dockerfile: ОТ Ubuntu: 22.04

ENV DEBIAN_FRONTEND=неинтерактивный ENV GMAILCTL_VERSION=0.10.1

ЗАПУСК apt-get update && apt-get install -y
питон3
python3-пип
xdotool
локон
общие свойства программного обеспечения
либреофис
разархивируйте
&& apt-получить чистоту

RUN pip3 install --upgrade pip RUN pip3 install google-api-python-client google-auth-httplib2 запросы google-auth-oauthlib pandas

ВЫПОЛНИТЬ useradd -ms /bin/bash devuser

ВЫПОЛНИТЬ mkdir -p /workspace && chown -R devuser:devuser /workspace

Пользователь root

РАБОЧИЙ ДИАПОР /рабочая область

КОПИРОВАТЬ. .

RUN chown -R devuser:devuser /workspace

РАЗВЕРНУТЬ 80 ВЫСТАВКА 8000 ВЫСТАВКА 8080 ВЫСТАВКА 11434

CMD ["баш"]

Похоже, на вашем хост-компьютере работает LLM, верно? Команда Exposure открывает порт в контейнере, то есть вы открываете порт в контейнере, где модель не работает. Вам нужно будет изменить сеть в контейнере на HOST, чтобы он мог видеть службы, работающие в вашей локальной сети, и подключаться к порту OLLAMA, а не раскрывать их в контейнере. Чтобы рассказать вам, как это сделать, нам нужно увидеть, какой контейнер вы пытаетесь запустить.

halldk 30.06.2024 20:58

Да, верно, LLM работает на моем локальном компьютере с Windows, и я пытался подключиться к нему из моего контейнера Docker под управлением Linux. Однако ваш ответ заставил меня задуматься, почему бы просто не запустить LLM внутри контейнера, что я и сделал, и это решило проблему. Однако мне все равно было бы интересно решить эту проблему «трудным путем» только ради изучения нового трюка (если это не так уж сложно!). Я отредактировал исходное сообщение, чтобы оно содержало файл Dockerfile. Спасибо!

Piotr Grochowski 01.07.2024 23:36
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
1 173
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поэтому удалите оператор EXPOSE 11434, он позволит вам подключиться к службе в контейнере докеров, используя этот порт. 11434 работает на вашем хост-компьютере, а не в докер-контейнере.

Чтобы Docker-контейнер мог видеть порт 11434 на вашем хост-компьютере, вам необходимо использовать сетевой драйвер host, чтобы он мог видеть что угодно в вашей локальной сети. Для этого вы можете использовать параметр runArgs:

{ "name": "therapyGary", 
"build": 
  { "context": "..", 
    "dockerfile": "../Dockerfile" 
  }, 
"forwardPorts": [80, 8000, 8080, 11434] 
}

станет

{ "name": "therapyGary", 
"build": 
  { "context": "..", 
    "dockerfile": "../Dockerfile" 
  }, 
"runArgs": ["--net=host"]
}

Затем из вашего контейнера вы сможете связаться с LLM в порту 11434, указав localhost или 127.0.0.1 из вашего контейнера. Например. в netcat nc localhost 11434. Если вы используете Docker Desktop, вам необходимо включить сеть хоста, перейдя на вкладку Features in development в Settings и выбрав опцию Enable host networking, согласно документации здесь: Docker Desktop

Кстати, вы можете использовать --net=host или --network=host, оба работают на моем компьютере с Windows 11 и Docker Desktop.

Если вы хотите использовать yaml-файл для создания Docker, вам следует использовать параметр network_mode:

services: 
  my_service: 
    image: 53794c7c792c 
    # Replace with your actual Docker image name 
    network_mode: "host"

Поскольку вы помещаете контейнер в хост-сеть, нет необходимости раскрывать порты, поскольку это все равно, что подключить контейнер непосредственно к сети. См. Примечание в документации.

Использованная литература:

Особые свойства образа Dev-контейнера

Справочник по сетевому драйверу хоста Docker Engine

Огромное спасибо, теперь все работает как положено. Без тебя бы не справился!

Piotr Grochowski 12.07.2024 19:23

Рад был помочь! Не могли бы вы отметить это как принятый ответ? @PiotrGrochowski

halldk 16.07.2024 17:59

Другие вопросы по теме