#12 DevOps. Docker. Как сделать свой DockerHub

Пример простого аналога DockerHub для тестовой среды

sudo apt update

sudo apt -y install openjdk-8-jre-headless

java -version // проверьте сколько версий установлено

sudo update-alternatives --config java // если несколько, то выполните команду и выберите 8

sudo wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz 

sudo tar -zxvf latest-unix.tar.gz -C /opt

cd /opt

sudo mv nexus-3.68.1-02/ nexus/ // возможно у вас уже будет другая версия

sudo adduser nexus // зададим пароль

sudo usermod -s /usr/sbin/nologin nexus

sudo visudo 

// находим # User privilege specification и добавляем

nexus ALL=(ALL) NOPASSWD: ALL

sudo chown -R nexus:nexus nexus/ sonatype-work/


sudo nano /opt/nexus/bin/nexus.rc

run_as_user="nexus"


sudo nano /etc/systemd/system/nexus.service 

[Unit]
Description=nexus service
After=network.target
[Service]
Type=forking
LimitNOFILE=65536
ExecStart=/opt/nexus/bin/nexus start
ExecStop=/opt/nexus/bin/nexus stop
User=nexus
Restart=on-abort
[Install]
WantedBy=multi-user.target


sudo systemctl start nexus

systemctl status nexus

sudo systemctl enable nexus

tail -f /opt/sonatype-work/nexus3/log/nexus.log // подождем и проверим пока все запустится - ждем Started Sonatype Nexus OSS

Откроем браузер

ip-address:8081

Узнаем наш пароль

cat /opt/sonatype-work/nexus3/admin.password

Жмем Sign In (правый верхний угол) и логинимся — admin и ваш пароль

Далее выполним то, что нам предлагает Setup wizard

  • зададим пароль
  • отключим или оставим анонимный доступ (помним про ИБ)
  • finish

Создадим свой локальный репозиторий

В Веб-интерфейсе нажимаем на значок шестеренки и выбираем слева Repositories -> Create repository -> docker (hosted)

Задаем имя — например devopslife

Ниже http ставим галочку и прописываем порт — например 8082

Нажимаем Create registry

Поправим daemon.json для доступа по http + установим зеркало // у вас будет свой ip

sudo nano /etc/docker/daemon.json

{
 "registry-mirrors" : [ "https://dockerhub.timeweb.cloud" ],

 "insecure-registries" : [ "http://192.168.2.170:8082" ]
}


sudo systemctl restart docker

sudo systemctl status docker

sudo dockerd // если вдруг перезапустится с ошибкой

docker login 192.168.2.170:8082 // проверяем - admin и ваш пароль

Login Succeeded

Проверим

docker pull alpine

docker images

docker tag alpine:latest 192.168.2.170:8082/alpine-devopslife

docker push 192.168.2.170:8082/alpine-devopslife

В веб-интерфейсе выбираем Browse -> devopslife (наш репозиторий) и видим в нем образ alpine-devopslife

Настроим https

cd /opt/nexus/etc/ssl

sudo keytool -genkeypair -keystore keystore.jks -storepass devopslife12345 -keypass devopslife12345 -alias jetty -keyalg RSA -keysize 2048 -validity 1000 -dname "CN=*.${NEXUS_DOMAIN}, OU=test, O=test1, L=Unspecified, ST=Unspecified, C=RU" -ext "SAN=DNS:nexus-repo.com,IP:192.168.2.170" -ext "BC=ca:true"

sudo keytool -export -alias jetty -keystore keystore.jks -rfc -file nexus.cert

sudo nano /opt/nexus/etc/nexus-default.properties 

Находим # Jetty section и пропишем

application-port-ssl=8443

nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-https.xml,${jetty.etc}/jetty-requestlog.xml

Далее

sudo nano /opt/nexus/etc/jetty/jetty-https.xml 

Находим sslContextFactory и в KeyStorePassword, KeyManagerPassword, TrustStorePassword прописываем devopslife12345 (вы прописываете свой пароль заданный ранее)

sudo systemctl restart nexus

sudo systemctl status nexus

sudo apt -y install  ca-certificates 

sudo mv nexus.cert nexus.crt

sudo cp nexus.crt  /usr/local/share/ca-certificates 

sudo update-ca-certificates

Далее в веб-интерфейсе в настройках нашего репозитория выбираем https, ставим галочку и задаем порт — например 8083. Нажимаем Save

Наш домен, какой мы выбрали ранее nexus-repo.com должен быть прописан или в hosts или в DNS на роутере (или вашем DNS сервере). Проверьте, что ping nexus-repo.com проходит.

Далее проверяем

docker login nexus-repo.com:8083

Login Succeeded

Если появляется ошибка x509: certificate signed by unknown authority

sudo service docker restart

Проверим

docker pull nginx

docker images

docker tag nginx:latest nexus-repo.com:8083/nginx-devopslife

docker push nexus-repo.com:8083/nginx-devopslife

Видим наш образ