Ворклог по задаче "Настроить на сервере локальный docker registry"
Запускаем на сервере свой собственный регистри
Это позволит нам локально на сервере иметь репозиторий образов, чтобы можно было в них заливать свои образы и из них создавать и запускать конечные контейнеры.
docker run -d \
-p 127.0.0.1:5000:5000 \
--restart always \
--name registry \
registry:2
127.0.0.1:5000:5000 - это чтобы плушал на 5000 порту только локальные соединения, иначе даже не смотря на фаервол, порт будет открыт наружу, а никак не хочется лишний раз заморачиваться с настройками доступов. Тут же мы будем использовать реверс-прокси, так что доступ будет только локальный.
--restart always - это чтобы контейнер автоматически перезапускался, то есть работал всегда.
--name registry - просто имя, чтобы проще было видеть в списке контейнеров sh docker ps
registry:2 - имя образа из докер-хаба.
Собираем локально свой образ
Конечно же конечные докер-композ проекты могут сильно отличаться, так что команда сборки образа может отличаться, но у меня задача касается моего агента https://github.com/haih-net/agent/tree/main/docker и там у меня несколько конфигов. Для прода нужны эти два конфига
docker compose -f docker-compose.yml -f docker-compose.prod.yml build app
Если все прошло ОК и образ собрался, то должны в конце увидеть что-то типа такого:
[+] Building 2/2lt c6cfb7caa875
✔ Service app Built 269.2s
✔ app Built
Для нас тут важен хеш c6cfb7caa875. Посмотрим немного информации о нем.
docker inspect c6cfb7caa875 | head -10
[
{
"Id": "sha256:c6cfb7caa875cf984db7fcf13bc6a886e92ddbe091f1c824a5aa871ab711bd59",
"RepoTags": [
"fi1osof-ru-agent-app:latest"
],
"RepoDigests": [],
"Parent": "sha256:96a5516e1319785787c218b1f04415763e20ea4b135e906d1b4138d0b7d82ae9",
"Comment": "",
"Created": "2026-06-10T21:41:51.224372504Z",
Вот тут вот есть RepoTags fi1osof-ru-agent-app:latest, его я и использую и закоммичу.
docker tag fi1osof-ru-agent-app:latest localhost:5000/fi1osof-agent-app:latest
Это надо, чтобы докер понимал, куда пушить образ. Но это не точно. Делал по инструкции и не до конца понимаю когда что необходимо, но по логике ему это надо.
Отправка образа с локальной машины в регистри сервера
Вот тут немного магия начинается, потому что кманда для пушу у нас такая:
docker push localhost:5000/fi1osof-agent-app:latest
Но сейчас, если мы ее выполним, получаем такое:
The push refers to repository [localhost:5000/fi1osof-agent-app]
Get "http://localhost:5000/v2/": dial tcp 127.0.0.1:5000: connect: connection refused
Это потому что пушим мы на локальный порт и логично, что тут у нас регистри нету - он же на сервере. Почему так и что нам сделать чтобы это исправить? Как я и говорил выше, мне не хочется заморачиваться с публичными доступами, поэтому применяется простой хак - ssh-тунель. Это такое соединение, когда локальный порт связывается с портом целевого сервера по протоколу ssh. Условно, когда такое соединение установлено, наш локальный порт становится окном в порт целевого сервера.
Вот команда. Только выполняйте ее в отдельной вкладке терминала, так как это не фоновый процесс будет и он займет вкладку.
ssh -L 5000:localhost:5000 root@example.com
Вместо example.com конечно же указываете свой сервер или айпи, и конечно же на сервере должен быть доступен ssh.
Если все хорошо, то вы увидите, что вы зашли на сервер по ssh, все как обычно. Но разница в том, что у вас теперь должен локально быть доступен 5000 порт. Првоерим, что он работает и регистри отвечает.
ssh -L 5000:localhost:5000 root@fi1osof.ru
Если все ОК, то придет как минимум пустой объект {}.
Теперь можно опять пробовать пушить свой образ. Если все ОК, то побегут запросики :-). Конечно же это время некоторое займет, особенно если образ несколько гигов весит.
Скачиваем образ на сервере
Самый простой способ, это добавить в композ-файл источник образа
# git diff
diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml
index 72c18f8..9b8c69f 100644
--- a/docker/docker-compose.prod.yml
+++ b/docker/docker-compose.prod.yml
@@ -8,6 +8,7 @@ services:
- 443:443
app:
+ image: localhost:5000/fi1osof-agent-app:latest
restart: unless-stopped
build:
args:
Сейчас это у меня хардкод на сервере, надо будет потом подумать как правильней сделать.
После этого можно скачавать прям через композ
docker compose -f docker-compose.yml -f docker-compose.prod.yml pull app