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






Поэтому удалите оператор 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
Огромное спасибо, теперь все работает как положено. Без тебя бы не справился!
Рад был помочь! Не могли бы вы отметить это как принятый ответ? @PiotrGrochowski
Похоже, на вашем хост-компьютере работает LLM, верно? Команда Exposure открывает порт в контейнере, то есть вы открываете порт в контейнере, где модель не работает. Вам нужно будет изменить сеть в контейнере на HOST, чтобы он мог видеть службы, работающие в вашей локальной сети, и подключаться к порту OLLAMA, а не раскрывать их в контейнере. Чтобы рассказать вам, как это сделать, нам нужно увидеть, какой контейнер вы пытаетесь запустить.