Поднять локально реестр образов docker на swarm

Для начала создадим label, что бы можно было поднять реестр только на одной ноде.

server1

docker node update server1 --label-add registry=true

Проинспектируем и убедимся что label был успешно добавлен

vagrant@server1:~$ docker node inspect server1 --pretty
ID:			zyzenb3c49rz3c46m3ygm9aog
Labels:
 - registry=true
Hostname:              	server1
Joined at:             	2023-12-10 10:59:43.366955226 +0000 utc
Status:
 State:			Ready
 Availability:         	Active
 Address:		10.11.10.1
Manager Status:
 Address:		10.11.10.1:2377
 Raft Status:		Reachable
 Leader:		Yes
Platform:
 Operating System:	linux
 Architecture:		x86_64
Resources:
 CPUs:			1
 Memory:		1.925GiB
Plugins:
 Log:		awslogs, fluentd, gcplogs, gelf, journald, json-file, local, logentries, splunk, syslog
 Network:		bridge, host, ipvlan, macvlan, null, overlay
 Volume:		local
Engine Version:		24.0.7
TLS Info:
 TrustRoot:
-----BEGIN CERTIFICATE-----
MIIBazCCARCgAwIBAgIUKlzjoll/2HbrP/ahSRLZo8KeQMcwCgYIKoZIzj0EAwIw
EzERMA8GA1UEAxMIc3dhcm0tY2EwHhcNMjMxMjEwMTA1NTAwWhcNNDMxMjA1MTA1
NTAwWjATMREwDwYDVQQDEwhzd2FybS1jYTBZMBMGByqGSM49AgEGCCqGSM49AwEH
A0IABOmsAQb3KqS1KR+0HTQQkA8zwnHAmCbbtL+c8e8HXwyIzLJMSBEoZRrSPzxQ
Piv1oLvG2jfVLJv8V8n6ObyK1+qjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
Af8EBTADAQH/MB0GA1UdDgQWBBSjFVfwMKDyYJELlg14BY454S5jXTAKBggqhkjO
PQQDAgNJADBGAiEAzEh7Jteq0ZRLXMRtwkj0zRgCZzYbLxiqhLbqX9KRzB8CIQDD
fxZd2+LQkhGO1EAE+foD/1C9eg9wQp0L//wTWq4YWw==
-----END CERTIFICATE-----
 
 Issuer Subject:	MBMxETAPBgNVBAMTCHN3YXJtLWNh
 Issuer Public Key:	MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE6awBBvcqpLUpH7QdNBCQDzPCccCYJtu0v5zx7wdfDIjMskxIEShlGtI/PFA+K/Wgu8baN9Usm/xXyfo5vIrX6g==

Создаем сервис с реестром docker образов:

vagrant@server1:~$ docker service create --name registry --publish 5000:5000 --constraint node.Labels.registry==true --mount type=bind,source=/home/vagrant/registry,destination=/var/lib/registry -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 registry:latest
3srd0mspdl9awp7mssoo3p5e7
overall progress: 1 out of 1 tasks 
1/1: running   [==================================================>] 
verify: Service converged 

На сервере server3 проверим как работает наш новый функционал

С клонируем проект из git

vagrant@server3:~$ git clone http://webmastermsk.ru:30000/serg/docker-demo.git
Cloning into 'docker-demo'...
remote: Enumerating objects: 135, done.
remote: Total 135 (delta 0), reused 0 (delta 0), pack-reused 135
Receiving objects: 100% (135/135), 482.37 KiB | 15.56 MiB/s, done.
Resolving deltas: 100% (36/36), done.
vagrant@server3:~$ ls
docker-demo

Соберем образ с тегом localhost:5000/api:latest

agrant@server3:~/docker-demo$ docker build -t localhost:5000/api:latest -f apps/api/Dockerfile .
[+] Building 161.1s (14/14) FINISHED

Далее пушим наш образ в реестр на server1

vagrant@server3:~/docker-demo$ docker push localhost:5000/api:latest
The push refers to repository [localhost:5000/api]
8f850b6e7ca2: Pushed 
43322bfa8cf3: Pushed 
8164e06aee77: Pushed 
1113e694e035: Pushed 
31f710dc178f: Pushed 
a599bf3e59b8: Pushed 
e67e8085abae: Pushed 
f1417ff83b31: Pushed 
latest: digest: sha256:bd6c7213e3509912704b0c10ba7222b97e7c7329690698623ed4c9292c2167b6 size: 1995

На сервере server5, спулим наш образ и реестра на server1

vagrant@server5:~$ docker pull localhost:5000/api:latest
latest: Pulling from api
f56be85fc22e: Pull complete 
8f665685b215: Pull complete 
e5fca6c395a6: Pull complete 
561cb69653d5: Pull complete 
6757c430064e: Pull complete 
2158aed08417: Pull complete 
374c9839c7ad: Pull complete 
20e909126ac1: Pull complete 
Digest: sha256:bd6c7213e3509912704b0c10ba7222b97e7c7329690698623ed4c9292c2167b6
Status: Downloaded newer image for localhost:5000/api:latest
localhost:5000/api:latest