[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/linux/k8s-private-registry":3,"mdc--hfh5qe-key":622,"mdc-u0ch50-key":641,"mdc-pg4w3o-key":657,"mdc--7gud7q-key":689,"mdc--kmvce-key":704,"mdc-ubzckm-key":719,"mdc-qbhlcx-key":740,"related-/guides/linux/k8s-authentication,/guides/linux/k8s-deployments,/guides/linux/docker-private-registry":755,"mdc-ppusv7-key":756},{"id":4,"title":5,"appliesTo":6,"author":10,"body":11,"canonical":557,"code":66,"createdAt":558,"description":559,"difficulty":560,"draft":561,"estimatedTime":562,"extension":563,"faq":564,"howToSteps":574,"howToTotalTime":590,"image":557,"keywords":591,"locale":601,"meta":602,"navigation":603,"path":604,"platform":605,"related":606,"section":610,"seo":611,"severity":66,"stem":612,"summary":613,"tags":614,"twitterCreator":557,"twitterSite":557,"type":620,"updatedAt":558,"__hash__":621},"content_ru/guides/linux/k8s-private-registry.md","Использование частного Docker-регистра в Kubernetes: пошаговое руководство",[7,8,9],"Kubernetes 1.24+","Docker 20.10+","Ubuntu 22.04","FixPedia Team",{"type":12,"value":13,"toc":544},"minimark",[14,19,23,27,48,52,57,60,142,145,149,152,202,209,213,220,327,331,334,348,352,355,469,472,476,499,503,533,540],[15,16,18],"h2",{"id":17},"введение-зачем-это-нужно","Введение / Зачем это нужно",[20,21,22],"p",{},"Частный Docker-регистр позволяет хранить и распространять образы внутри корпоративной инфраструктуры, повышая безопасность и контроль версий. В Kubernetes использование собственного реестра устраняет зависимость от публичных Docker Hub или Docker Hub Mirror, а также упрощает интеграцию с CI/CD-пайплайнами.",[15,24,26],{"id":25},"требования-подготовка","Требования / Подготовка",[28,29,30,39,42,45],"ul",{},[31,32,33,34,38],"li",{},"ОС ",[35,36,37],"strong",{},"Linux"," (например, Ubuntu 22.04) с установленным Docker (≥20.10) и kubectl (≥1.24).",[31,40,41],{},"Доступ к сети, где можно запустить контейнер реестра (обычно порт 5000).",[31,43,44],{},"Регистрационные данные для доступа к реестру (имя пользователя, пароль).",[31,46,47],{},"Базовые знания работы с Kubernetes-манифестами.",[15,49,51],{"id":50},"пошаговая-инструкция","Пошаговая инструкция",[53,54,56],"h3",{"id":55},"шаг-1-установка-и-запуск-частного-реестра","Шаг 1: Установка и запуск частного реестра",[20,58,59],{},"Запустите стандартный Docker-регистр в режиме демона, чтобы он был доступен по хосту или внутренним сервисам кластера.",[61,62,67],"pre",{"className":63,"code":64,"language":65,"meta":66,"style":66},"language-bash shiki shiki-themes github-light github-dark","docker run -d \\\n  --restart=always \\\n  --publish 5000:5000 \\\n  --volume $(docker info --format '{{.DockerRootDir}}/registry:/var/lib/registry') \\\n  registry:2\n","bash","",[68,69,70,90,98,109,136],"code",{"__ignoreMap":66},[71,72,75,79,83,87],"span",{"class":73,"line":74},"line",1,[71,76,78],{"class":77},"sScJk","docker",[71,80,82],{"class":81},"sZZnC"," run",[71,84,86],{"class":85},"sj4cs"," -d",[71,88,89],{"class":85}," \\\n",[71,91,93,96],{"class":73,"line":92},2,[71,94,95],{"class":85},"  --restart=always",[71,97,89],{"class":85},[71,99,101,104,107],{"class":73,"line":100},3,[71,102,103],{"class":85},"  --publish",[71,105,106],{"class":81}," 5000:5000",[71,108,89],{"class":85},[71,110,112,115,119,121,124,127,130,133],{"class":73,"line":111},4,[71,113,114],{"class":85},"  --volume",[71,116,118],{"class":117},"sVt8B"," $(",[71,120,78],{"class":77},[71,122,123],{"class":81}," info",[71,125,126],{"class":85}," --format",[71,128,129],{"class":81}," '{{.DockerRootDir}}/registry:/var/lib/registry'",[71,131,132],{"class":117},") ",[71,134,135],{"class":85},"\\\n",[71,137,139],{"class":73,"line":138},5,[71,140,141],{"class":81},"  registry:2\n",[20,143,144],{},"Команда создает контейнер, который хранит образы в том же файловом хранилище, что и локальный Docker-демон.",[53,146,148],{"id":147},"шаг-2-создание-секрета-аутентификации-в-kubernetes","Шаг 2: Создание секрета аутентификации в Kubernetes",[20,150,151],{},"Сгенерируйте секрет Docker в кластере, используя учетные данные реестра.",[61,153,155],{"className":63,"code":154,"language":65,"meta":66,"style":66},"kubectl create secret docker-registry my-registry-secret \\\n  --docker-server=https://registry.example.com:5000 \\\n  --docker-username=youruser \\\n  --docker-password=yourpassword \\\n  --docker-email=you@example.com\n",[68,156,157,176,183,190,197],{"__ignoreMap":66},[71,158,159,162,165,168,171,174],{"class":73,"line":74},[71,160,161],{"class":77},"kubectl",[71,163,164],{"class":81}," create",[71,166,167],{"class":81}," secret",[71,169,170],{"class":81}," docker-registry",[71,172,173],{"class":81}," my-registry-secret",[71,175,89],{"class":85},[71,177,178,181],{"class":73,"line":92},[71,179,180],{"class":85},"  --docker-server=https://registry.example.com:5000",[71,182,89],{"class":85},[71,184,185,188],{"class":73,"line":100},[71,186,187],{"class":85},"  --docker-username=youruser",[71,189,89],{"class":85},[71,191,192,195],{"class":73,"line":111},[71,193,194],{"class":85},"  --docker-password=yourpassword",[71,196,89],{"class":85},[71,198,199],{"class":73,"line":138},[71,200,201],{"class":85},"  --docker-email=you@example.com\n",[20,203,204,205,208],{},"Секрет кодируется в base64 и хранится в namespace ",[68,206,207],{},"default"," (или указанном вами).",[53,210,212],{"id":211},"шаг-3-добавление-секрета-в-узлы-или-pod","Шаг 3: Добавление секрета в узлы или Pod",[20,214,215,216,219],{},"Укажите ",[68,217,218],{},"imagePullSecrets"," в манифесте Pod (или в сервисном аккаунте), чтобы поды могли извлекать секреты из Kubernetes.",[61,221,225],{"className":222,"code":223,"language":224,"meta":66,"style":66},"language-yaml shiki shiki-themes github-light github-dark","apiVersion: v1\nkind: Pod\nmetadata:\n  name: myapp\nspec:\n  containers:\n  - name: app\n    image: registry.example.com:5000/myapp:latest\n  imagePullSecrets:\n  - name: my-registry-secret\n","yaml",[68,226,227,239,249,257,267,274,282,296,307,315],{"__ignoreMap":66},[71,228,229,233,236],{"class":73,"line":74},[71,230,232],{"class":231},"s9eBZ","apiVersion",[71,234,235],{"class":117},": ",[71,237,238],{"class":81},"v1\n",[71,240,241,244,246],{"class":73,"line":92},[71,242,243],{"class":231},"kind",[71,245,235],{"class":117},[71,247,248],{"class":81},"Pod\n",[71,250,251,254],{"class":73,"line":100},[71,252,253],{"class":231},"metadata",[71,255,256],{"class":117},":\n",[71,258,259,262,264],{"class":73,"line":111},[71,260,261],{"class":231},"  name",[71,263,235],{"class":117},[71,265,266],{"class":81},"myapp\n",[71,268,269,272],{"class":73,"line":138},[71,270,271],{"class":231},"spec",[71,273,256],{"class":117},[71,275,277,280],{"class":73,"line":276},6,[71,278,279],{"class":231},"  containers",[71,281,256],{"class":117},[71,283,285,288,291,293],{"class":73,"line":284},7,[71,286,287],{"class":117},"  - ",[71,289,290],{"class":231},"name",[71,292,235],{"class":117},[71,294,295],{"class":81},"app\n",[71,297,299,302,304],{"class":73,"line":298},8,[71,300,301],{"class":231},"    image",[71,303,235],{"class":117},[71,305,306],{"class":81},"registry.example.com:5000/myapp:latest\n",[71,308,310,313],{"class":73,"line":309},9,[71,311,312],{"class":231},"  imagePullSecrets",[71,314,256],{"class":117},[71,316,318,320,322,324],{"class":73,"line":317},10,[71,319,287],{"class":117},[71,321,290],{"class":231},[71,323,235],{"class":117},[71,325,326],{"class":81},"my-registry-secret\n",[53,328,330],{"id":329},"шаг-4-использование-реестра-в-манифесте-pod","Шаг 4: Использование реестра в манифесте Pod",[20,332,333],{},"Установите URL-адрес образа, который указывает на приватный реестр, а не на публичный Docker Hub. Синтаксис тот же, что и для любого репозитория Docker.",[61,335,337],{"className":222,"code":336,"language":224,"meta":66,"style":66},"image: registry.example.com:5000/myapp:latest\n",[68,338,339],{"__ignoreMap":66},[71,340,341,344,346],{"class":73,"line":74},[71,342,343],{"class":231},"image",[71,345,235],{"class":117},[71,347,306],{"class":81},[53,349,351],{"id":350},"шаг-5-интеграция-с-cicd","Шаг 5: Интеграция с CI/CD",[20,353,354],{},"Добавьте учетные данные реестра в вашу CI/CD-систему, чтобы автоматически собирать и отправлять образы в приватный реестр.",[61,356,358],{"className":222,"code":357,"language":224,"meta":66,"style":66},"jobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Build and push\n        env:\n          REGISTRY: registry.example.com:5000\n          USERNAME: ${{ secrets.REGISTRY_USER }}\n          PASSWORD: ${{ secrets.REGISTRY_PASS }}\n        run: |\n          echo \"$PASSWORD\" | docker login $REGISTRY --username $USERNAME --password-stdin\n          docker build -t $REGISTRY/myapp:latest .\n          docker push $REGISTRY/myapp:latest\n",[68,359,360,367,374,384,391,403,410,420,430,440,451,457,463],{"__ignoreMap":66},[71,361,362,365],{"class":73,"line":74},[71,363,364],{"class":231},"jobs",[71,366,256],{"class":117},[71,368,369,372],{"class":73,"line":92},[71,370,371],{"class":231},"  build",[71,373,256],{"class":117},[71,375,376,379,381],{"class":73,"line":100},[71,377,378],{"class":231},"    runs-on",[71,380,235],{"class":117},[71,382,383],{"class":81},"ubuntu-latest\n",[71,385,386,389],{"class":73,"line":111},[71,387,388],{"class":231},"    steps",[71,390,256],{"class":117},[71,392,393,396,398,400],{"class":73,"line":138},[71,394,395],{"class":117},"      - ",[71,397,290],{"class":231},[71,399,235],{"class":117},[71,401,402],{"class":81},"Build and push\n",[71,404,405,408],{"class":73,"line":276},[71,406,407],{"class":231},"        env",[71,409,256],{"class":117},[71,411,412,415,417],{"class":73,"line":284},[71,413,414],{"class":231},"          REGISTRY",[71,416,235],{"class":117},[71,418,419],{"class":81},"registry.example.com:5000\n",[71,421,422,425,427],{"class":73,"line":298},[71,423,424],{"class":231},"          USERNAME",[71,426,235],{"class":117},[71,428,429],{"class":81},"${{ secrets.REGISTRY_USER }}\n",[71,431,432,435,437],{"class":73,"line":309},[71,433,434],{"class":231},"          PASSWORD",[71,436,235],{"class":117},[71,438,439],{"class":81},"${{ secrets.REGISTRY_PASS }}\n",[71,441,442,445,447],{"class":73,"line":317},[71,443,444],{"class":231},"        run",[71,446,235],{"class":117},[71,448,450],{"class":449},"szBVR","|\n",[71,452,454],{"class":73,"line":453},11,[71,455,456],{"class":81},"          echo \"$PASSWORD\" | docker login $REGISTRY --username $USERNAME --password-stdin\n",[71,458,460],{"class":73,"line":459},12,[71,461,462],{"class":81},"          docker build -t $REGISTRY/myapp:latest .\n",[71,464,466],{"class":73,"line":465},13,[71,467,468],{"class":81},"          docker push $REGISTRY/myapp:latest\n",[470,471],"in-article-ad",{},[15,473,475],{"id":474},"проверка-результата","Проверка результата",[477,478,479,486,492],"ol",{},[31,480,481,482,485],{},"Проверьте, что реестр работает: ",[68,483,484],{},"curl http://registry.example.com:5000/v2/_catalog",".",[31,487,488,489,485],{},"Проверьте, что под получил секрет: ",[68,490,491],{},"kubectl get pod myapp -o yaml | grep imagePullSecrets",[31,493,494,495,498],{},"Просмотрите логи пода: ",[68,496,497],{},"kubectl logs myapp",". Если образ успешно загружен, в логах должна появиться запись о старте контейнера.",[15,500,502],{"id":501},"возможные-проблемы","Возможные проблемы",[28,504,505,511,517,527],{},[31,506,507,510],{},[35,508,509],{},"Неверный пароль или имя пользователя"," – Проверьте данные для входа в реестр и корректность секрета в Kubernetes.",[31,512,513,516],{},[35,514,515],{},"ImagePullBackoff"," – Убедитесь, что URL-адрес образа соответствует секрету, а DNS-имя реестра разрешается из подов.",[31,518,519,522,523,526],{},[35,520,521],{},"Недоступен порт 5000"," – Убедитесь, что контейнер реестра запущен (",[68,524,525],{},"docker ps",") и сетевое правило позволяет подключение.",[31,528,529,532],{},[35,530,531],{},"Недостаточные привилегии"," – Запустите под с ServiceAccount, имеющим права на чтение секретов в необходимом namespace.",[20,534,535,536,539],{},"Если проблема сохраняется, проверьте логи контроллера управления контейнерами (",[68,537,538],{},"kubectl logs -n kube-system \u003Cконтроллер>",") для выявления причин неудачной попытки извлечения образа.",[541,542,543],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":66,"searchDepth":92,"depth":92,"links":545},[546,547,548,555,556],{"id":17,"depth":92,"text":18},{"id":25,"depth":92,"text":26},{"id":50,"depth":92,"text":51,"children":549},[550,551,552,553,554],{"id":55,"depth":100,"text":56},{"id":147,"depth":100,"text":148},{"id":211,"depth":100,"text":212},{"id":329,"depth":100,"text":330},{"id":350,"depth":100,"text":351},{"id":474,"depth":92,"text":475},{"id":501,"depth":92,"text":502},null,"2026-07-09 12:20:59","Узнайте, как настроить частный Docker-регистр в Kubernetes, аутентифицироваться и использовать изображения. Пошаговая инструкция за 10 минут с подробными примерами команд.","medium",false,"10-15 мин","md",[565,568,571],{"question":566,"answer":567},"Как создать секрет для приватного реестра в Kubernetes?","Используйте команду `kubectl create secret docker-registry \u003Cимя-секрета> --docker-server=URL_РЕЕСТРА --docker-username=ЛОГИН --docker-password=ПАРОЛЬ --docker-email=EMAIL`.",{"question":569,"answer":570},"Почему поды не могут получить доступ к приватному реестру?","Проверьте правильность секрета, network policy и `imagePullSecrets` в манифесте Pod.",{"question":572,"answer":573},"Как настроить CI/CD для использования приватного реестра?","Добавьте `registry` и `secrets` в конфигурацию CI/CD (например, GitHub Actions) и установите `IMAGE_REGISTRY=registry.example.com:5000`.",[575,578,581,584,587],{"name":576,"text":577},"Установка и запуск частного реестра","Запустите стандартный Docker-регистр в контейнере, чтобы получить доступный сервис на порту 5000. `docker run -d --restart=always --publish 5000:5000 --volume $(docker info --format '{{.DockerRootDir}}/registry:/var/lib/registry') registry:2`",{"name":579,"text":580},"Создание секрета аутентификации в Kubernetes","Сгенерируйте секрет Docker в кластере. `kubectl create secret docker-registry my-registry-secret --docker-server=https://registry.example.com:5000 --docker-username=youruser --docker-password=yourpassword --docker-email=you@example.com`",{"name":582,"text":583},"Добавление секрета в узлы или Pod","Укажите `imagePullSecrets` в манифесте Pod или в сервисном аккаунте. `imagePullSecrets: - name: my-registry-secret`",{"name":585,"text":586},"Использование реестра в манифесте Pod","Установите URL образа, указывающий на приватный реестр. `image: registry.example.com:5000/myapp:latest`",{"name":588,"text":589},"Интеграция с CI/CD","Добавьте переменные окружения реестра и токен секрета в конфигурацию CI/CD. Пример для GitHub Actions:\n\n```yaml\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Build and push\n        env:\n          REGISTRY: registry.example.com:5000\n          USERNAME: ${{ secrets.REGISTRY_USER }}\n          PASSWORD: ${{ secrets.REGISTRY_PASS }}\n        run: |\n          echo \"$PASSWORD\" | docker login $REGISTRY --username $USERNAME --password-stdin\n          docker build -t $REGISTRY/myapp:latest .\n          docker push $REGISTRY/myapp:latest\n```","PT15M",[592,593,594,595,596,597,598,599,600],"частный Docker-регистр в Kubernetes","настроить приватный реестр","аутентификация в Kubernetes","использовать изображения из приватного реестра","kubectl create secret docker-registry","Docker config.json","Kubernetes секреты для реестра","токен Harbor/registry","CI/CD pipeline private registry","ru_RU",{},true,"/guides/linux/k8s-private-registry","linux",[607,608,609],"/guides/linux/k8s-authentication","/guides/linux/k8s-deployments","/guides/linux/docker-private-registry","Гайды Kubernetes",{"title":5,"description":559},"guides/linux/k8s-private-registry","В этом руководстве вы научитесь создать частный Docker-регистр, настроить аутентификацию в Kubernetes и развернуть приложения из этого реестра.",[615,616,617,618,619],"Kubernetes","Docker","private registry","CI/CD","registry auth","guide","dIXZNU_KSLEPwePApuxvNrLh5jzzQi-1uFsF-cF8PEE",{"data":623,"body":624},{},{"type":625,"children":626},"root",[627],{"type":628,"tag":20,"props":629,"children":630},"element",{},[631,634,640],{"type":632,"value":633},"text","Используйте команду ",{"type":628,"tag":68,"props":635,"children":637},{"className":636},[],[638],{"type":632,"value":639},"kubectl create secret docker-registry \u003Cимя-секрета> --docker-server=URL_РЕЕСТРА --docker-username=ЛОГИН --docker-password=ПАРОЛЬ --docker-email=EMAIL",{"type":632,"value":485},{"data":642,"body":643},{},{"type":625,"children":644},[645],{"type":628,"tag":20,"props":646,"children":647},{},[648,650,655],{"type":632,"value":649},"Проверьте правильность секрета, network policy и ",{"type":628,"tag":68,"props":651,"children":653},{"className":652},[],[654],{"type":632,"value":218},{"type":632,"value":656}," в манифесте Pod.",{"data":658,"body":659},{},{"type":625,"children":660},[661],{"type":628,"tag":20,"props":662,"children":663},{},[664,666,672,674,680,682,688],{"type":632,"value":665},"Добавьте ",{"type":628,"tag":68,"props":667,"children":669},{"className":668},[],[670],{"type":632,"value":671},"registry",{"type":632,"value":673}," и ",{"type":628,"tag":68,"props":675,"children":677},{"className":676},[],[678],{"type":632,"value":679},"secrets",{"type":632,"value":681}," в конфигурацию CI/CD (например, GitHub Actions) и установите ",{"type":628,"tag":68,"props":683,"children":685},{"className":684},[],[686],{"type":632,"value":687},"IMAGE_REGISTRY=registry.example.com:5000",{"type":632,"value":485},{"data":690,"body":691},{},{"type":625,"children":692},[693],{"type":628,"tag":20,"props":694,"children":695},{},[696,698],{"type":632,"value":697},"Запустите стандартный Docker-регистр в контейнере, чтобы получить доступный сервис на порту 5000. ",{"type":628,"tag":68,"props":699,"children":701},{"className":700},[],[702],{"type":632,"value":703},"docker run -d --restart=always --publish 5000:5000 --volume $(docker info --format '{{.DockerRootDir}}/registry:/var/lib/registry') registry:2",{"data":705,"body":706},{},{"type":625,"children":707},[708],{"type":628,"tag":20,"props":709,"children":710},{},[711,713],{"type":632,"value":712},"Сгенерируйте секрет Docker в кластере. ",{"type":628,"tag":68,"props":714,"children":716},{"className":715},[],[717],{"type":632,"value":718},"kubectl create secret docker-registry my-registry-secret --docker-server=https://registry.example.com:5000 --docker-username=youruser --docker-password=yourpassword --docker-email=you@example.com",{"data":720,"body":721},{},{"type":625,"children":722},[723],{"type":628,"tag":20,"props":724,"children":725},{},[726,727,732,734],{"type":632,"value":215},{"type":628,"tag":68,"props":728,"children":730},{"className":729},[],[731],{"type":632,"value":218},{"type":632,"value":733}," в манифесте Pod или в сервисном аккаунте. ",{"type":628,"tag":68,"props":735,"children":737},{"className":736},[],[738],{"type":632,"value":739},"imagePullSecrets: - name: my-registry-secret",{"data":741,"body":742},{},{"type":625,"children":743},[744],{"type":628,"tag":20,"props":745,"children":746},{},[747,749],{"type":632,"value":748},"Установите URL образа, указывающий на приватный реестр. ",{"type":628,"tag":68,"props":750,"children":752},{"className":751},[],[753],{"type":632,"value":754},"image: registry.example.com:5000/myapp:latest",[],{"data":757,"body":758},{},{"type":625,"children":759},[760,765,774],{"type":628,"tag":20,"props":761,"children":762},{},[763],{"type":632,"value":764},"Добавьте переменные окружения реестра и токен секрета в конфигурацию CI/CD. Пример для GitHub Actions:",{"type":628,"tag":61,"props":766,"children":769},{"className":767,"code":357,"language":224,"meta":66,"style":768},"language-yaml","undefined",[770],{"type":628,"tag":68,"props":771,"children":772},{"__ignoreMap":66},[773],{"type":632,"value":357},{"type":628,"tag":541,"props":775,"children":776},{},[777],{"type":632,"value":66}]