{"id":3705,"date":"2025-12-22T03:01:45","date_gmt":"2025-12-22T00:01:45","guid":{"rendered":"https:\/\/dockerhosting.ru\/blog\/?p=3705"},"modified":"2025-12-22T05:06:12","modified_gmt":"2025-12-22T02:06:12","slug":"docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov","status":"publish","type":"post","link":"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/","title":{"rendered":"Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432"},"content":{"rendered":"\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_85 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A7%D1%82%D0%BE_%D1%82%D0%B0%D0%BA%D0%BE%D0%B5_Docker_Build_Offloading_%D0%B8_%D0%B7%D0%B0%D1%87%D0%B5%D0%BC_%D0%BE%D0%BD_%D0%BD%D1%83%D0%B6%D0%B5%D0%BD\" >\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Docker Build Offloading \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A2%D1%80%D0%B8_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D1%85_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%B0_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8\" >\u0422\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A1%D0%BF%D0%BE%D1%81%D0%BE%D0%B1_1_%D0%9D%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_Docker\" >\u0421\u043f\u043e\u0441\u043e\u0431 1: \u041d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 Docker<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A1%D0%BF%D0%BE%D1%81%D0%BE%D0%B1_2_%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_BuildKit_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%80%D0%BE%D0%B4%D0%B2%D0%B8%D0%BD%D1%83%D1%82%D0%BE%D0%B9_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8\" >\u0421\u043f\u043e\u0441\u043e\u0431 2: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 BuildKit \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A1%D0%BF%D0%BE%D1%81%D0%BE%D0%B1_3_Docker_Context_%E2%80%94_%D1%81%D0%B0%D0%BC%D1%8B%D0%B9_%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1\" >\u0421\u043f\u043e\u0441\u043e\u0431 3: Docker Context \u2014 \u0441\u0430\u043c\u044b\u0439 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F\" >\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A8%D0%B0%D0%B3_1_%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2_%D0%BD%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5\" >\u0428\u0430\u0433 1: \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A8%D0%B0%D0%B3_2_%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_Docker_%D0%BD%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5\" >\u0428\u0430\u0433 2: \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Docker \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A8%D0%B0%D0%B3_3_%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0\" >\u0428\u0430\u0433 3: \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A8%D0%B0%D0%B3_4_%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0\" >\u0428\u0430\u0433 4: \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_CICD_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D0%BC%D0%B8\" >\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 CI\/CD \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#GitLab_CI\" >GitLab CI<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#Jenkins\" >Jenkins<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_Dockerfile_%D0%B4%D0%BB%D1%8F_%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8\" >\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f Dockerfile \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3_%D0%B8_%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0\" >\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0430<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9F%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8\" >\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043b\u043e\u0433\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2\" >\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8\" >\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%84%D0%B5%D1%80%D0%BC%D1%8B_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8\" >\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0435\u0440\u043c\u044b \u0441\u0431\u043e\u0440\u043a\u0438<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80_%D1%81%D0%B1%D0%BE%D1%80%D1%89%D0%B8%D0%BA%D0%B0\" >\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9E%D0%B1%D0%BB%D0%B0%D1%87%D0%BD%D1%8B%D0%B5_%D0%B0%D0%BB%D1%8C%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%82%D0%B8%D0%B2%D1%8B\" >\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#Docker_Build_Cloud\" >Docker Build Cloud<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#AWS_CodeBuild\" >AWS CodeBuild<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#GitHub_Actions\" >GitHub Actions<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A1%D0%BE%D0%B2%D0%B5%D1%82%D1%8B_%D0%BF%D0%BE_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8\" >\u0421\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A3%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC\" >\u0423\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0_%C2%ABCannot_connect_to_the_Docker_daemon%C2%BB\" >\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: &#171;Cannot connect to the Docker daemon&#187;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0_%C2%ABx509_certificate_signed_by_unknown_authority%C2%BB\" >\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: &#171;x509: certificate signed by unknown authority&#187;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0_%D0%9C%D0%B5%D0%B4%D0%BB%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%BF%D1%80%D0%B8_%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%BC_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B5\" >\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u041c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%B7%D0%B0_5_%D0%BC%D0%B8%D0%BD%D1%83%D1%82\" >\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0430 5 \u043c\u0438\u043d\u0443\u0442<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%BB%D1%8F_Production\" >\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f Production<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#1_%D0%92%D1%8B%D0%B1%D0%BE%D1%80_%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8_%D0%B4%D0%BB%D1%8F_Production\" >1. \u0412\u044b\u0431\u043e\u0440 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0434\u043b\u044f Production<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82_A_BuildKit_%D1%81_Docker_Buildx_%D1%80%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D1%83%D0%B5%D1%82%D1%81%D1%8F\" >\u0412\u0430\u0440\u0438\u0430\u043d\u0442 A: BuildKit \u0441 Docker Buildx (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-34\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82_B_Kubernetes-based_Build_Farm\" >\u0412\u0430\u0440\u0438\u0430\u043d\u0442 B: Kubernetes-based Build Farm<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-35\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#2_%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_%D0%B2_Production\" >2. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 Production<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-36\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_HashiCorp_Vault_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE\" >\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 HashiCorp Vault (\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-37\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#Docker_daemonjson_%D1%81_%D1%83%D1%81%D0%B8%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C%D1%8E\" >Docker daemon.json \u0441 \u0443\u0441\u0438\u043b\u0435\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-38\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#3_%D0%91%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BD%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_%D0%B1%D0%B8%D0%BB%D0%B4-%D0%BD%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8\" >3. \u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0431\u0438\u043b\u0434-\u043d\u043e\u0434\u0430\u043c\u0438<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-39\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#NGINX_%D0%BA%D0%B0%D0%BA_Load_Balancer_%D1%81_health_checks\" >NGINX \u043a\u0430\u043a Load Balancer \u0441 health checks<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-40\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%98%D0%BB%D0%B8_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D0%BC_HAProxy\" >\u0418\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c HAProxy<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-41\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#4_%D0%A0%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BB%D0%BE%D0%B5%D0%B2\" >4. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0435\u0432<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-42\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D0%BA%D0%B5%D1%88_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_Redis_%D0%B8%D0%BB%D0%B8_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B5%D0%B5_%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5\" >\u041e\u0431\u0449\u0438\u0439 \u043a\u0435\u0448 \u0447\u0435\u0440\u0435\u0437 Redis \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-43\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_BuildKit_%D0%B4%D0%BB%D1%8F_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_S3_%D0%BA%D0%B5%D1%88%D0%B0\" >\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 BuildKit \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f S3 \u043a\u0435\u0448\u0430<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-44\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#5_%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_Production_CICD\" >5. \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Production CI\/CD<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-45\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#GitLab_CI_%D1%81_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%BE%D0%B9\" >GitLab CI \u0441 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-46\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#Jenkins_Pipeline_%D1%81_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0%D0%BC\" >Jenkins Pipeline \u0441 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u043d\u043e\u0434\u0430\u043c<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-47\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#6_%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3_%D0%B8_%D0%B0%D0%BB%D0%B5%D1%80%D1%82%D0%B8%D0%BD%D0%B3\" >6. \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-48\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#Prometheus_%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%B1%D0%B8%D0%BB%D0%B4-%D1%84%D0%B5%D1%80%D0%BC%D1%8B\" >Prometheus \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u0431\u0438\u043b\u0434-\u0444\u0435\u0440\u043c\u044b<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-49\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#Grafana_Dashboard_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3%D0%B0\" >Grafana Dashboard \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-50\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#7_%D0%A0%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%B8_maintenance_%D0%B1%D0%B8%D0%BB%D0%B4-%D0%BD%D0%BE%D0%B4\" >7. \u0420\u043e\u0442\u0430\u0446\u0438\u044f \u0438 maintenance \u0431\u0438\u043b\u0434-\u043d\u043e\u0434<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-51\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#Blue-Green_Deployment_%D0%B1%D0%B8%D0%BB%D0%B4-%D0%BD%D0%BE%D0%B4\" >Blue-Green Deployment \u0431\u0438\u043b\u0434-\u043d\u043e\u0434<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-52\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#8_%D0%A0%D0%B5%D0%B7%D0%B5%D1%80%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\" >8. \u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-53\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B1%D1%8D%D0%BA%D0%B0%D0%BF_%D0%BA%D0%B5%D1%88%D0%B0\" >\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u044d\u043a\u0430\u043f \u043a\u0435\u0448\u0430<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-54\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#9_%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80_Production_%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\" >9. \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 Production \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-55\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#Terraform_%D0%B4%D0%BB%D1%8F_%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B\" >Terraform \u0434\u043b\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-56\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D0%B8\" >\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-57\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%9A%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BC%D0%BE%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%B4%D0%BB%D1%8F_Production\" >\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f Production<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-58\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%91%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9_%D1%81%D1%82%D0%B0%D1%80%D1%82_Production\" >\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442 Production<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-59\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#%D0%97%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\" >\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\" id=\"h-\u0447\u0442\u043e-\u0442\u0430\u043a\u043e\u0435-docker-build-offloading-\u0438-\u0437\u0430\u0447\u0435\u043c-\u043e\u043d-\u043d\u0443\u0436\u0435\u043d\"><span class=\"ez-toc-section\" id=\"%D0%A7%D1%82%D0%BE_%D1%82%D0%B0%D0%BA%D0%BE%D0%B5_Docker_Build_Offloading_%D0%B8_%D0%B7%D0%B0%D1%87%D0%B5%D0%BC_%D0%BE%D0%BD_%D0%BD%D1%83%D0%B6%D0%B5%D0%BD\"><\/span>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Docker Build Offloading \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e: \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u043d\u0430 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u044f\u0436\u0435\u043b\u044b\u0439 Docker-\u043e\u0431\u0440\u0430\u0437. \u0418\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 10 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b, \u0442\u0440\u0430\u0442\u044f \u0432\u0440\u0435\u043c\u044f \u0438 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u0434\u0438\u0441\u043a\u0435. Docker Build Offloading \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u042d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430 \u0434\u043b\u044f:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043d\u0430 \u0441\u043b\u0430\u0431\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445<\/li>\n\n\n\n<li>\u041a\u043e\u043c\u0430\u043d\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u044b \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b \u0441\u0431\u043e\u0440\u043a\u0438<\/li>\n\n\n\n<li>\u041f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438 \u043e\u0431\u0440\u0430\u0437\u0430\u043c\u0438, \u0442\u0440\u0435\u0431\u0443\u044e\u0449\u0438\u043c\u0438 \u043c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<\/li>\n\n\n\n<li>\u0421\u0438\u0442\u0443\u0430\u0446\u0438\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0438 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u0442\u0440\u0438-\u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445-\u0441\u043f\u043e\u0441\u043e\u0431\u0430-\u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438\"><span class=\"ez-toc-section\" id=\"%D0%A2%D1%80%D0%B8_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D1%85_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%D0%B0_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D0%B8\"><\/span>\u0422\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u0441\u043f\u043e\u0441\u043e\u0431-1-\u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f-\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u0430\u044f-\u0441\u0431\u043e\u0440\u043a\u0430-docker\"><span class=\"ez-toc-section\" id=\"%D0%A1%D0%BF%D0%BE%D1%81%D0%BE%D0%B1_1_%D0%9D%D0%B0%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F_%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_Docker\"><\/span>\u0421\u043f\u043e\u0441\u043e\u0431 1: \u041d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 Docker<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430. \u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0441 \u0445\u043e\u0440\u043e\u0448\u0438\u043c\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438. \u0412\u043e\u0442 \u043a\u0430\u043a \u0435\u0433\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a Docker \u0434\u0435\u043c\u043e\u043d\u0443<\/em>\nsudo systemctl edit docker<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0412 \u043e\u0442\u043a\u0440\u044b\u0432\u0448\u0435\u043c\u0441\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">text<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[Service]\nExecStart=\nExecStart=\/usr\/bin\/dockerd -H fd:\/\/ -H tcp:\/\/0.0.0.0:2375<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0435\u043c\u043e\u043d\u0430:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo systemctl daemon-reload\nsudo systemctl restart docker<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0422\u0435\u043f\u0435\u0440\u044c \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u044b \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">export DOCKER_HOST=\"tcp:\/\/\u0432\u0430\u0448-\u0441\u0435\u0440\u0432\u0435\u0440:2375\"\ndocker build -t \u0432\u0430\u0448-\u043e\u0431\u0440\u0430\u0437 .<\/pre>\n\n\n\n<div class=\"wp-block-simple-note-info\">\u0412\u0430\u0436\u043d\u043e: \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435.<\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u0441\u043f\u043e\u0441\u043e\u0431-2-\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435-buildkit-\u0434\u043b\u044f-\u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0439-\u0441\u0431\u043e\u0440\u043a\u0438\"><span class=\"ez-toc-section\" id=\"%D0%A1%D0%BF%D0%BE%D1%81%D0%BE%D0%B1_2_%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_BuildKit_%D0%B4%D0%BB%D1%8F_%D0%BF%D1%80%D0%BE%D0%B4%D0%B2%D0%B8%D0%BD%D1%83%D1%82%D0%BE%D0%B9_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8\"><\/span>\u0421\u043f\u043e\u0441\u043e\u0431 2: \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 BuildKit \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">BuildKit \u2014 \u044d\u0442\u043e \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0442 Docker. \u041e\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c builder, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/em>\ndocker buildx create \\\n  --name \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439-\u0441\u0431\u043e\u0440\u0449\u0438\u043a \\\n  --driver docker-container \\\n  tcp:\/\/\u0441\u0435\u0440\u0432\u0435\u0440-\u0441\u0431\u043e\u0440\u043a\u0438:2375\n\n<em># \u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0435\u0433\u043e<\/em>\ndocker buildx use \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439-\u0441\u0431\u043e\u0440\u0449\u0438\u043a\n\n<em># \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437<\/em>\ndocker buildx build -t \u0432\u0430\u0448-\u043e\u0431\u0440\u0430\u0437 .<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u041f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e BuildKit \u0432 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u043c\u0443\u043b\u044c\u0442\u0438\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u043e\u0434\u043d\u0438\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 \u0438 \u0434\u043b\u044f Intel, \u0438 \u0434\u043b\u044f ARM \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u0441\u043f\u043e\u0441\u043e\u0431-3-docker-context-\u0441\u0430\u043c\u044b\u0439-\u0443\u0434\u043e\u0431\u043d\u044b\u0439-\u0441\u043f\u043e\u0441\u043e\u0431\"><span class=\"ez-toc-section\" id=\"%D0%A1%D0%BF%D0%BE%D1%81%D0%BE%D0%B1_3_Docker_Context_%E2%80%94_%D1%81%D0%B0%D0%BC%D1%8B%D0%B9_%D1%83%D0%B4%D0%BE%D0%B1%D0%BD%D1%8B%D0%B9_%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1\"><\/span>\u0421\u043f\u043e\u0441\u043e\u0431 3: Docker Context \u2014 \u0441\u0430\u043c\u044b\u0439 \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Docker Context \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u043a\u0430\u043a \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u0432 IDE:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/em>\ndocker context create \u0441\u0435\u0440\u0432\u0435\u0440-\u0441\u0431\u043e\u0440\u043a\u0438 \\\n  --docker \"host=tcp:\/\/\u0441\u0435\u0440\u0432\u0435\u0440:2375\"\n\n<em># \u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043d\u0430 \u043d\u0435\u0433\u043e<\/em>\ndocker context use \u0441\u0435\u0440\u0432\u0435\u0440-\u0441\u0431\u043e\u0440\u043a\u0438\n\n<em># \u0412\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b Docker \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/em>\ndocker build -t \u0432\u0430\u0448-\u043e\u0431\u0440\u0430\u0437 .\ndocker images  <em># \u041f\u043e\u043a\u0430\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0437\u044b \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/em>\n\n<em># \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043a \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0443<\/em>\ndocker context use default<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u042d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0443\u0434\u043e\u0431\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e-\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\"><span class=\"ez-toc-section\" id=\"%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D1%8F\"><\/span>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u041e\u0442\u043a\u0440\u044b\u0442\u044b\u0439 Docker \u043f\u043e\u0440\u0442 \u2014 \u044d\u0442\u043e \u0443\u0433\u0440\u043e\u0437\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0412\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 TLS \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u043e\u0442 \u043f\u043e\u0448\u0430\u0433\u043e\u0432\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u0448\u0430\u0433-1-\u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f-\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432-\u043d\u0430-\u0441\u0435\u0440\u0432\u0435\u0440\u0435\"><span class=\"ez-toc-section\" id=\"%D0%A8%D0%B0%D0%B3_1_%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2_%D0%BD%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5\"><\/span>\u0428\u0430\u0433 1: \u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442<\/em>\nopenssl genrsa -aes256 -out ca-key.pem 4096\nopenssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem\n\n<em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442<\/em>\nopenssl genrsa -out server-key.pem 4096\nopenssl req -subj \"\/CN=\u0432\u0430\u0448-\u0441\u0435\u0440\u0432\u0435\u0440\" -sha256 -new -key server-key.pem -out server.csr\n\n<em># \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0438\u043c\u0435\u043d\u0430<\/em>\necho subjectAltName = DNS:\u0432\u0430\u0448-\u0441\u0435\u0440\u0432\u0435\u0440,IP:\u0432\u0430\u0448-ip &gt; extfile.cnf\nopenssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -out server-cert.pem -extfile extfile.cnf<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u0448\u0430\u0433-2-\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430-docker-\u043d\u0430-\u0441\u0435\u0440\u0432\u0435\u0440\u0435\"><span class=\"ez-toc-section\" id=\"%D0%A8%D0%B0%D0%B3_2_%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_Docker_%D0%BD%D0%B0_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B5\"><\/span>\u0428\u0430\u0433 2: \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Docker \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0438\u043b\u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b&nbsp;<code>\/etc\/docker\/daemon.json<\/code>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"hosts\": [\"fd:\/\/\", \"tcp:\/\/0.0.0.0:2376\"],\n  \"tls\": true,\n  \"tlscert\": \"\/etc\/docker\/tls\/server-cert.pem\",\n  \"tlskey\": \"\/etc\/docker\/tls\/server-key.pem\",\n  \"tlscacert\": \"\/etc\/docker\/tls\/ca.pem\"\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c Docker.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u0448\u0430\u0433-3-\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430-\u043a\u043b\u0438\u0435\u043d\u0442\u0430\"><span class=\"ez-toc-section\" id=\"%D0%A8%D0%B0%D0%B3_3_%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0\"><\/span>\u0428\u0430\u0433 3: \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u041d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0439 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430<\/em>\nscp user@\u0441\u0435\u0440\u0432\u0435\u0440:\/etc\/docker\/tls\/ca.pem .\n\n<em># \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0435 \u043a\u043b\u044e\u0447\u0438<\/em>\nopenssl genrsa -out client-key.pem 4096\nopenssl req -subj '\/CN=client' -new -key client-key.pem -out client.csr\necho extendedKeyUsage = clientAuth &gt; extfile-client.cnf\nopenssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -out client-cert.pem -extfile extfile-client.cnf<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u0448\u0430\u0433-4-\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e-\u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\"><span class=\"ez-toc-section\" id=\"%D0%A8%D0%B0%D0%B3_4_%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0\"><\/span>\u0428\u0430\u0433 4: \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">docker context create \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439-\u0441\u0435\u0440\u0432\u0435\u0440 \\\n  --docker \"host=tcp:\/\/\u0441\u0435\u0440\u0432\u0435\u0440:2376,ca=ca.pem,cert=client-cert.pem,key=client-key.pem\"<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f-\u0441-ci-cd-\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438\"><span class=\"ez-toc-section\" id=\"%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_CICD_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0%D0%BC%D0%B8\"><\/span>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 CI\/CD \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-gitlab-ci\"><span class=\"ez-toc-section\" id=\"GitLab_CI\"><\/span>GitLab CI<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0412&nbsp;<code>.gitlab-ci.yml<\/code>&nbsp;\u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">yaml<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">variables:\n  DOCKER_HOST: \"tcp:\/\/\u0441\u0435\u0440\u0432\u0435\u0440-\u0441\u0431\u043e\u0440\u043a\u0438:2376\"\n  DOCKER_TLS_VERIFY: \"1\"\n  DOCKER_CERT_PATH: \"\/certs\"\n\nbefore_script:\n  - mkdir -p \/certs\n  - echo \"$DOCKER_CA_CERT\" &gt; \/certs\/ca.pem\n  - echo \"$DOCKER_CLIENT_CERT\" &gt; \/certs\/cert.pem\n  - echo \"$DOCKER_CLIENT_KEY\" &gt; \/certs\/key.pem\n\nbuild:\n  script:\n    - docker build -t \u0432\u0430\u0448-\u043e\u0431\u0440\u0430\u0437 .<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0412 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 GitLab \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>DOCKER_CA_CERT<\/code>&nbsp;\u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 ca.pem<\/li>\n\n\n\n<li><code>DOCKER_CLIENT_CERT<\/code>&nbsp;\u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 client-cert.pem<\/li>\n\n\n\n<li><code>DOCKER_CLIENT_KEY<\/code>&nbsp;\u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 client-key.pem<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-jenkins\"><span class=\"ez-toc-section\" id=\"Jenkins\"><\/span>Jenkins<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0414\u043b\u044f Jenkins \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 pipeline:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">groovy<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">pipeline {\n    agent any\n    \n    environment {\n        DOCKER_HOST = 'tcp:\/\/\u0441\u0435\u0440\u0432\u0435\u0440-\u0441\u0431\u043e\u0440\u043a\u0438:2376'\n        DOCKER_TLS_VERIFY = '1'\n    }\n    \n    stages {\n        stage('Build') {\n            steps {\n                withCredentials([\n                    file(credentialsId: 'docker-ca', variable: 'DOCKER_CA_CERT'),\n                    file(credentialsId: 'docker-cert', variable: 'DOCKER_CERT'),\n                    file(credentialsId: 'docker-key', variable: 'DOCKER_KEY')\n                ]) {\n                    sh '''\n                        mkdir -p ~\/.docker\n                        cp $DOCKER_CA_CERT ~\/.docker\/ca.pem\n                        cp $DOCKER_CERT ~\/.docker\/cert.pem\n                        cp $DOCKER_KEY ~\/.docker\/key.pem\n                        docker build -t \u0432\u0430\u0448-\u043e\u0431\u0440\u0430\u0437 .\n                    '''\n                }\n            }\n        }\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f-dockerfile-\u0434\u043b\u044f-\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439-\u0441\u0431\u043e\u0440\u043a\u0438\"><span class=\"ez-toc-section\" id=\"%D0%9E%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_Dockerfile_%D0%B4%D0%BB%D1%8F_%D1%83%D0%B4%D0%B0%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8\"><\/span>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f Dockerfile \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439 \u0432\u0430\u0436\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c Dockerfile:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">dockerfile<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u043d\u043e\u0433\u043e\u044d\u0442\u0430\u043f\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443\nFROM node:18-alpine as dependencies\nWORKDIR \/app\nCOPY package*.json .\/\n# \u041a\u0435\u0448\u0438\u0440\u0443\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\nRUN --mount=type=cache,target=\/root\/.npm \\\n    npm ci --only=production\n\nFROM node:18-alpine as build\nWORKDIR \/app\nCOPY --from=dependencies \/app\/node_modules .\/node_modules\nCOPY . .\nRUN npm run build\n\nFROM nginx:alpine\nCOPY --from=build \/app\/dist \/usr\/share\/nginx\/html\nCOPY nginx.conf \/etc\/nginx\/nginx.conf\nEXPOSE 80\nCMD [\"nginx\", \"-g\", \"daemon off;\"]<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\u0420\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/li>\n\n\n\n<li>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/li>\n\n\n\n<li>\u041c\u0438\u043d\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0435\u0432<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433-\u0438-\u043e\u0442\u043b\u0430\u0434\u043a\u0430\"><span class=\"ez-toc-section\" id=\"%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3_%D0%B8_%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0\"><\/span>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u043e\u0442\u043b\u0430\u0434\u043a\u0430<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440-\u043b\u043e\u0433\u043e\u0432-\u0441\u0431\u043e\u0440\u043a\u0438\"><span class=\"ez-toc-section\" id=\"%D0%9F%D1%80%D0%BE%D1%81%D0%BC%D0%BE%D1%82%D1%80_%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8\"><\/span>\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043b\u043e\u0433\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441\u0431\u043e\u0440\u043a\u0438<\/em>\nsudo journalctl -u docker -f\n\n<em># \u0418\u043b\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/em>\ndocker logs \u0441\u0431\u043e\u0440\u0449\u0438\u043a-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433-\u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432\"><span class=\"ez-toc-section\" id=\"%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3_%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D0%BE%D0%B2\"><\/span>\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0438\u0441\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u0430\u043c\u0438<\/em>\ndocker system df\n\n<em># \u0414\u0435\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e \u043e\u0431\u0440\u0430\u0437\u0430\u043c<\/em>\ndocker images --digests\n\n<em># \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432<\/em>\ndocker image prune -a<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u043c\u0435\u0442\u0440\u0438\u043a\u0438-\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438\"><span class=\"ez-toc-section\" id=\"%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B8_%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8\"><\/span>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0441\u0431\u043e\u0440\u043a\u0438:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash\necho \"\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430:\"\ntime docker build -t \u0442\u0435\u0441\u0442-\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 .\n\necho \"\u0423\u0434\u0430\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430:\"\ntime docker --context \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 build -t \u0442\u0435\u0441\u0442-\u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 .<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435-\u0444\u0435\u0440\u043c\u044b-\u0441\u0431\u043e\u0440\u043a\u0438\"><span class=\"ez-toc-section\" id=\"%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%84%D0%B5%D1%80%D0%BC%D1%8B_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8\"><\/span>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0435\u0440\u043c\u044b \u0441\u0431\u043e\u0440\u043a\u0438<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash\n<em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0438\u0437 3 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438<\/em>\nservers=(\"\u0441\u0431\u043e\u0440\u043a\u0430-1\" \"\u0441\u0431\u043e\u0440\u043a\u0430-2\" \"\u0441\u0431\u043e\u0440\u043a\u0430-3\")\n\nfor server in \"${servers[@]}\"; do\n    echo \"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 $server...\"\n    ssh $server \"sudo apt-get update &amp;&amp; sudo apt-get install docker.io -y\"\n    ssh $server \"sudo systemctl enable docker\"\n    \n    <em># \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c TLS \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b<\/em>\n    scp tls\/* $server:\/etc\/docker\/tls\/\n    \n    <em># \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Docker<\/em>\n    ssh $server \"sudo tee \/etc\/docker\/daemon.json &gt; \/dev\/null &lt;&lt; EOF\n{\n  \\\"hosts\\\": [\\\"fd:\/\/\\\", \\\"tcp:\/\/0.0.0.0:2376\\\"],\n  \\\"tls\\\": true,\n  \\\"tlscert\\\": \\\"\/etc\/docker\/tls\/server-cert.pem\\\",\n  \\\"tlskey\\\": \\\"\/etc\/docker\/tls\/server-key.pem\\\",\n  \\\"tlscacert\\\": \\\"\/etc\/docker\/tls\/ca.pem\\\"\n}\nEOF\"\n    \n    ssh $server \"sudo systemctl restart docker\"\ndone\n\necho \"\u0424\u0435\u0440\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0433\u043e\u0442\u043e\u0432\u0430!\"<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439-\u0432\u044b\u0431\u043e\u0440-\u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430\"><span class=\"ez-toc-section\" id=\"%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80_%D1%81%D0%B1%D0%BE%D1%80%D1%89%D0%B8%D0%BA%D0%B0\"><\/span>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0431\u043e\u0440\u043a\u0438:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash\n<em># auto-builder.sh<\/em>\n\n<em># \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443<\/em>\nif [[ $(uname -m) == \"arm64\" ]]; then\n    <em># \u041d\u0430 Apple Silicon \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 \u0434\u043b\u044f amd64<\/em>\n    echo \"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043b\u044f amd64 \u0441\u0431\u043e\u0440\u043a\u0438\"\n    export DOCKER_HOST=\"tcp:\/\/\u0441\u0431\u043e\u0440\u043a\u0430-amd64:2376\"\n    docker build --platform linux\/amd64 -t $1 .\nelif [[ $(docker system info --format '{{.Architecture}}') != \"x86_64\" ]]; then\n    <em># \u041d\u0430 \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0435-x86 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445<\/em>\n    echo \"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 x86 \u0441\u0435\u0440\u0432\u0435\u0440\"\n    export DOCKER_HOST=\"tcp:\/\/\u0441\u0431\u043e\u0440\u043a\u0430-x86:2376\"\n    docker build -t $1 .\nelse\n    <em># \u041d\u0430 x86 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e<\/em>\n    echo \"\u0421\u043e\u0431\u0438\u0440\u0430\u044e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\"\n    docker build -t $1 .\nfi<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">.\/auto-builder.sh \u0432\u0430\u0448-\u043e\u0431\u0440\u0430\u0437<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435-\u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b\"><span class=\"ez-toc-section\" id=\"%D0%9E%D0%B1%D0%BB%D0%B0%D1%87%D0%BD%D1%8B%D0%B5_%D0%B0%D0%BB%D1%8C%D1%82%D0%B5%D1%80%D0%BD%D0%B0%D1%82%D0%B8%D0%B2%D1%8B\"><\/span>\u041e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0415\u0441\u043b\u0438 \u043d\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-docker-build-cloud\"><span class=\"ez-toc-section\" id=\"Docker_Build_Cloud\"><\/span>Docker Build Cloud<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430<\/em>\ndocker build cloud login\ndocker build cloud init\n\n<em># \u0421\u0431\u043e\u0440\u043a\u0430 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435<\/em>\ndocker buildx build --cloud \u0432\u0430\u0448\u0430-\u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f\/\u0432\u0430\u0448-\u0441\u0431\u043e\u0440\u0449\u0438\u043a -t \u0432\u0430\u0448-\u043e\u0431\u0440\u0430\u0437 .<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-aws-codebuild\"><span class=\"ez-toc-section\" id=\"AWS_CodeBuild\"><\/span>AWS CodeBuild<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u0444\u0430\u0439\u043b&nbsp;<code>buildspec.yml<\/code>:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">yaml<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">version: 0.2\n\nphases:\n  install:\n    commands:\n      - echo \"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439...\"\n  build:\n    commands:\n      - echo \"\u0421\u0431\u043e\u0440\u043a\u0430 Docker \u043e\u0431\u0440\u0430\u0437\u0430...\"\n      - docker build -t $REPOSITORY_URI:latest .\n      - docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG\n  post_build:\n    commands:\n      - echo \"\u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440...\"\n      - docker push $REPOSITORY_URI:latest\n      - docker push $REPOSITORY_URI:$IMAGE_TAG<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-github-actions\"><span class=\"ez-toc-section\" id=\"GitHub_Actions\"><\/span>GitHub Actions<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">yaml<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">name: Docker Build\non: [push]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions\/checkout@v2\n    \n    - name: Build on remote server\n      run: |\n        docker context create remote --docker \"host=ssh:\/\/user@\u0441\u0435\u0440\u0432\u0435\u0440\"\n        docker --context remote build -t \u0432\u0430\u0448-\u043e\u0431\u0440\u0430\u0437 .<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u0441\u043e\u0432\u0435\u0442\u044b-\u043f\u043e-\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438\"><span class=\"ez-toc-section\" id=\"%D0%A1%D0%BE%D0%B2%D0%B5%D1%82%D1%8B_%D0%BF%D0%BE_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D0%B8\"><\/span>\u0421\u043e\u0432\u0435\u0442\u044b \u043f\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0439\u0442\u0435 Docker \u043f\u043e\u0440\u0442 \u0431\u0435\u0437 TLS<\/strong>&nbsp;\u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0442\u044f\u0445<\/li>\n\n\n\n<li><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 firewall<\/strong>&nbsp;\u0447\u0442\u043e\u0431\u044b \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043e\u0440\u0442\u0443 2376 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u044b\u043c IP<\/li>\n\n\n\n<li><strong>\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0439\u0442\u0435 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b<\/strong><\/li>\n\n\n\n<li><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433<\/strong>&nbsp;\u043d\u0435\u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u0438<\/li>\n\n\n\n<li><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/strong>&nbsp;\u0434\u043b\u044f Docker \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0441\u0431\u043e\u0440\u043a\u0438<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435-\u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\"><span class=\"ez-toc-section\" id=\"%D0%A3%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%BD%D1%8B%D1%85_%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC\"><\/span>\u0423\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430-cannot-connect-to-the-docker-daemon\"><span class=\"ez-toc-section\" id=\"%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0_%C2%ABCannot_connect_to_the_Docker_daemon%C2%BB\"><\/span>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: &#171;Cannot connect to the Docker daemon&#187;<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong>&nbsp;\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>\u0414\u0435\u043c\u043e\u043d Docker \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435:&nbsp;<code>sudo systemctl status docker<\/code><\/li>\n\n\n\n<li>\u041f\u043e\u0440\u0442 \u043e\u0442\u043a\u0440\u044b\u0442:&nbsp;<code>sudo netstat -tlnp | grep 2376<\/code><\/li>\n\n\n\n<li>\u0424\u0430\u0439\u0440\u0432\u043e\u043b \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u043f\u043e\u0440\u0442:&nbsp;<code>sudo ufw status<\/code><\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430-x509-certificate-signed-by-unknown-authority\"><span class=\"ez-toc-section\" id=\"%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0_%C2%ABx509_certificate_signed_by_unknown_authority%C2%BB\"><\/span>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: &#171;x509: certificate signed by unknown authority&#187;<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong>&nbsp;\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 CA \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">export DOCKER_TLS_VERIFY=1\nexport DOCKER_CERT_PATH=\/\u043f\u0443\u0442\u044c\/\u043a\/\u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430\u043c<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430-\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f-\u0441\u0431\u043e\u0440\u043a\u0430-\u043f\u0440\u0438-\u043f\u0435\u0440\u0432\u043e\u043c-\u0437\u0430\u043f\u0443\u0441\u043a\u0435\"><span class=\"ez-toc-section\" id=\"%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0_%D0%9C%D0%B5%D0%B4%D0%BB%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B0_%D0%BF%D1%80%D0%B8_%D0%BF%D0%B5%D1%80%D0%B2%D0%BE%D0%BC_%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B5\"><\/span>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430: \u041c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0420\u0435\u0448\u0435\u043d\u0438\u0435:<\/strong>&nbsp;\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043e\u0431\u0449\u0438\u0439 \u043a\u0435\u0448 \u0434\u043b\u044f \u0441\u043b\u043e\u0435\u0432. \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 Docker \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"data-root\": \"\/shared\/docker\",\n  \"storage-driver\": \"overlay2\"\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u043d\u0430\u0447\u0430\u043b\u043e-\u0440\u0430\u0431\u043e\u0442\u044b-\u0437\u0430-5-\u043c\u0438\u043d\u0443\u0442\"><span class=\"ez-toc-section\" id=\"%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D0%B7%D0%B0_5_%D0%BC%D0%B8%D0%BD%D1%83%D1%82\"><\/span>\u041d\u0430\u0447\u0430\u043b\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u0437\u0430 5 \u043c\u0438\u043d\u0443\u0442<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c Docker Build Offloading:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># 1. \u041d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435<\/em>\nsudo docker run -d -p 2375:2375 --restart always docker:dind\n\n<em># 2. \u041d\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0435<\/em>\ndocker context create \u0431\u044b\u0441\u0442\u0440\u044b\u0439-\u0442\u0435\u0441\u0442 --docker \"host=tcp:\/\/\u0441\u0435\u0440\u0432\u0435\u0440:2375\"\ndocker context use \u0431\u044b\u0441\u0442\u0440\u044b\u0439-\u0442\u0435\u0441\u0442\n\n<em># 3. \u0422\u0435\u0441\u0442\u043e\u0432\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430<\/em>\ndocker build -t \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439-\u043e\u0431\u0440\u0430\u0437 .<\/pre>\n\n\n\n<div class=\"wp-block-simple-note-info\">\u042d\u0442\u043e \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0434\u043b\u044f production, \u043d\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438.<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%90%D1%80%D1%85%D0%B8%D1%82%D0%B5%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%B4%D0%BB%D1%8F_Production\"><\/span>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0434\u043b\u044f Production<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">text<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502   CI\/CD \u0441\u0435\u0440\u0432\u0435\u0440  \u2502    \u2502         Build Farm Cluster       \u2502\n\u2502  (Jenkins, GitLab)  \u2502\u2500\u2500\u2500\u25b6\u2502  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510  ...  \u2502\n\u2502  \u0438\u043b\u0438 Dev \u043c\u0430\u0448\u0438\u043d\u044b \u2502    \u2502  \u2502 Builder1 \u2502  \u2502 Builder2 \u2502      \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518    \u2502  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518  \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518      \u2502\n                       \u2502        Load Balancer          \u2502\n                       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"1_%D0%92%D1%8B%D0%B1%D0%BE%D1%80_%D1%82%D0%B5%D1%85%D0%BD%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D0%B8_%D0%B4%D0%BB%D1%8F_Production\"><\/span>1. \u0412\u044b\u0431\u043e\u0440 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0434\u043b\u044f Production<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82_A_BuildKit_%D1%81_Docker_Buildx_%D1%80%D0%B5%D0%BA%D0%BE%D0%BC%D0%B5%D0%BD%D0%B4%D1%83%D0%B5%D1%82%D1%81%D1%8F\"><\/span><strong>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 A: BuildKit \u0441 Docker Buildx (\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u0421\u043e\u0437\u0434\u0430\u0435\u043c builder \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u043d\u043e\u0434\u0430\u043c\u0438<\/em>\ndocker buildx create \\\n  --name production-builder \\\n  --driver docker-container \\\n  --platform linux\/amd64 \\\n  --node node1 \\\n  tcp:\/\/build-node1:2376\n\n<em># \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0442\u043e\u0440\u0443\u044e \u043d\u043e\u0434\u0443<\/em>\ndocker buildx create \\\n  --name production-builder \\\n  --node node2 \\\n  tcp:\/\/build-node2:2376 \\\n  --append\n\n<em># \u0421\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0442\u0430\u0442\u0443\u0441<\/em>\ndocker buildx inspect production-builder --bootstrap<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%92%D0%B0%D1%80%D0%B8%D0%B0%D0%BD%D1%82_B_Kubernetes-based_Build_Farm\"><\/span><strong>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 B: Kubernetes-based Build Farm<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">yaml<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># buildkit-daemon.yaml \u0434\u043b\u044f Kubernetes<\/em>\napiVersion: apps\/v1\nkind: Deployment\nmetadata:\n  name: buildkitd\n  namespace: build\nspec:\n  replicas: 3  <em># 3 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438<\/em>\n  selector:\n    matchLabels:\n      app: buildkitd\n  template:\n    metadata:\n      labels:\n        app: buildkitd\n    spec:\n      containers:\n      - name: buildkitd\n        image: moby\/buildkit:latest\n        args:\n        - --addr\n        - tcp:\/\/0.0.0.0:1234\n        - --addr\n        - unix:\/\/\/run\/buildkit\/buildkitd.sock\n        ports:\n        - containerPort: 1234\n        securityContext:\n          privileged: true\n        volumeMounts:\n        - name: buildkit-cache\n          mountPath: \/var\/lib\/buildkit\n      volumes:\n      - name: buildkit-cache\n        persistentVolumeClaim:\n          claimName: buildkit-cache-pvc\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: buildkitd-service\n  namespace: build\nspec:\n  selector:\n    app: buildkitd\n  ports:\n  - port: 1234\n    targetPort: 1234\n  type: LoadBalancer<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"2_%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF%D0%B0_%D0%B2_Production\"><\/span>2. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 Production<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%93%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D0%B2_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_HashiCorp_Vault_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D0%B7%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE\"><\/span><strong>\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 HashiCorp Vault (\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 Vault \u0434\u043b\u044f \u0432\u044b\u0434\u0430\u0447\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432 Docker<\/em>\nvault secrets enable pki\nvault write pki\/root\/generate\/internal \\\n    common_name=build.internal.company.com \\\n    ttl=87600h\n\nvault write pki\/roles\/docker-build \\\n    allowed_domains=\"build.internal.company.com\" \\\n    allow_subdomains=true \\\n    max_ttl=720h\n\n<em># \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0432\u044b\u0434\u0430\u0447\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0434\u043b\u044f \u0431\u0438\u043b\u0434-\u043d\u043e\u0434\u044b<\/em>\ncurl --header \"X-Vault-Token: $VAULT_TOKEN\" \\\n  --request POST \\\n  --data '{\"common_name\": \"build-node-1.build.internal.company.com\"}' \\\n  http:\/\/vault:8200\/v1\/pki\/issue\/docker-build &gt; certs.json<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Docker_daemonjson_%D1%81_%D1%83%D1%81%D0%B8%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C%D1%8E\"><\/span><strong>Docker daemon.json \u0441 \u0443\u0441\u0438\u043b\u0435\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"hosts\": [\"fd:\/\/\", \"tcp:\/\/0.0.0.0:2376\"],\n  \"tls\": true,\n  \"tlscert\": \"\/etc\/docker\/tls\/server-cert.pem\",\n  \"tlskey\": \"\/etc\/docker\/tls\/server-key.pem\",\n  \"tlscacert\": \"\/etc\/docker\/tls\/ca.pem\",\n  \"tlsverify\": true,\n  \"authorization-plugins\": [\"docker-authz-plugin\"],\n  \"log-driver\": \"json-file\",\n  \"log-opts\": {\n    \"max-size\": \"10m\",\n    \"max-file\": \"3\"\n  },\n  \"storage-driver\": \"overlay2\",\n  \"storage-opts\": [\n    \"overlay2.override_kernel_check=true\"\n  ],\n  \"max-concurrent-downloads\": 10,\n  \"max-concurrent-uploads\": 10,\n  \"live-restore\": true\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"3_%D0%91%D0%B0%D0%BB%D0%B0%D0%BD%D1%81%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0_%D0%BD%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B8_%D0%BC%D0%B5%D0%B6%D0%B4%D1%83_%D0%B1%D0%B8%D0%BB%D0%B4-%D0%BD%D0%BE%D0%B4%D0%B0%D0%BC%D0%B8\"><\/span>3. \u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0431\u0438\u043b\u0434-\u043d\u043e\u0434\u0430\u043c\u0438<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"NGINX_%D0%BA%D0%B0%D0%BA_Load_Balancer_%D1%81_health_checks\"><\/span><strong>NGINX \u043a\u0430\u043a Load Balancer \u0441 health checks<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">nginx<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \/etc\/nginx\/nginx.conf<\/em>\nstream {\n    upstream docker_build_backend {\n        least_conn;\n        server build-node1:2376 max_fails=3 fail_timeout=30s;\n        server build-node2:2376 max_fails=3 fail_timeout=30s;\n        server build-node3:2376 max_fails=3 fail_timeout=30s;\n    }\n\n    server {\n        listen 2376 ssl;\n        proxy_pass docker_build_backend;\n        proxy_connect_timeout 1s;\n        \n        ssl_certificate \/etc\/ssl\/build-cert.pem;\n        ssl_certificate_key \/etc\/ssl\/build-key.pem;\n        ssl_client_certificate \/etc\/ssl\/ca.pem;\n        ssl_verify_client on;\n        \n        <em># Health check<\/em>\n        health_check interval=10 passes=2 fails=3;\n    }\n}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%98%D0%BB%D0%B8_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D0%B5%D0%BC_HAProxy\"><\/span><strong>\u0418\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c HAProxy<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">haproxy<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># haproxy.cfg\nfrontend docker_build\n    bind *:2376 ssl crt \/etc\/ssl\/build.pem verify required ca-file \/etc\/ssl\/ca.pem\n    mode tcp\n    option tcplog\n    default_backend build_nodes\n\nbackend build_nodes\n    mode tcp\n    balance leastconn\n    option tcp-check\n    tcp-check connect\n    tcp-check send \"GET \/version HTTP\/1.0\\r\\n\\r\\n\"\n    tcp-check expect string \"HTTP\/1.0 200\"\n    \n    server build1 build-node1:2376 check maxconn 100\n    server build2 build-node2:2376 check maxconn 100\n    server build3 build-node3:2376 check maxconn 100<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"4_%D0%A0%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D1%91%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BA%D0%B5%D1%88%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%BB%D0%BE%D0%B5%D0%B2\"><\/span>4. \u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0441\u043b\u043e\u0435\u0432<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%9E%D0%B1%D1%89%D0%B8%D0%B9_%D0%BA%D0%B5%D1%88_%D1%87%D0%B5%D1%80%D0%B5%D0%B7_Redis_%D0%B8%D0%BB%D0%B8_%D0%B2%D0%BD%D0%B5%D1%88%D0%BD%D0%B5%D0%B5_%D1%85%D1%80%D0%B0%D0%BD%D0%B8%D0%BB%D0%B8%D1%89%D0%B5\"><\/span><strong>\u041e\u0431\u0449\u0438\u0439 \u043a\u0435\u0448 \u0447\u0435\u0440\u0435\u0437 Redis \u0438\u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0435\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">dockerfile<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Dockerfile \u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u0435\u0448\u0430\nFROM golang:1.21 as builder\n\n# \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c BuildKit cache mounts \u0441 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u043c \u043a\u0435\u0448\u0435\u043c\nRUN --mount=type=cache,target=\/go\/pkg\/mod \\\n    --mount=type=cache,target=\/root\/.cache\/go-build \\\n    go build -o \/app .\n\n# \u0418\u043b\u0438 \u043a\u0435\u0448\u0438\u0440\u0443\u0435\u043c \u0432 S3\/MinIO\n# buildkitd config.toml\n&#91;worker.containerd]\n  enabled = true\n  &#91;worker.containerd.gc]\n    enabled = true\n    &#91;worker.containerd.gc.policy]\n      keepBytes = 512000000\n      keepDuration = 172800\n\n&#91;&#91;registry.\"s3:\/\/cache-bucket\"]]\n  mirrors = &#91;\"cache.internal.company.com\"]\n  http = true\n  insecure = false<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_BuildKit_%D0%B4%D0%BB%D1%8F_%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_S3_%D0%BA%D0%B5%D1%88%D0%B0\"><\/span><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 BuildKit \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f S3 \u043a\u0435\u0448\u0430<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">toml<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \/etc\/buildkitd.toml<\/em>\n[worker.containerd]\n  enabled = true\n  namespace = \"buildkit\"\n\n<em># \u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u0435\u0448\u0430 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430<\/em>\n[exporters]\n  [exporters.\"image\"]\n    type = \"image\"\n  [exporters.\"cache\"]\n    type = \"registry\"\n    mode = \"max\"\n    <em># \u041a\u0435\u0448\u0438\u0440\u0443\u0435\u043c \u0441\u043b\u043e\u0438 \u0432 container registry<\/em>\n    cache-exporters = [\"type=registry,ref=docker.io\/company\/cache:buildcache\"]\n\n<em># \u0418\u043b\u0438 \u043a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 S3<\/em>\n[exporters.\"s3-cache\"]\n  type = \"s3\"\n  bucket = \"build-cache-bucket\"\n  region = \"us-east-1\"\n  blobs_prefix = \"buildkit-blobs\"\n  manifests_prefix = \"buildkit-manifests\"<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"5_%D0%98%D0%BD%D1%82%D0%B5%D0%B3%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_Production_CICD\"><\/span>5. \u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441 Production CI\/CD<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"GitLab_CI_%D1%81_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%BE%D0%B9\"><\/span><strong>GitLab CI \u0441 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u043e\u0439<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">yaml<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># .gitlab-ci.yml<\/em>\nvariables:\n  DOCKER_HOST: \"tcp:\/\/build-balancer.company.com:2376\"\n  DOCKER_TLS_VERIFY: \"1\"\n  DOCKER_BUILDKIT: \"1\"\n  BUILDKIT_PROGRESS: \"plain\"\n\nstages:\n  - build\n  - test\n  - deploy\n\nbuild:\n  stage: build\n  parallel: 3  <em># \u041f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438<\/em>\n  script:\n    - |\n      # \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u0442\u0435\u0433\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043d\u043e\u0434\u044b\n      export IMAGE_TAG=\"${CI_COMMIT_SHA}-${CI_NODE_INDEX}\"\n      docker buildx build \\\n        --builder production-builder \\\n        --cache-from type=registry,ref=$CI_REGISTRY_IMAGE:cache \\\n        --cache-to type=registry,ref=$CI_REGISTRY_IMAGE:cache,mode=max \\\n        --tag $CI_REGISTRY_IMAGE:$IMAGE_TAG \\\n        --tag $CI_REGISTRY_IMAGE:latest \\\n        --push \\\n        .\n  cache:\n    key: docker-cache\n    paths:\n      - .buildkit-cache\/\n  artifacts:\n    reports:\n      dotenv: build.env<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Jenkins_Pipeline_%D1%81_%D1%80%D0%B0%D1%81%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%D0%BC_%D0%BF%D0%BE_%D0%BD%D0%BE%D0%B4%D0%B0%D0%BC\"><\/span><strong>Jenkins Pipeline \u0441 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u043e \u043d\u043e\u0434\u0430\u043c<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">groovy<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em>\/\/ Jenkinsfile<\/em>\npipeline {\n    agent none\n    \n    parameters {\n        choice(name: 'BUILD_NODE', choices: ['build-node-1', 'build-node-2', 'build-node-3'], description: 'Select build node')\n    }\n    \n    stages {\n        stage('Build on Selected Node') {\n            agent {\n                label \"${params.BUILD_NODE}\"\n            }\n            steps {\n                script {\n                    <em>\/\/ \u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c Docker \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442<\/em>\n                    sh \"\"\"\n                        docker context create remote-${params.BUILD_NODE} \\\n                            --docker \"host=tcp:\/\/${params.BUILD_NODE}:2376,ca=\\${DOCKER_CA_PATH},cert=\\${DOCKER_CERT_PATH},key=\\${DOCKER_KEY_PATH}\"\n                        docker --context remote-${params.BUILD_NODE} build \\\n                            --cache-from type=registry,ref=registry.company.com\/cache:latest \\\n                            -t app:${BUILD_ID} .\n                    \"\"\"\n                    \n                    <em>\/\/ \u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u0441\u0431\u043e\u0440\u043a\u0438<\/em>\n                    sh 'docker system df &gt;&gt; build_metrics.txt'\n                    archiveArtifacts artifacts: 'build_metrics.txt'\n                }\n            }\n        }\n    }\n    \n    post {\n        always {\n            <em>\/\/ \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430<\/em>\n            sh 'docker context rm -f remote-${params.BUILD_NODE}'\n            \n            <em>\/\/ \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043c\u0435\u0442\u0440\u0438\u043a \u0432 Prometheus<\/em>\n            prometheusMetrics(\n                metricPrefix: 'docker_build_',\n                additionalFields: [\n                    'build_node': \"${params.BUILD_NODE}\",\n                    'duration_seconds': currentBuild.duration \/ 1000\n                ]\n            )\n        }\n    }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"6_%D0%9C%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3_%D0%B8_%D0%B0%D0%BB%D0%B5%D1%80%D1%82%D0%B8%D0%BD%D0%B3\"><\/span>6. \u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0430\u043b\u0435\u0440\u0442\u0438\u043d\u0433<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Prometheus_%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D0%BA%D0%B8_%D0%B4%D0%BB%D1%8F_%D0%B1%D0%B8%D0%BB%D0%B4-%D1%84%D0%B5%D1%80%D0%BC%D1%8B\"><\/span><strong>Prometheus \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0434\u043b\u044f \u0431\u0438\u043b\u0434-\u0444\u0435\u0440\u043c\u044b<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">yaml<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># prometheus.yml<\/em>\nscrape_configs:\n  - job_name: 'docker-build-nodes'\n    static_configs:\n      - targets:\n        - 'build-node1:9323'  <em># Docker metrics endpoint<\/em>\n        - 'build-node2:9323'\n        - 'build-node3:9323'\n    metrics_path: \/metrics\n    \n  - job_name: 'buildkit-metrics'\n    static_configs:\n      - targets:\n        - 'build-node1:1234\/metrics'\n        - 'build-node2:1234\/metrics'\n        - 'build-node3:1234\/metrics'<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Grafana_Dashboard_%D0%B4%D0%BB%D1%8F_%D0%BC%D0%BE%D0%BD%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%BD%D0%B3%D0%B0\"><\/span><strong>Grafana Dashboard \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">{\n  \"panels\": [\n    {\n      \"title\": \"Build Queue Length\",\n      \"targets\": [{\n        \"expr\": \"sum(docker_engine_daemon_container_actions{action=\\\"build\\\"}) by (instance)\",\n        \"legendFormat\": \"{{instance}}\"\n      }]\n    },\n    {\n      \"title\": \"Build Duration\",\n      \"targets\": [{\n        \"expr\": \"histogram_quantile(0.95, rate(docker_engine_build_duration_seconds_bucket[5m]))\",\n        \"legendFormat\": \"95th percentile\"\n      }]\n    },\n    {\n      \"title\": \"Node Load\",\n      \"targets\": [{\n        \"expr\": \"100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=\\\"idle\\\"}[5m])) * 100)\",\n        \"legendFormat\": \"{{instance}} CPU\"\n      }]\n    }\n  ],\n  \"alerting\": {\n    \"alerts\": [\n      {\n        \"name\": \"High Build Queue\",\n        \"expr\": \"docker_engine_daemon_container_actions{action=\\\"build\\\"} &gt; 10\",\n        \"for\": \"5m\",\n        \"labels\": {\"severity\": \"warning\"},\n        \"annotations\": {\"summary\": \"Build queue too long on {{ $labels.instance }}\"}\n      }\n    ]\n  }\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"7_%D0%A0%D0%BE%D1%82%D0%B0%D1%86%D0%B8%D1%8F_%D0%B8_maintenance_%D0%B1%D0%B8%D0%BB%D0%B4-%D0%BD%D0%BE%D0%B4\"><\/span>7. \u0420\u043e\u0442\u0430\u0446\u0438\u044f \u0438 maintenance \u0431\u0438\u043b\u0434-\u043d\u043e\u0434<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Blue-Green_Deployment_%D0%B1%D0%B8%D0%BB%D0%B4-%D0%BD%D0%BE%D0%B4\"><\/span><strong>Blue-Green Deployment \u0431\u0438\u043b\u0434-\u043d\u043e\u0434<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash\n<em># rotate-build-nodes.sh<\/em>\n\n<em># \u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043d\u043e\u0434\u0443<\/em>\nNEW_NODE=\"build-node-new\"\nOLD_NODE=\"build-node-old\"\n\necho \"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u043e\u0432\u0443\u044e \u043d\u043e\u0434\u0443 \u0432 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a...\"\nsed -i \"s\/$OLD_NODE:2376\/$NEW_NODE:2376\/g\" \/etc\/nginx\/nginx.conf\nnginx -s reload\n\necho \"\u0414\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0430 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439...\"\nsleep 60\n\necho \"\u041e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0440\u0443\u044e \u043d\u043e\u0434\u0443...\"\nssh $OLD_NODE \"sudo systemctl stop docker\"\n\necho \"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u043d\u043e\u0432\u043e\u0439 \u043d\u043e\u0434\u044b...\"\nif curl -f https:\/\/$NEW_NODE:2376\/version; then\n    echo \"\u0420\u043e\u0442\u0430\u0446\u0438\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\"\n    \n    <em># \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0441\u0442\u0430\u0440\u043e\u0439 \u043d\u043e\u0434\u044b<\/em>\n    ssh $OLD_NODE \"docker system prune -af\"\nelse\n    echo \"\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043d\u043e\u0432\u043e\u0439 \u043d\u043e\u0434\u043e\u0439, \u043e\u0442\u043a\u0430\u0442...\"\n    sed -i \"s\/$NEW_NODE:2376\/$OLD_NODE:2376\/g\" \/etc\/nginx\/nginx.conf\n    nginx -s reload\nfi<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"8_%D0%A0%D0%B5%D0%B7%D0%B5%D1%80%D0%B2%D0%BD%D0%BE%D0%B5_%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B8_%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5\"><\/span>8. \u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B1%D1%8D%D0%BA%D0%B0%D0%BF_%D0%BA%D0%B5%D1%88%D0%B0\"><\/span><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u044d\u043a\u0430\u043f \u043a\u0435\u0448\u0430<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#!\/bin\/bash\n<em># backup-build-cache.sh<\/em>\n\nDATE=$(date +%Y%m%d-%H%M%S)\nBACKUP_DIR=\"\/backup\/build-cache\/$DATE\"\n\n<em># \u0411\u044d\u043a\u0430\u043f \u043e\u0431\u0440\u0430\u0437\u043e\u0432<\/em>\nmkdir -p $BACKUP_DIR\ndocker images --format \"{{.Repository}}:{{.Tag}}\" | grep \"build-cache\" | while read image; do\n    docker save $image -o \"$BACKUP_DIR\/$(echo $image | tr '\/' '_' | tr ':' '_').tar\"\ndone\n\n<em># \u0411\u044d\u043a\u0430\u043f volumes<\/em>\nfor node in build-node1 build-node2 build-node3; do\n    ssh $node \"tar czf - \/var\/lib\/docker\/volumes\" &gt; \"$BACKUP_DIR\/${node}_volumes.tar.gz\"\ndone\n\n<em># \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0432 S3<\/em>\naws s3 sync $BACKUP_DIR s3:\/\/company-backups\/docker-build\/$DATE\/\n\n<em># \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u0441\u0442\u0430\u0440\u044b\u0445 \u0431\u044d\u043a\u0430\u043f\u043e\u0432 (\u0445\u0440\u0430\u043d\u0438\u043c 30 \u0434\u043d\u0435\u0439)<\/em>\nfind \/backup\/build-cache -type d -mtime +30 -exec rm -rf {} \\;<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"9_%D0%9F%D0%BE%D0%BB%D0%BD%D1%8B%D0%B9_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80_Production_%D1%80%D0%B0%D0%B7%D0%B2%D0%B5%D1%80%D1%82%D1%8B%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F\"><\/span>9. \u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 Production \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"Terraform_%D0%B4%D0%BB%D1%8F_%D0%B8%D0%BD%D1%84%D1%80%D0%B0%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%8B\"><\/span><strong>Terraform \u0434\u043b\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">hcl<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># build-farm.tf<\/em>\nresource \"aws_instance\" \"build_node\" {\n  count = 3\n  \n  ami           = \"ami-0c55b159cbfafe1f0\"\n  instance_type = \"c5.2xlarge\"  <em># \u041e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f Docker build<\/em>\n  \n  tags = {\n    Name = \"build-node-${count.index + 1}\"\n    Role = \"docker-build\"\n  }\n  \n  user_data = &lt;&lt;-EOF\n              #!\/bin\/bash\n              # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 Docker\n              curl -fsSL https:\/\/get.docker.com -o get-docker.sh\n              sh get-docker.sh\n              \n              # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 TLS\n              mkdir -p \/etc\/docker\/tls\n              # ... \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0432\n              \n              # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 daemon.json\n              echo '${file(\"daemon.json\")}' &gt; \/etc\/docker\/daemon.json\n              \n              systemctl enable docker\n              systemctl start docker\n              \n              # \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 node-exporter \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430\n              docker run -d --name node-exporter \\\n                -p 9100:9100 \\\n                -v \"\/proc:\/host\/proc:ro\" \\\n                -v \"\/sys:\/host\/sys:ro\" \\\n                prom\/node-exporter\n              EOF\n}\n\nresource \"aws_elb\" \"build_balancer\" {\n  name = \"docker-build-elb\"\n  \n  listener {\n    instance_port     = 2376\n    instance_protocol = \"tcp\"\n    lb_port           = 2376\n    lb_protocol       = \"ssl\"\n    ssl_certificate_id = aws_iam_server_certificate.build_cert.arn\n  }\n  \n  health_check {\n    target              = \"TCP:2376\"\n    interval            = 30\n    healthy_threshold   = 2\n    unhealthy_threshold = 2\n    timeout             = 5\n  }\n  \n  instances = aws_instance.build_node[*].id\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u0442\u0430\u0431\u043b\u0438\u0446\u0430-\u0432\u044b\u0431\u043e\u0440\u0430-\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438\"><span class=\"ez-toc-section\" id=\"%D0%A2%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B0_%D0%B2%D1%8B%D0%B1%D0%BE%D1%80%D0%B0_%D1%81%D1%82%D1%80%D0%B0%D1%82%D0%B5%D0%B3%D0%B8%D0%B8\"><\/span>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-left\" data-align=\"left\">\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u0430\u044f \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u041a\u043e\u043b-\u0432\u043e \u043d\u043e\u0434<\/th><th class=\"has-text-align-left\" data-align=\"left\">\u041a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/th><\/tr><\/thead><tbody><tr><td>\u041c\u0430\u043b\u0435\u043d\u044c\u043a\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 (5-10 \u0447\u0435\u043b)<\/td><td>Docker Context + TLS<\/td><td>1-2<\/td><td>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0441\u043a<\/td><\/tr><tr><td>\u0421\u0440\u0435\u0434\u043d\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442<\/td><td>BuildKit + \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a<\/td><td>3-5<\/td><td>\u041e\u0431\u0449\u0438\u0439 NFS\/Registry<\/td><\/tr><tr><td>\u041a\u0440\u0443\u043f\u043d\u044b\u0439 enterprise<\/td><td>Kubernetes BuildKit farm<\/td><td>5+<\/td><td>S3\/MinIO + Redis<\/td><\/tr><tr><td>\u041c\u0443\u043b\u044c\u0442\u0438-\u0440\u0435\u0433\u0438\u043e\u043d<\/td><td>Buildx \u0441 geo-distributed nodes<\/td><td>3+ \u043d\u0430 \u0440\u0435\u0433\u0438\u043e\u043d<\/td><td>CDN + \u0440\u0435\u0433\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 registry<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435-\u043c\u043e\u043c\u0435\u043d\u0442\u044b-\u0434\u043b\u044f-production\"><span class=\"ez-toc-section\" id=\"%D0%9A%D1%80%D0%B8%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BC%D0%BE%D0%BC%D0%B5%D0%BD%D1%82%D1%8B_%D0%B4%D0%BB%D1%8F_Production\"><\/span>\u041a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043c\u043e\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f Production<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435 TLS<\/strong>\u00a0&#8212; \u0434\u0430\u0436\u0435 \u0432\u043e \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0435\u0442\u0438<\/li>\n\n\n\n<li><strong>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 CPU\/IO<\/strong>\u00a0\u043d\u0430 \u0431\u0438\u043b\u0434-\u043d\u043e\u0434\u0430\u0445<\/li>\n\n\n\n<li><strong>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0430\u043b\u0435\u0440\u0442\u044b<\/strong>\u00a0\u043f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 (>10 concurrent builds)<\/li>\n\n\n\n<li><strong>\u0420\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0447\u0438\u0441\u0442\u0438\u0442\u0435 \u043a\u0435\u0448<\/strong>\u00a0&#8212; \u043f\u0440\u0430\u0432\u0438\u043b\u043e 80% \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0430<\/li>\n\n\n\n<li><strong>\u0412\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0431\u0438\u043b\u0434-\u043d\u043e\u0434\u044b<\/strong>\u00a0&#8212; \u0432\u0441\u0435 \u043d\u043e\u0434\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043d\u0430 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 Docker\/BuildKit<\/li>\n\n\n\n<li><strong>\u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0439\u0442\u0435 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c<\/strong>\u00a0&#8212; \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0430\u0439\u0442\u0435 \u043e\u0434\u043d\u0443 \u043d\u043e\u0434\u0443 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0439\u0442\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0443<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u0431\u044b\u0441\u0442\u0440\u044b\u0439-\u0441\u0442\u0430\u0440\u0442-production\"><span class=\"ez-toc-section\" id=\"%D0%91%D1%8B%D1%81%D1%82%D1%80%D1%8B%D0%B9_%D1%81%D1%82%D0%B0%D1%80%D1%82_Production\"><\/span>\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442 Production<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">bash<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><em># \u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f production \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f<\/em>\ngit clone https:\/\/github.com\/your-org\/docker-build-farm.git\ncd docker-build-farm\n\n<em># \u0420\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 Ansible<\/em>\nansible-playbook -i inventory\/production deploy-build-farm.yml\n\n<em># \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0430<\/em>\n.\/configure-client.sh --endpoint build.company.com --ca-cert ca.pem<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f:<\/strong>&nbsp;\u0412 production \u0432\u044b \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u0435 \u0441\u0431\u043e\u0440\u043a\u0443 \u0441 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0434\u044b, \u0430 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0435&nbsp;<strong>\u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441<\/strong>&nbsp;\u0441 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u043e\u043c \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c. \u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 2-3 \u043d\u043e\u0434 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0439\u0442\u0435\u0441\u044c \u043f\u043e \u043c\u0435\u0440\u0435 \u0440\u043e\u0441\u0442\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-\u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\"><span class=\"ez-toc-section\" id=\"%D0%97%D0%B0%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5\"><\/span>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Docker Build Offloading \u2014 \u043c\u043e\u0449\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u041e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0421\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0442\u044f\u0436\u0435\u043b\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u043d\u0430 \u043c\u043e\u0449\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0430 \u043d\u0435 \u043d\u0430 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435<\/li>\n\n\n\n<li>\u0415\u0434\u0438\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b<\/li>\n\n\n\n<li>\u041a\u0435\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0438 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438<\/li>\n\n\n\n<li>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">\u041d\u0430\u0447\u043d\u0438\u0442\u0435 \u0441 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043e\u0446\u0435\u043d\u0438\u0442\u0435 \u0432\u044b\u0433\u043e\u0434\u0443, \u0430 \u0437\u0430\u0442\u0435\u043c \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0439\u0442\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043d\u0443\u0436\u0434\u044b. \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 TLS \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 Docker Build Offloading \u0432 \u0441\u0432\u043e\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0438 \u043f\u043e\u0447\u0443\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0443!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Docker Build Offloading \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d? \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e: \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u043d\u0430 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u044f\u0436\u0435\u043b\u044b\u0439 Docker-\u043e\u0431\u0440\u0430\u0437. \u0418\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 10 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b, \u0442\u0440\u0430\u0442\u044f \u0432\u0440\u0435\u043c\u044f \u0438 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u0434\u0438\u0441\u043a\u0435. Docker Build Offloading \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b. \u042d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f&hellip;&nbsp;<a href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/\" rel=\"bookmark\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 &raquo;<span class=\"screen-reader-text\">Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[1],"tags":[],"class_list":["post-3705","post","type-post","status-publish","format-standard","hentry","category-1"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.7 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 - DockerHosting.ru<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/\" \/>\n<meta property=\"og:locale\" content=\"ru_RU\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\" \/>\n<meta property=\"og:description\" content=\"\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Docker Build Offloading \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d? \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e: \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u043d\u0430 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u044f\u0436\u0435\u043b\u044b\u0439 Docker-\u043e\u0431\u0440\u0430\u0437. \u0418\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 10 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b, \u0442\u0440\u0430\u0442\u044f \u0432\u0440\u0435\u043c\u044f \u0438 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u0434\u0438\u0441\u043a\u0435. Docker Build Offloading \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b. \u042d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f&hellip;&nbsp;\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 &raquo;Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\" \/>\n<meta property=\"og:url\" content=\"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/\" \/>\n<meta property=\"og:site_name\" content=\"DockerHosting.ru\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-22T00:01:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-12-22T02:06:12+00:00\" \/>\n<meta name=\"author\" content=\"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 \u043c\u0438\u043d\u0443\u0442\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\\\/\"},\"author\":{\"name\":\"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\",\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/#\\\/schema\\\/person\\\/065a7b9ff0b6c2ae566eb818352031b4\"},\"headline\":\"Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\",\"datePublished\":\"2025-12-22T00:01:45+00:00\",\"dateModified\":\"2025-12-22T02:06:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\\\/\"},\"wordCount\":912,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/#organization\"},\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\\\/\",\"url\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\\\/\",\"name\":\"Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 - DockerHosting.ru\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/#website\"},\"datePublished\":\"2025-12-22T00:01:45+00:00\",\"dateModified\":\"2025-12-22T02:06:12+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\\\/#breadcrumb\"},\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\",\"item\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/\",\"name\":\"\u0411\u043b\u043e\u0433 DockerHosting.ru\",\"description\":\"\u0411\u043b\u043e\u0433 \u0445\u043e\u0441\u0442\u0438\u043d\u0433-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b DockerHosting.ru\",\"publisher\":{\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ru-RU\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/#organization\",\"name\":\"DockerHosting.ru\",\"url\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/cropped-dockerhosting_cl.png\",\"contentUrl\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/11\\\/cropped-dockerhosting_cl.png\",\"width\":200,\"height\":36,\"caption\":\"DockerHosting.ru\"},\"image\":{\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/#\\\/schema\\\/person\\\/065a7b9ff0b6c2ae566eb818352031b4\",\"name\":\"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2691b71be8ab410fdd0c9e486970ee8d7ed141139a26f7753ca3ddf5a369bae0?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2691b71be8ab410fdd0c9e486970ee8d7ed141139a26f7753ca3ddf5a369bae0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/2691b71be8ab410fdd0c9e486970ee8d7ed141139a26f7753ca3ddf5a369bae0?s=96&d=mm&r=g\",\"caption\":\"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\"},\"sameAs\":[\"https:\\\/\\\/dockerhosting.ru\\\/blog\"],\"url\":\"https:\\\/\\\/dockerhosting.ru\\\/blog\\\/author\\\/aleks\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 - DockerHosting.ru","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/","og_locale":"ru_RU","og_type":"article","og_title":"Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432","og_description":"\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Docker Build Offloading \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u043d\u0443\u0436\u0435\u043d? \u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e: \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u043d\u0430 \u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0435 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438, \u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0442\u044f\u0436\u0435\u043b\u044b\u0439 Docker-\u043e\u0431\u0440\u0430\u0437. \u0418\u043b\u0438 \u0432 \u0432\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u0435 10 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b, \u0442\u0440\u0430\u0442\u044f \u0432\u0440\u0435\u043c\u044f \u0438 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u0434\u0438\u0441\u043a\u0435. Docker Build Offloading \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u044b. \u042d\u0442\u0430 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f&hellip;&nbsp;\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 &raquo;Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432","og_url":"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/","og_site_name":"DockerHosting.ru","article_published_time":"2025-12-22T00:01:45+00:00","article_modified_time":"2025-12-22T02:06:12+00:00","author":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","twitter_card":"summary_large_image","twitter_misc":{"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f":"5 \u043c\u0438\u043d\u0443\u0442"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#article","isPartOf":{"@id":"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/"},"author":{"name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","@id":"https:\/\/dockerhosting.ru\/blog\/#\/schema\/person\/065a7b9ff0b6c2ae566eb818352031b4"},"headline":"Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432","datePublished":"2025-12-22T00:01:45+00:00","dateModified":"2025-12-22T02:06:12+00:00","mainEntityOfPage":{"@id":"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/"},"wordCount":912,"commentCount":0,"publisher":{"@id":"https:\/\/dockerhosting.ru\/blog\/#organization"},"inLanguage":"ru-RU","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/","url":"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/","name":"Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 - DockerHosting.ru","isPartOf":{"@id":"https:\/\/dockerhosting.ru\/blog\/#website"},"datePublished":"2025-12-22T00:01:45+00:00","dateModified":"2025-12-22T02:06:12+00:00","breadcrumb":{"@id":"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#breadcrumb"},"inLanguage":"ru-RU","potentialAction":[{"@type":"ReadAction","target":["https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/dockerhosting.ru\/blog\/docker-build-offloading-polnoe-rukovodstvo-po-raspredelennoj-sborke-kontejnerov\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/dockerhosting.ru\/blog\/"},{"@type":"ListItem","position":2,"name":"Docker Build Offloading: \u041f\u043e\u043b\u043d\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432"}]},{"@type":"WebSite","@id":"https:\/\/dockerhosting.ru\/blog\/#website","url":"https:\/\/dockerhosting.ru\/blog\/","name":"\u0411\u043b\u043e\u0433 DockerHosting.ru","description":"\u0411\u043b\u043e\u0433 \u0445\u043e\u0441\u0442\u0438\u043d\u0433-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b DockerHosting.ru","publisher":{"@id":"https:\/\/dockerhosting.ru\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/dockerhosting.ru\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ru-RU"},{"@type":"Organization","@id":"https:\/\/dockerhosting.ru\/blog\/#organization","name":"DockerHosting.ru","url":"https:\/\/dockerhosting.ru\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/dockerhosting.ru\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/dockerhosting.ru\/blog\/wp-content\/uploads\/2024\/11\/cropped-dockerhosting_cl.png","contentUrl":"https:\/\/dockerhosting.ru\/blog\/wp-content\/uploads\/2024\/11\/cropped-dockerhosting_cl.png","width":200,"height":36,"caption":"DockerHosting.ru"},"image":{"@id":"https:\/\/dockerhosting.ru\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/dockerhosting.ru\/blog\/#\/schema\/person\/065a7b9ff0b6c2ae566eb818352031b4","name":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440","image":{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/secure.gravatar.com\/avatar\/2691b71be8ab410fdd0c9e486970ee8d7ed141139a26f7753ca3ddf5a369bae0?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/2691b71be8ab410fdd0c9e486970ee8d7ed141139a26f7753ca3ddf5a369bae0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/2691b71be8ab410fdd0c9e486970ee8d7ed141139a26f7753ca3ddf5a369bae0?s=96&d=mm&r=g","caption":"\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440"},"sameAs":["https:\/\/dockerhosting.ru\/blog"],"url":"https:\/\/dockerhosting.ru\/blog\/author\/aleks\/"}]}},"_links":{"self":[{"href":"https:\/\/dockerhosting.ru\/blog\/wp-json\/wp\/v2\/posts\/3705","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dockerhosting.ru\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dockerhosting.ru\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dockerhosting.ru\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/dockerhosting.ru\/blog\/wp-json\/wp\/v2\/comments?post=3705"}],"version-history":[{"count":5,"href":"https:\/\/dockerhosting.ru\/blog\/wp-json\/wp\/v2\/posts\/3705\/revisions"}],"predecessor-version":[{"id":3710,"href":"https:\/\/dockerhosting.ru\/blog\/wp-json\/wp\/v2\/posts\/3705\/revisions\/3710"}],"wp:attachment":[{"href":"https:\/\/dockerhosting.ru\/blog\/wp-json\/wp\/v2\/media?parent=3705"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dockerhosting.ru\/blog\/wp-json\/wp\/v2\/categories?post=3705"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dockerhosting.ru\/blog\/wp-json\/wp\/v2\/tags?post=3705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}