{"id":105598,"date":"2025-04-11T19:01:38","date_gmt":"2025-04-11T14:31:38","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/"},"modified":"2025-04-11T19:01:38","modified_gmt":"2025-04-11T14:31:38","slug":"building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/","title":{"rendered":"\u0633\u0627\u062e\u062a\u0645\u0627\u0646 \u0648 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0633\u0627\u0632\u06cc \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Flask \u0628\u0627 Docker \u060c Github \u0648 CI\/CD"},"content":{"rendered":"<div data-article-id=\"2399858\" id=\"article-body\">\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_84 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/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:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/#%D9%85%D9%82%D8%AF%D9%85%D9%87\" >\u0645\u0642\u062f\u0645\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/#%E2%9A%99_%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\" >\u2699 \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/#%E2%9C%85_%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%DB%8C%DA%A9_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D9%81%D9%84%D8%A7%D8%B3%DA%A9_%D8%B3%D8%A7%D8%AF%D9%87_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\" >\u2705 \u0645\u0631\u062d\u0644\u0647 1: \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0644\u0627\u0633\u06a9 \u0633\u0627\u062f\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/#%E2%9C%85_%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%B1%D8%A7_%DA%A9%D8%A7%D9%86%D8%AA%DB%8C%D9%86%D8%B1_%DA%A9%D9%86%DB%8C%D8%AF\" >\u2705 \u0645\u0631\u062d\u0644\u0647 2: \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u06a9\u0646\u06cc\u062f<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/#%E2%9C%85_%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%DA%A9%D9%86%D8%AA%D8%B1%D9%84_%D9%86%D8%B3%D8%AE%D9%87\" >\u2705 \u0645\u0631\u062d\u0644\u0647 3: \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u062a\u0631\u0644 \u0646\u0633\u062e\u0647<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/#%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1_git_github\" >\u0627\u0628\u0632\u0627\u0631: git + github<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/#%E2%9C%85_%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_CICD_%D8%B1%D8%A7_%D8%A8%D8%A7_%D8%A7%D9%82%D8%AF%D8%A7%D9%85%D8%A7%D8%AA_GitHub_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\" >\u2705 \u0645\u0631\u062d\u0644\u0647 4: CI\/CD \u0631\u0627 \u0628\u0627 \u0627\u0642\u062f\u0627\u0645\u0627\u062a GitHub \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/#%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7_%D8%A7%D9%82%D8%AF%D8%A7%D9%85%D8%A7%D8%AA_GitHub_%D8%8C_Docker_Hub\" >\u0627\u0628\u0632\u0627\u0631\u0647\u0627: \u0627\u0642\u062f\u0627\u0645\u0627\u062a GitHub \u060c Docker Hub<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/#%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%D9%86%D9%87%D8%A7%DB%8C%DB%8C\" >\u0646\u062a\u06cc\u062c\u0647 \u0646\u0647\u0627\u06cc\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/#%F0%9F%8E%AF_%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\" >\ud83c\udfaf \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/nabfollower.com\/blog\/building-and-automating-the-deployment-of-a-flask-application-with-docker-github-and-cicd-2dc4\/#%D8%B9%DB%8C%D8%A8_%DB%8C%D8%A7%D8%A8%DB%8C\" >\u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"%D9%85%D9%82%D8%AF%D9%85%D9%87\"><\/span>\n<p>  \u0645\u0642\u062f\u0645\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u060c \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u06a9\u0631\u062f\u0646 \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0633\u0627\u062f\u0647 \u0641\u0644\u0627\u0633\u06a9 \u0631\u0627 \u0628\u0627 Docker \u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 GitHub \u0628\u0631\u0627\u06cc \u06a9\u0646\u062a\u0631\u0644 \u0646\u0633\u062e\u0647 \u0648 \u0627\u0642\u062f\u0627\u0645\u0627\u062a GitHub \u0628\u0631\u0627\u06cc \u0627\u062f\u063a\u0627\u0645 \u0645\u062f\u0627\u0648\u0645\/\u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u062f\u0627\u0648\u0645 (CI\/CD) \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f. \u0634\u0645\u0627 \u06cc\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u062f \u06af\u0631\u0641\u062a \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647:<\/p>\n<ul>\n<li>\u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0633\u0627\u062f\u0647 \u0641\u0644\u0627\u0633\u06a9 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Docker Containerize \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u06a9\u0646\u062a\u0631\u0644 \u0646\u0633\u062e\u0647 \u0631\u0627 \u0628\u0627 Git \u0648 GitHub \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\u062e\u0637\u0648\u0637 \u0644\u0648\u0644\u0647 CI\/CD \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u0642\u062f\u0627\u0645\u0627\u062a GitHub \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u062a\u0635\u0648\u06cc\u0631 Docker \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f.<\/li>\n<\/ul>\n<h2><span class=\"ez-toc-section\" id=\"%E2%9A%99_%D9%BE%DB%8C%D8%B4_%D9%86%DB%8C%D8%A7%D8%B2%D9%87%D8%A7\"><\/span>\n<p>  \u2699 \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632\u0647\u0627<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0634\u0631\u0648\u0639 \u060c \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0627\u0628\u0632\u0627\u0631\u0647\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f:<\/p>\n<ul>\n<li>\n<strong>\u067e\u06cc\u062a\u0648\u0646<\/strong>: \u06cc\u06a9 \u0632\u0628\u0627\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc \u0628\u0631\u0627\u06cc \u0633\u0627\u062e\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627\u06cc \u0648\u0628.<\/li>\n<li>\n<strong>\u0641\u0644\u0627\u0633\u06a9<\/strong>: \u06cc\u06a9 \u0686\u0627\u0631\u0686\u0648\u0628 \u0648\u0628 \u0633\u0628\u06a9 \u0648\u0632\u0646 \u067e\u0627\u06cc\u062a\u0648\u0646.<\/li>\n<li>\n<strong>\u0627\u0633\u06a9\u0644\u0647<\/strong>: \u0633\u06a9\u0648\u06cc\u06cc \u0628\u0631\u0627\u06cc \u062a\u0648\u0633\u0639\u0647 \u060c \u062d\u0645\u0644 \u0648 \u0646\u0642\u0644 \u0648 \u0627\u062c\u0631\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0647\u0627 \u062f\u0631 \u0638\u0631\u0648\u0641.<\/li>\n<li>\n<strong>\u06af\u0648\u062f\u0627\u0644<\/strong>: \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u06a9\u0646\u062a\u0631\u0644 \u0646\u0633\u062e\u0647 \u0628\u0631\u0627\u06cc \u0631\u062f\u06cc\u0627\u0628\u06cc \u062a\u063a\u06cc\u06cc\u0631\u0627\u062a \u062f\u0631 \u06a9\u062f.<\/li>\n<li>\n<strong>\u0644\u0648\u0628<\/strong>: \u0628\u0633\u062a\u0631\u06cc \u0628\u0631\u0627\u06cc \u0645\u06cc\u0632\u0628\u0627\u0646\u06cc \u0648 \u0627\u0634\u062a\u0631\u0627\u06a9 \u0645\u062e\u0627\u0632\u0646 \u06a9\u062f.<\/li>\n<li>\n<strong>\u0642\u0637\u0628<\/strong>: \u06cc\u06a9 \u0631\u062c\u06cc\u0633\u062a\u0631\u06cc \u0645\u0628\u062a\u0646\u06cc \u0628\u0631 \u0627\u0628\u0631 \u0628\u0631\u0627\u06cc \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u06af\u0630\u0627\u0634\u062a\u0646 \u062a\u0635\u0627\u0648\u06cc\u0631 Docker.<\/li>\n<\/ul>\n<p>\u0627\u06af\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0627\u0631\u062f \u0631\u0627 \u0646\u0635\u0628 \u0646\u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f \u060c \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0648\u0631\u0627\u0644\u0639\u0645\u0644 \u0647\u0627\u06cc \u0646\u0635\u0628 \u0628\u0647 \u0648\u0628 \u0633\u0627\u06cc\u062a \u0647\u0627\u06cc \u0631\u0633\u0645\u06cc \u0645\u0631\u0628\u0648\u0637\u0647 \u0645\u0631\u0627\u062c\u0639\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%E2%9C%85_%D9%85%D8%B1%D8%AD%D9%84%D9%87_1_%DB%8C%DA%A9_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D9%81%D9%84%D8%A7%D8%B3%DA%A9_%D8%B3%D8%A7%D8%AF%D9%87_%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u2705 \u0645\u0631\u062d\u0644\u0647 1: \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0644\u0627\u0633\u06a9 \u0633\u0627\u062f\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ol>\n<li>\n<p><strong>\u06cc\u06a9 \u067e\u0648\u0634\u0647 \u062c\u062f\u06cc\u062f \u0628\u0631\u0627\u06cc \u067e\u0631\u0648\u0698\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code><span class=\"nb\">mkdir <\/span>flask-devops-app\n<span class=\"nb\">cd <\/span>flask-devops-app\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><\/p>\n<ol>\n<li>\n<p><strong>\u06cc\u06a9 \u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc Python \u0631\u0627 \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code>python <span class=\"nt\">-m<\/span> venv venv\n<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u0645\u062d\u06cc\u0637 \u0645\u062c\u0627\u0632\u06cc \u0631\u0627 \u0641\u0639\u0627\u0644 \u06a9\u0646\u06cc\u062f<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code><span class=\"nb\">source <\/span>venv\/Scripts\/activate  <span class=\"c\"># On Windows use: venv\\Scripts\\activate<\/span>\n<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u0641\u0644\u0627\u0633\u06a9 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code>pip <span class=\"nb\">install <\/span>flask\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbqagsnwqysl5s7etkm7t.png\" alt=\"\u0645\u0628\u0647\u0645 \u06a9\u0631\u062f\u0646\" loading=\"lazy\" width=\"616\" height=\"226\" title=\"\"><\/p>\n<ol>\n<li>\n<p><strong>\u0627\u06cc\u062c\u0627\u062f <code>app.py<\/code> \u067e\u0631\u0648\u0646\u062f\u0647<\/strong>:<\/p>\n<pre class=\"highlight python\"><code><span class=\"c1\"># app.py\n<\/span><span class=\"kn\">from<\/span> <span class=\"n\">flask<\/span> <span class=\"kn\">import<\/span> <span class=\"n\">Flask<\/span>\n\n<span class=\"n\">app<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">Flask<\/span><span class=\"p\">(<\/span><span class=\"n\">__name__<\/span><span class=\"p\">)<\/span>\n\n<span class=\"nd\">@app.route<\/span><span class=\"p\">(<\/span><span class=\"sh\">'<\/span><span class=\"s\">\/<\/span><span class=\"sh\">'<\/span><span class=\"p\">)<\/span>\n<span class=\"k\">def<\/span> <span class=\"nf\">hello<\/span><span class=\"p\">():<\/span>\n    <span class=\"k\">return<\/span> <span class=\"sh\">\"<\/span><span class=\"s\">Hello DevOps!<\/span><span class=\"sh\">\"<\/span>\n\n<span class=\"k\">if<\/span> <span class=\"n\">__name__<\/span> <span class=\"o\">==<\/span> <span class=\"sh\">'<\/span><span class=\"s\">__main__<\/span><span class=\"sh\">'<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">app<\/span><span class=\"p\">.<\/span><span class=\"nf\">run<\/span><span class=\"p\">(<\/span><span class=\"n\">host<\/span><span class=\"o\">=<\/span><span class=\"sh\">'<\/span><span class=\"s\">0.0.0.0<\/span><span class=\"sh\">'<\/span><span class=\"p\">,<\/span> <span class=\"n\">port<\/span><span class=\"o\">=<\/span><span class=\"mi\">5000<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0y26e7uzukn62atgsgxg.png\" alt=\"\u067e\u0631\u0648\u0646\u062f\u0647\" loading=\"lazy\" width=\"594\" height=\"304\" title=\"\"><\/p>\n<ol>\n<li>\n<p><strong>\u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code>python app.py\n<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0628\u0627\u0632\u062f\u06cc\u062f <code>http:\/\/localhost:5000<\/code> \u062f\u0631 \u0645\u0631\u0648\u0631\u06af\u0631 \u062e\u0648\u062f \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0628\u0628\u06cc\u0646\u06cc\u062f <code>\"Hello DevOps!\"<\/code>\u0628\u0634\u0631<\/p>\n<\/li>\n<\/ol>\n<h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7vxid5rie3t40phlx4b.png\" alt=\"\u0633\u0644\u0627\u0645 devops\" loading=\"lazy\" width=\"403\" height=\"106\" title=\"\"><br \/>\n<\/h2>\n<h2><span class=\"ez-toc-section\" id=\"%E2%9C%85_%D9%85%D8%B1%D8%AD%D9%84%D9%87_2_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87_%D8%B1%D8%A7_%DA%A9%D8%A7%D9%86%D8%AA%DB%8C%D9%86%D8%B1_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u2705 \u0645\u0631\u062d\u0644\u0647 2: \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ol>\n<li>\n<p><strong>\u0627\u06cc\u062c\u0627\u062f a <code>Dockerfile<\/code> \u062f\u0631 \u0647\u0645\u0627\u0646 \u067e\u0648\u0634\u0647<\/strong>:<\/p>\n<pre class=\"highlight docker\"><code><span class=\"c\"># Dockerfile<\/span>\n<span class=\"k\">FROM<\/span><span class=\"s\"> python:3.9-slim<\/span>\n\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/app<\/span>\n\n<span class=\"k\">COPY<\/span><span class=\"s\"> requirements.txt requirements.txt<\/span>\n<span class=\"k\">RUN <\/span>pip <span class=\"nb\">install<\/span> <span class=\"nt\">-r<\/span> requirements.txt\n\n<span class=\"k\">COPY<\/span><span class=\"s\"> . .<\/span>\n\n<span class=\"k\">CMD<\/span><span class=\"s\"> [\"python\", \"app.py\"]<\/span>\n\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F75ymp6d6czfjrihseafz.png\" alt=\"\u062f\u0627\u06a9\" loading=\"lazy\" width=\"493\" height=\"292\" title=\"\"><\/p>\n<ol>\n<li>\n<p><strong>\u062a\u0648\u0644\u06cc\u062f \u06a9\u0631\u062f\u0646 <code>requirements.txt<\/code><\/strong>:<\/p>\n<pre class=\"highlight shell\"><code>pip freeze <span class=\"o\">&gt;<\/span> requirements.txt\n<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u0627\u06cc\u062c\u0627\u062f a <code>.dockerignore<\/code> \u067e\u0631\u0648\u0646\u062f\u0647<\/strong>:<\/p>\n<pre class=\"highlight plaintext\"><code>__pycache__\/\n*.pyc\nvenv\/\n<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u062a\u0635\u0648\u06cc\u0631 Docker \u0631\u0627 \u0628\u0633\u0627\u0632\u06cc\u062f<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code>docker build <span class=\"nt\">-t<\/span> flask-devops-app <span class=\"nb\">.<\/span>\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7sxbi73inoqmyflastxw.png\" alt=\"\u062f\u0627\u06a9\" loading=\"lazy\" width=\"800\" height=\"729\" title=\"\"><\/p>\n<ol>\n<li>\n<p><strong>\u0638\u0631\u0641 Docker \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code>docker run <span class=\"nt\">-p<\/span> 5000:5000 flask-devops-app\n<\/code><\/pre>\n<\/li>\n<li>\n<p>\u0628\u0627\u0632 <code>http:\/\/localhost:5000<\/code> \u062f\u0648\u0628\u0627\u0631\u0647 \u0648 \u062f\u06cc\u062f\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u062f\u0631 \u062f\u0627\u062e\u0644 \u06cc\u06a9 \u0638\u0631\u0641 Docker.<\/p>\n<\/li>\n<\/ol>\n<h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fppn8dxubog8pnufu3nv2.png\" alt=\"\u062f\u0627\u06a9\u0631 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627\" loading=\"lazy\" width=\"792\" height=\"219\" title=\"\"><br \/>\n<\/h2>\n<h2><span class=\"ez-toc-section\" id=\"%E2%9C%85_%D9%85%D8%B1%D8%AD%D9%84%D9%87_3_%D8%AA%D9%86%D8%B8%DB%8C%D9%85_%DA%A9%D9%86%D8%AA%D8%B1%D9%84_%D9%86%D8%B3%D8%AE%D9%87\"><\/span>\n<p>  \u2705 \u0645\u0631\u062d\u0644\u0647 3: \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u062a\u0631\u0644 \u0646\u0633\u062e\u0647<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1_git_github\"><\/span>\n<p>  \u0627\u0628\u0632\u0627\u0631: git + github<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol>\n<li>\n<p><strong>\u06cc\u06a9 \u0645\u062e\u0632\u0646 git \u0631\u0627 \u0622\u063a\u0627\u0632 \u06a9\u0646\u06cc\u062f<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code>git init\n<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u0627\u06cc\u062c\u0627\u062f a <code>.gitignore<\/code> \u067e\u0631\u0648\u0646\u062f\u0647<\/strong>:<\/p>\n<pre class=\"highlight plaintext\"><code>venv\/\n__pycache__\/\n*.pyc\n<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u067e\u0631\u0648\u0646\u062f\u0647 \u0647\u0627\u06cc \u062e\u0648\u062f \u0631\u0627 \u0645\u0631\u062a\u06a9\u0628 \u0634\u0648\u06cc\u062f<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code>git add <span class=\"nb\">.<\/span>\ngit commit <span class=\"nt\">-m<\/span> <span class=\"s2\">\"Initial commit\"<\/span>\n<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u06cc\u06a9 \u0645\u062e\u0632\u0646 GitHub \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0647 \u0648 \u0622\u0646 \u0631\u0627 \u0628\u0647 repo \u0645\u062d\u0644\u06cc \u062e\u0648\u062f \u067e\u06cc\u0648\u0646\u062f \u062f\u0647\u06cc\u062f<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code>git remote add origin https:\/\/github.com\/YOUR_USERNAME\/flask-devops-app.git\ngit branch <span class=\"nt\">-M<\/span> main\ngit push <span class=\"nt\">-u<\/span> origin main\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<h2>\n<p>  <img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9w4ayx1hwt3zehw2rsg3.png\" alt=\"Git Remote Add\" loading=\"lazy\" width=\"800\" height=\"408\" title=\"\"><br \/>\n<\/h2>\n<h2><span class=\"ez-toc-section\" id=\"%E2%9C%85_%D9%85%D8%B1%D8%AD%D9%84%D9%87_4_CICD_%D8%B1%D8%A7_%D8%A8%D8%A7_%D8%A7%D9%82%D8%AF%D8%A7%D9%85%D8%A7%D8%AA_GitHub_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87_%D8%B3%D8%A7%D8%B2%DB%8C_%DA%A9%D9%86%DB%8C%D8%AF\"><\/span>\n<p>  \u2705 \u0645\u0631\u062d\u0644\u0647 4: CI\/CD \u0631\u0627 \u0628\u0627 \u0627\u0642\u062f\u0627\u0645\u0627\u062a GitHub \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h3><span class=\"ez-toc-section\" id=\"%D8%A7%D8%A8%D8%B2%D8%A7%D8%B1%D9%87%D8%A7_%D8%A7%D9%82%D8%AF%D8%A7%D9%85%D8%A7%D8%AA_GitHub_%D8%8C_Docker_Hub\"><\/span>\n<p>  \u0627\u0628\u0632\u0627\u0631\u0647\u0627: \u0627\u0642\u062f\u0627\u0645\u0627\u062a GitHub \u060c Docker Hub<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol>\n<li>\n<p><strong>\u0627\u06cc\u062c\u0627\u062f a <code>.github\/workflows\/docker-publish.yml<\/code> \u067e\u0631\u0648\u0646\u062f\u0647<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code><span class=\"nb\">mkdir<\/span> <span class=\"nt\">-p<\/span> .github\/workflows\n<span class=\"nb\">touch<\/span> .github\/workflows\/docker-publish.yml\n<\/code><\/pre>\n<\/li>\n<li>\n<p><strong>\u0648\u06cc\u0631\u0627\u06cc\u0634 <code>docker-publish.yml<\/code> \u067e\u0631\u0648\u0646\u062f\u0647<\/strong> \u0648 \u0645\u062d\u062a\u0648\u0627\u06cc \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<pre class=\"highlight yaml\"><code><span class=\"c1\"># .github\/workflows\/docker-publish.yml<\/span>\n<span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build and Push Docker Image<\/span>\n\n<span class=\"na\">on<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">push<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">branches<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span> <span class=\"nv\">main<\/span> <span class=\"pi\">]<\/span>\n\n<span class=\"na\">jobs<\/span><span class=\"pi\">:<\/span>\n  <span class=\"na\">build<\/span><span class=\"pi\">:<\/span>\n    <span class=\"na\">runs-on<\/span><span class=\"pi\">:<\/span> <span class=\"s\">ubuntu-latest<\/span>\n\n    <span class=\"na\">steps<\/span><span class=\"pi\">:<\/span>\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Checkout code<\/span>\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">actions\/checkout@v3<\/span>\n\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Set up Docker Buildx<\/span>\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker\/setup-buildx-action@v2<\/span>\n\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Log in to Docker Hub<\/span>\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker\/login-action@v2<\/span>\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">username<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.DOCKER_USERNAME }}<\/span>\n          <span class=\"na\">password<\/span><span class=\"pi\">:<\/span> <span class=\"s\">${{ secrets.DOCKER_PASSWORD }}<\/span>\n\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Build and push image<\/span>\n        <span class=\"na\">uses<\/span><span class=\"pi\">:<\/span> <span class=\"s\">docker\/build-push-action@v5<\/span>\n        <span class=\"na\">with<\/span><span class=\"pi\">:<\/span>\n          <span class=\"na\">context<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.<\/span>\n          <span class=\"na\">push<\/span><span class=\"pi\">:<\/span> <span class=\"kc\">true<\/span>\n          <span class=\"na\">tags<\/span><span class=\"pi\">:<\/span> <span class=\"s\">YOUR_DOCKERHUB_USERNAME\/flask-devops-app:latest<\/span>\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi1pk149np69aqutac5xc.png\" alt=\"YML\" loading=\"lazy\" width=\"634\" height=\"619\" title=\"\"><\/p>\n<ol>\n<li>\n<strong>\u0627\u0639\u062a\u0628\u0627\u0631 Docker Hub \u0631\u0627 \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0627\u0633\u0631\u0627\u0631 GitHub \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f<\/strong>:<\/p>\n<ul>\n<li>\u0628\u0647 \u0645\u062e\u0632\u0646 GitHub \u062e\u0648\u062f \u0628\u0631\u0648\u06cc\u062f <strong>\u062a\u0646\u0638\u06cc\u0645\u0627\u062a<\/strong> \u2192 <strong>\u0627\u0633\u0631\u0627\u0631 \u0648 \u0645\u062a\u063a\u06cc\u0631\u0647\u0627<\/strong> \u2192 <strong>\u0627\u0642\u062f\u0627\u0645\u0627\u062a<\/strong>\n<\/li>\n<li>\u0627\u0633\u0631\u0627\u0631 \u0632\u06cc\u0631 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:\n<ul>\n<li>\n<code>DOCKER_USERNAME<\/code>  \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc Hub Docker Hub \u0634\u0645\u0627<\/li>\n<li>\n<code>DOCKER_PASSWORD<\/code>  \u2192 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 Docker Hub \u06cc\u0627 \u0646\u0634\u0627\u0646\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftlgbv5tt2e911s109m0s.png\" alt=\"\u0627\u0639\u062a\u0628\u0627\u0631\" loading=\"lazy\" width=\"800\" height=\"356\" title=\"\"><\/p>\n<ol>\n<li>\n<p><strong>\u062f\u0648\u0628\u0627\u0631\u0647 \u06a9\u062f \u062e\u0648\u062f \u0631\u0627 \u0641\u0634\u0627\u0631 \u062f\u0647\u06cc\u062f<\/strong>:<\/p>\n<pre class=\"highlight shell\"><code>git add <span class=\"nb\">.<\/span>\ngit commit <span class=\"nt\">-m<\/span> <span class=\"s2\">\"Add CI\/CD workflow\"<\/span>\ngit push\n<\/code><\/pre>\n<\/li>\n<\/ol>\n<p>\u0627\u0642\u062f\u0627\u0645\u0627\u062a GitHub \u0627\u06a9\u0646\u0648\u0646 \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062a\u0635\u0648\u06cc\u0631 Docker \u0634\u0645\u0627 \u0631\u0627 \u0645\u06cc \u0633\u0627\u0632\u062f \u0648 \u0647\u0631 \u0632\u0645\u0627\u0646 \u06a9\u0647 \u0628\u0647 \u0622\u0646 \u0641\u0634\u0627\u0631 \u0645\u06cc \u0622\u0648\u0631\u06cc\u062f \u060c \u0622\u0646 \u0631\u0627 \u0628\u0647 Docker Hub \u0633\u0648\u0642 \u0645\u06cc \u062f\u0647\u062f <code>main<\/code> \u0634\u0627\u062e\u0647<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%D9%86%D9%87%D8%A7%DB%8C%DB%8C\"><\/span>\n<p>  \u0646\u062a\u06cc\u062c\u0647 \u0646\u0647\u0627\u06cc\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/media2.dev.to\/dynamic\/image\/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F258pjoj8fqkpqfhquno9.png\" alt=\"\u0645\u062d\u0631\u06a9\" loading=\"lazy\" width=\"800\" height=\"503\" title=\"\"><\/p>\n<ul>\n<li>\u2705 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0644\u0627\u0633\u06a9 \u0632\u0646\u062f\u0647 \u06a9\u0647 \u062f\u0631 \u062f\u0627\u062e\u0644 \u06cc\u06a9 \u0638\u0631\u0641 Docker \u0627\u062c\u0631\u0627 \u0645\u06cc \u0634\u0648\u062f.<\/li>\n<li>code \u06a9\u062f \u0645\u0646\u0628\u0639 \u062f\u0631 GitHub \u0645\u06cc\u0632\u0628\u0627\u0646 \u0627\u0633\u062a.<\/li>\n<li>\u2705 \u062a\u0635\u0648\u06cc\u0631 Docker \u0628\u0647 \u0637\u0648\u0631 \u062e\u0648\u062f\u06a9\u0627\u0631 \u0633\u0627\u062e\u062a\u0647 \u0645\u06cc \u0634\u0648\u062f \u0648 \u062f\u0631 \u0647\u0631 \u062a\u0639\u0647\u062f \u0628\u0647 Docker Hub \u0631\u0627\u0646\u062f\u0647 \u0645\u06cc \u0634\u0648\u062f.<\/li>\n<\/ul>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%F0%9F%8E%AF_%D9%86%D8%AA%DB%8C%D8%AC%D9%87_%DA%AF%DB%8C%D8%B1%DB%8C\"><\/span>\n<p>  \ud83c\udfaf \u0646\u062a\u06cc\u062c\u0647 \u06af\u06cc\u0631\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u062a\u0628\u0631\u06cc\u06a9 \u0645\u06cc \u06af\u0648\u06cc\u0645! \u0634\u0645\u0627 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 Flask \u0633\u0627\u062f\u0647 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f \u060c \u0622\u0646 \u0631\u0627 \u0628\u0627 Docker Contained \u060c \u06a9\u0646\u062a\u0631\u0644 \u0646\u0633\u062e\u0647 \u0628\u0627 Git \u0648 Github \u060c \u0648 CI\/CD \u0631\u0627 \u0628\u0627 \u0627\u0642\u062f\u0627\u0645\u0627\u062a GitHub \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f. \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u06cc\u06a9 \u06af\u0627\u0645 \u0627\u0633\u0627\u0633\u06cc \u062f\u0631 \u0633\u0627\u062e\u062a \u0633\u06cc\u0633\u062a\u0645 \u0647\u0627\u06cc \u0645\u0642\u06cc\u0627\u0633 \u067e\u0630\u06cc\u0631 \u0648 \u062e\u0648\u062f\u06a9\u0627\u0631 \u062f\u0631 DevOps \u0627\u0633\u062a.<\/p>\n<hr\/>\n<h2><span class=\"ez-toc-section\" id=\"%D8%B9%DB%8C%D8%A8_%DB%8C%D8%A7%D8%A8%DB%8C\"><\/span>\n<p>  \u0639\u06cc\u0628 \u06cc\u0627\u0628\u06cc<br \/>\n<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>\n<strong>\u0627\u06af\u0631 \u062f\u0627\u06a9\u0631 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0646\u06cc\u0633\u062a<\/strong>: \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u062f\u0633\u06a9 \u062a\u0627\u067e Docker \u0628\u0627\u0632 \u0648 \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0627\u0633\u062a.<\/li>\n<li>\n<strong>\u0627\u06af\u0631 \u0628\u0627 \u0627\u0642\u062f\u0627\u0645\u0627\u062a GitHub \u0628\u0627 \u0645\u0634\u06a9\u0644\u0627\u062a \u0645\u062c\u0648\u0632 \u0631\u0648\u0628\u0631\u0648 \u0634\u062f\u06cc\u062f<\/strong>: \u0627\u0639\u062a\u0628\u0627\u0631\u0646\u0627\u0645\u0647 Docker Hub \u062e\u0648\u062f \u0631\u0627 \u062f\u0631 \u0627\u0633\u0631\u0627\u0631 Github \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f.<\/li>\n<li>\n<strong>\u0627\u06af\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u0641\u0644\u0627\u0633\u06a9 \u0628\u0627\u0631\u06af\u06cc\u0631\u06cc \u0646\u0634\u0648\u062f<\/strong>: \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0627\u0632 \u062f\u0631\u06af\u0627\u0647 \u0635\u062d\u06cc\u062d \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f \u0648 \u0638\u0631\u0641 Docker \u062f\u0631 \u062d\u0627\u0644 \u0627\u062c\u0631\u0627 \u0627\u0633\u062a. \u0646\u06cc\u0627\u0632\u0647\u0627!<\/li>\n<\/ul><\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u0645\u0642\u062f\u0645\u0647 \u0627\u06cc\u0646 \u067e\u0631\u0648\u0698\u0647 \u0646\u062d\u0648\u0647 \u0633\u0627\u062e\u062a \u060c \u06a9\u0627\u0646\u062a\u06cc\u0646\u0631 \u06a9\u0631\u062f\u0646 \u0648 \u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0633\u0627\u062f\u0647 \u0641\u0644\u0627\u0633\u06a9 \u0631\u0627 \u0628\u0627 Docker \u060c \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 GitHub \u0628\u0631\u0627\u06cc \u06a9\u0646\u062a\u0631\u0644 \u0646\u0633\u062e\u0647 \u0648 \u0627\u0642\u062f\u0627\u0645\u0627\u062a GitHub \u0628\u0631\u0627\u06cc \u0627\u062f\u063a\u0627\u0645 \u0645\u062f\u0627\u0648\u0645\/\u0627\u0633\u062a\u0642\u0631\u0627\u0631 \u0645\u062f\u0627\u0648\u0645 (CI\/CD) \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f. \u0634\u0645\u0627 \u06cc\u0627\u062f \u062e\u0648\u0627\u0647\u06cc\u062f \u06af\u0631\u0641\u062a \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647: \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 \u0648\u0628 \u0633\u0627\u062f\u0647 \u0641\u0644\u0627\u0633\u06a9 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u062f. \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 Docker &hellip;<\/p>\n","protected":false},"author":2,"featured_media":105599,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-105598","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/105598","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=105598"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/105598\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/105599"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=105598"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=105598"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=105598"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}