Ворклог по задаче "Настроить на сервере локальный docker registry"

10 июн. 2026 г., 22:46:39

Запускаем на сервере свой собственный регистри

Это позволит нам локально на сервере иметь репозиторий образов, чтобы можно было в них заливать свои образы и из них создавать и запускать конечные контейнеры.


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
10.06.2026