{"id":88584,"date":"2025-06-29T13:54:45","date_gmt":"2025-06-29T06:54:45","guid":{"rendered":"https:\/\/itviec.com\/blog\/?p=88584"},"modified":"2025-06-29T22:33:15","modified_gmt":"2025-06-29T15:33:15","slug":"dockerfile-la-gi","status":"publish","type":"post","link":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/","title":{"rendered":"Dockerfile l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn vi\u1ebft Dockerfile theo c\u1ea5u tr\u00fac chu\u1ea9n"},"content":{"rendered":"<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\">N\u1ed9i dung b\u00e0i vi\u1ebft<\/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:\/\/itviec.com\/blog\/dockerfile-la-gi\/#Tong_quan_ve_Dockerfile\" >T\u1ed5ng quan v\u1ec1 Dockerfile<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#8_chi_thi_co_ban_cua_moi_Dockerfile\" >8 ch\u1ec9 th\u1ecb c\u01a1 b\u1ea3n c\u1ee7a m\u1ecdi Dockerfile<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#Cau_truc_pho_bien_cua_mot_Dockerfile\" >C\u1ea5u tr\u00fac ph\u1ed5 bi\u1ebfn c\u1ee7a m\u1ed9t Dockerfile<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#Huong_dan_8_buoc_viet_Dockerfile_chi_tiet\" >H\u01b0\u1edbng d\u1eabn 8 b\u01b0\u1edbc vi\u1ebft Dockerfile chi ti\u1ebft<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#Cach_tao_image_tu_Dockerfile\" >C\u00e1ch t\u1ea1o image t\u1eeb Dockerfile<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#So_sanh_Dockerfile_va_Docker_Compose\" >So s\u00e1nh Dockerfile v\u00e0 Docker Compose&nbsp;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#Nhung_loi_pho_bien_khi_viet_Dockerfile_va_cach_khac_phuc\" >Nh\u1eefng l\u1ed7i ph\u1ed5 bi\u1ebfn khi vi\u1ebft Dockerfile v\u00e0 c\u00e1ch kh\u1eafc ph\u1ee5c&nbsp;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#Cac_cau_hoi_thuong_gap_ve_Dockerfile\" >C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Dockerfile<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#Tong_ket_Dockerfile_la_gi\" >T\u1ed5ng k\u1ebft Dockerfile l\u00e0 g\u00ec<\/a><\/li><\/ul><\/nav><\/div>\n\n<p><strong><em>Khi b\u1eaft \u0111\u1ea7u v\u1edbi Docker, Dockerfile ch\u00ednh l\u00e0 b\u01b0\u1edbc \u0111\u1ea7u ti\u00ean \u0111\u1ec3 &#8220;l\u00e0m ch\u1ee7&#8221; c\u00f4ng ngh\u1ec7 container. D\u00f9 ch\u1ec9 l\u00e0 m\u1ed9t file v\u0103n b\u1ea3n \u0111\u01a1n gi\u1ea3n, Dockerfile l\u1ea1i \u0111\u00f3ng vai tr\u00f2 quan tr\u1ecdng trong vi\u1ec7c t\u1ef1 \u0111\u1ed9ng h\u00f3a qu\u00e1 tr\u00ecnh t\u1ea1o ra Docker image cho \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n. Ch\u00fang ta s\u1ebd c\u00f9ng nhau t\u00ecm hi\u1ec3u Dockerfile l\u00e0 g\u00ec, c\u00e1ch vi\u1ebft Dockerfile t\u1eeb c\u01a1 b\u1ea3n \u0111\u1ebfn n\u00e2ng cao, v\u1edbi c\u00e1c v\u00ed d\u1ee5 th\u1ef1c t\u1ebf d\u1ec5 hi\u1ec3u &#8211; ph\u00f9 h\u1ee3p cho c\u1ea3 ng\u01b0\u1eddi m\u1edbi h\u1ecdc v\u00e0 l\u1eadp tr\u00ecnh vi\u00ean mu\u1ed1n l\u00e0m vi\u1ec7c hi\u1ec7u qu\u1ea3 h\u01a1n v\u1edbi Docker.<\/em><\/strong><\/p>\n\n\n\n<p>\u0110\u1ecdc b\u00e0i vi\u1ebft sau \u0111\u1ec3 bi\u1ebft th\u00eam v\u1ec1:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>T\u1ed5ng quan v\u1ec1 Dockerfile<\/li>\n\n\n\n<li>C\u1ea5u tr\u00fac c\u01a1 b\u1ea3n c\u1ee7a Dockerfile<\/li>\n\n\n\n<li>H\u01b0\u1edbng d\u1eabn vi\u1ebft Dockerfile chi ti\u1ebft t\u1eebng b\u01b0\u1edbc<\/li>\n\n\n\n<li>C\u00e1ch t\u1ea1o image t\u1eeb Dockerfile<\/li>\n\n\n\n<li>So s\u00e1nh Docker File v\u00e0 Docker Compose&nbsp;<\/li>\n\n\n\n<li>Nh\u1eefng l\u1ed7i ph\u1ed5 bi\u1ebfn khi vi\u1ebft Dockerfile v\u00e0 c\u00e1ch kh\u1eafc ph\u1ee5c<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-t\u1ed5ng-quan-v\u1ec1-dockerfile\"><span class=\"ez-toc-section\" id=\"Tong_quan_ve_Dockerfile\"><\/span><strong>T\u1ed5ng quan v\u1ec1 Dockerfile<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-dockerfile-la-gi\"><strong>Dockerfile l\u00e0 g\u00ec?<\/strong><\/h3>\n\n\n\n<p>Dockerfile l\u00e0 m\u1ed9t t\u1eadp tin v\u0103n b\u1ea3n thu\u1ea7n t\u00fay (plain text file) ch\u1ee9a t\u1eadp h\u1ee3p c\u00e1c l\u1ec7nh h\u01b0\u1edbng d\u1eabn Docker c\u00e1ch t\u1ea1o ra m\u1ed9t Docker image. N\u00f3i c\u00e1ch kh\u00e1c, Dockerfile ch\u00ednh l\u00e0 \u201cc\u00f4ng th\u1ee9c\u201d gi\u00fap b\u1ea1n \u0111\u00f3ng g\u00f3i \u1ee9ng d\u1ee5ng c\u00f9ng to\u00e0n b\u1ed9 m\u00f4i tr\u01b0\u1eddng ch\u1ea1y (runtime, th\u01b0 vi\u1ec7n, m\u00e3 ngu\u1ed3n, bi\u1ebfn m\u00f4i tr\u01b0\u1eddng, v.v.) v\u00e0o trong m\u1ed9t image duy nh\u1ea5t, s\u1eb5n s\u00e0ng \u0111\u1ec3 tri\u1ec3n khai d\u01b0\u1edbi d\u1ea1ng container.<\/p>\n\n\n\n<p>M\u1ed7i d\u00f2ng trong Dockerfile \u0111\u1ea1i di\u1ec7n cho m\u1ed9t b\u01b0\u1edbc trong qu\u00e1 tr\u00ecnh build image, s\u1eed d\u1ee5ng c\u00e1c ch\u1ec9 th\u1ecb nh\u01b0 <code>FROM<\/code>, <code>COPY<\/code>, <code>RUN<\/code>, <code>CMD<\/code>, <code>EXPOSE<\/code>,&#8230; Khi ch\u1ea1y l\u1ec7nh docker build, Docker s\u1ebd \u0111\u1ecdc Dockerfile theo th\u1ee9 t\u1ef1 t\u1eeb tr\u00ean xu\u1ed1ng v\u00e0 t\u1ea1o ra image t\u01b0\u01a1ng \u1ee9ng theo ki\u1ebfn tr\u00fac layer (l\u1edbp) &#8211; m\u1ed7i ch\u1ec9 th\u1ecb t\u1ea1o ra m\u1ed9t layer m\u1edbi, gi\u00fap t\u1ed1i \u01b0u h\u00f3a vi\u1ec7c caching v\u00e0 t\u00e1i s\u1eed d\u1ee5ng.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><\/p>\n<\/blockquote>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-m\u1ed1i-lien-h\u1ec7-gi\u1eefa-dockerfile-va-image-container\"><strong>M\u1ed1i li\u00ean h\u1ec7 gi\u1eefa Dockerfile v\u00e0 Image\/Container<\/strong><\/h3>\n\n\n\n<p>\u0110\u1ec3 hi\u1ec3u r\u00f5 c\u00e1ch Docker ho\u1ea1t \u0111\u1ed9ng, b\u1ea1n c\u1ea7n n\u1eafm \u0111\u01b0\u1ee3c m\u1ed1i li\u00ean h\u1ec7 gi\u1eefa Dockerfile, Docker Image v\u00e0 Docker Container \u2013 ba th\u00e0nh ph\u1ea7n c\u1ed1t l\u00f5i trong quy tr\u00ecnh l\u00e0m vi\u1ec7c v\u1edbi Docker.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dockerfile l\u00e0 n\u01a1i khai b\u00e1o m\u1ecdi h\u01b0\u1edbng d\u1eabn \u0111\u1ec3 t\u1ea1o ra m\u1ed9t Docker Image. Trong \u0111\u00f3, b\u1ea1n \u0111\u1ecbnh ngh\u0129a h\u1ec7 \u0111i\u1ec1u h\u00e0nh n\u1ec1n, c\u00e1c th\u01b0 vi\u1ec7n c\u1ea7n thi\u1ebft, m\u00e3 ngu\u1ed3n, t\u1eadp l\u1ec7nh c\u00e0i \u0111\u1eb7t, c\u1ea5u h\u00ecnh m\u00f4i tr\u01b0\u1eddng v\u00e0 c\u1ea3 l\u1ec7nh kh\u1edfi ch\u1ea1y \u1ee9ng d\u1ee5ng.<\/li>\n\n\n\n<li>Khi b\u1ea1n ch\u1ea1y l\u1ec7nh docker build, Docker s\u1ebd \u0111\u1ecdc Dockerfile v\u00e0 l\u1ea7n l\u01b0\u1ee3t th\u1ef1c hi\u1ec7n t\u1eebng ch\u1ec9 th\u1ecb \u0111\u1ec3 t\u1ea1o ra m\u1ed9t Docker Image \u2013 \u0111\u00e2y l\u00e0 m\u1ed9t b\u1ea3n \u0111\u00f3ng g\u00f3i ho\u00e0n ch\u1ec9nh, kh\u00f4ng thay \u0111\u1ed5i (immutable), ch\u1ee9a to\u00e0n b\u1ed9 m\u00f4i tr\u01b0\u1eddng v\u00e0 \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n. Image \u0111\u01b0\u1ee3c c\u1ea5u th\u00e0nh t\u1eeb nhi\u1ec1u layer ch\u1ed3ng l\u00ean nhau, cho ph\u00e9p Docker t\u00e1i s\u1eed d\u1ee5ng c\u00e1c layer chung gi\u1eefa c\u00e1c image kh\u00e1c nhau.<\/li>\n\n\n\n<li>Sau khi c\u00f3 image, b\u1ea1n c\u00f3 th\u1ec3 ch\u1ea1y n\u00f3 b\u1eb1ng l\u1ec7nh docker run, l\u00fac \u0111\u00f3 Docker s\u1ebd t\u1ea1o ra m\u1ed9t Container \u2013 t\u1ee9c l\u00e0 m\u1ed9t phi\u00ean b\u1ea3n \u0111ang ho\u1ea1t \u0111\u1ed9ng (runtime instance) c\u1ee7a image \u0111\u00f3. M\u1ed7i container l\u00e0 m\u1ed9t m\u00f4i tr\u01b0\u1eddng \u0111\u1ed9c l\u1eadp, c\u00e1ch ly v\u1edbi h\u1ec7 \u0111i\u1ec1u h\u00e0nh m\u00e1y ch\u1ee7. Container th\u00eam m\u1ed9t writable layer tr\u00ean c\u00f9ng c\u1ee7a image \u0111\u1ec3 l\u01b0u tr\u1eef c\u00e1c thay \u0111\u1ed5i trong qu\u00e1 tr\u00ecnh ch\u1ea1y.<\/li>\n<\/ul>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><em>\u0110\u1ecdc th\u00eam: <strong><a href=\"https:\/\/itviec.com\/blog\/docker-container\/\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Container l\u00e0 g\u00ec? C\u00e1ch s\u1eed d\u1ee5ng Docker Container hi\u1ec7u qu\u1ea3<\/a><\/strong><\/em><\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-8-ch\u1ec9-th\u1ecb-c\u01a1-b\u1ea3n-c\u1ee7a-m\u1ecdi-dockerfile\"><span class=\"ez-toc-section\" id=\"8_chi_thi_co_ban_cua_moi_Dockerfile\"><\/span><strong>8 ch\u1ec9 th\u1ecb c\u01a1 b\u1ea3n c\u1ee7a m\u1ecdi Dockerfile<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>M\u1ed9t Dockerfile bao g\u1ed3m nhi\u1ec1u ch\u1ec9 th\u1ecb (instruction) \u2013 m\u1ed7i d\u00f2ng l\u00e0 m\u1ed9t l\u1ec7nh gi\u00fap Docker bi\u1ebft c\u00e1ch x\u00e2y d\u1ef1ng m\u1ed9t image ph\u00f9 h\u1ee3p. Vi\u1ec7c n\u1eafm v\u1eefng c\u00e1c ch\u1ec9 th\u1ecb c\u01a1 b\u1ea3n trong Dockerfile l\u00e0 b\u01b0\u1edbc \u0111\u1ea7u ti\u00ean \u0111\u1ec3 t\u1ea1o ra container ho\u1ea1t \u0111\u1ed9ng \u1ed5n \u0111\u1ecbnh v\u00e0 hi\u1ec7u qu\u1ea3.<\/p>\n\n\n\n<p>D\u01b0\u1edbi \u0111\u00e2y l\u00e0 c\u00e1c ch\u1ec9 th\u1ecb ph\u1ed5 bi\u1ebfn nh\u1ea5t th\u01b0\u1eddng xu\u1ea5t hi\u1ec7n trong m\u1ecdi Dockerfile:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-from\"><strong>FROM<\/strong><\/h3>\n\n\n\n<p>X\u00e1c \u0111\u1ecbnh image n\u1ec1n m\u00e0 Dockerfile s\u1ebd d\u1ef1a v\u00e0o. \u0110\u00e2y lu\u00f4n l\u00e0 ch\u1ec9 th\u1ecb \u0111\u1ea7u ti\u00ean v\u00e0 c\u00f3 th\u1ec3 xu\u1ea5t hi\u1ec7n nhi\u1ec1u l\u1ea7n trong m\u1ed9t Dockerfile&nbsp; \u0111\u1ec3 th\u1ef1c hi\u1ec7n multi-stage builds.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM node:18<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-workdir\"><strong>WORKDIR<\/strong><\/h3>\n\n\n\n<p>Thi\u1ebft l\u1eadp th\u01b0 m\u1ee5c l\u00e0m vi\u1ec7c b\u00ean trong container. C\u00e1c l\u1ec7nh ti\u1ebfp theo s\u1ebd \u0111\u01b0\u1ee3c th\u1ef1c thi t\u1ea1i \u0111\u00e2y. N\u1ebfu th\u01b0 m\u1ee5c ch\u01b0a t\u1ed3n t\u1ea1i, Docker s\u1ebd t\u1ef1 \u0111\u1ed9ng t\u1ea1o.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>WORKDIR \/app<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-copy\"><strong>COPY<\/strong><\/h3>\n\n\n\n<p>Sao ch\u00e9p file ho\u1eb7c th\u01b0 m\u1ee5c t\u1eeb m\u00e1y host v\u00e0o image. Kh\u00e1c v\u1edbi ADD, COPY ch\u1ec9 \u0111\u01a1n gi\u1ea3n sao ch\u00e9p file m\u00e0 kh\u00f4ng gi\u1ea3i n\u00e9n archive hay download t\u1eeb URL.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>COPY . .&nbsp;\n# Copy to\u00e0n b\u1ed9 th\u01b0 m\u1ee5c hi\u1ec7n t\u1ea1i v\u00e0o \/app (\u0111\u00e3 thi\u1ebft l\u1eadp t\u1eeb WORKDIR)<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-run\"><strong>RUN<\/strong><\/h3>\n\n\n\n<p>Th\u1ef1c hi\u1ec7n m\u1ed9t l\u1ec7nh trong qu\u00e1 tr\u00ecnh build image (th\u01b0\u1eddng \u0111\u1ec3 c\u00e0i th\u01b0 vi\u1ec7n, build project,&#8230;). M\u1ed7i l\u1ec7nh RUN t\u1ea1o ra m\u1ed9t layer m\u1edbi, n\u00ean g\u1ed9p nhi\u1ec1u l\u1ec7nh v\u00e0o m\u1ed9t RUN \u0111\u1ec3 t\u1ed1i \u01b0u.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RUN npm install<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-cmd\"><strong>CMD<\/strong><\/h3>\n\n\n\n<p>Thi\u1ebft l\u1eadp l\u1ec7nh m\u1eb7c \u0111\u1ecbnh s\u1ebd \u0111\u01b0\u1ee3c ch\u1ea1y khi container kh\u1edfi \u0111\u1ed9ng. Kh\u00e1c v\u1edbi ENTRYPOINT, CMD c\u00f3 th\u1ec3 b\u1ecb ghi \u0111\u00e8 khi ch\u1ea1y docker run. Ch\u1ec9 c\u00f3 m\u1ed9t CMD duy nh\u1ea5t c\u00f3 hi\u1ec7u l\u1ef1c trong Dockerfile (CMD cu\u1ed1i c\u00f9ng s\u1ebd ghi \u0111\u00e8 c\u00e1c CMD tr\u01b0\u1edbc \u0111\u00f3).&nbsp;<\/p>\n\n\n\n<p>V\u00ed d\u1ee5:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CMD &#91;\"node\", \"index.js\"]<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-expose\"><strong>EXPOSE<\/strong><\/h3>\n\n\n\n<p>Khai b\u00e1o c\u1ed5ng (port) m\u00e0 container s\u1ebd s\u1eed d\u1ee5ng.&nbsp;<\/p>\n\n\n\n<p>V\u00ed d\u1ee5:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXPOSE 3000<\/code><\/pre>\n\n\n\n<p>L\u01b0u \u00fd: EXPOSE ch\u1ec9 c\u00f3 t\u00e1c d\u1ee5ng m\u00f4 t\u1ea3 (documentation), kh\u00f4ng th\u1ef1c s\u1ef1 publish c\u1ed5ng ra ngo\u00e0i. C\u1ea7n d\u00f9ng -p khi ch\u1ea1y docker run \u0111\u1ec3 \u00e1nh x\u1ea1 c\u1ed5ng (map port).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-env\"><strong>ENV<\/strong><\/h3>\n\n\n\n<p>Thi\u1ebft l\u1eadp bi\u1ebfn m\u00f4i tr\u01b0\u1eddng c\u00f3 hi\u1ec7u l\u1ef1c c\u1ea3 trong qu\u00e1 tr\u00ecnh build v\u00e0 khi container ch\u1ea1y.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ENV NODE_ENV=production<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-arg\"><strong>ARG<\/strong><\/h3>\n\n\n\n<p>Khai b\u00e1o bi\u1ebfn truy\u1ec1n v\u00e0o khi build image (build-time variable).&nbsp;<\/p>\n\n\n\n<p>V\u00ed d\u1ee5:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ARG APP_VERSION<\/code><\/pre>\n\n\n\n<p>ARG ch\u1ec9 c\u00f3 hi\u1ec7u l\u1ef1c trong qu\u00e1 tr\u00ecnh build, kh\u00f4ng c\u00f3 hi\u1ec7u l\u1ef1c trong container \u0111ang ch\u1ea1y. C\u00f3 th\u1ec3 truy\u1ec1n gi\u00e1 tr\u1ecb qua <code>--build-arg<\/code> khi build.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-c\u1ea5u-truc-ph\u1ed5-bi\u1ebfn-c\u1ee7a-m\u1ed9t-dockerfile\"><span class=\"ez-toc-section\" id=\"Cau_truc_pho_bien_cua_mot_Dockerfile\"><\/span><strong>C\u1ea5u tr\u00fac ph\u1ed5 bi\u1ebfn c\u1ee7a m\u1ed9t Dockerfile<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>V\u1ec1 b\u1ea3n ch\u1ea5t, m\u1ed9t Dockerfile gi\u1ed1ng nh\u01b0 m\u1ed9t \u201cscript h\u01b0\u1edbng d\u1eabn\u201d cho Docker bi\u1ebft c\u00e1ch x\u00e2y d\u1ef1ng m\u00f4i tr\u01b0\u1eddng v\u1eadn h\u00e0nh \u1ee9ng d\u1ee5ng t\u1eeb \u0111\u1ea7u \u0111\u1ebfn cu\u1ed1i. Do \u0111\u00f3, \u0111\u1ec3 t\u1ea1o ra m\u1ed9t file \u0111\u00fang chu\u1ea9n, d\u1ec5 b\u1ea3o tr\u00ec v\u00e0 ho\u1ea1t \u0111\u1ed9ng \u1ed5n \u0111\u1ecbnh, thay v\u00ec vi\u1ebft c\u00e1c l\u1ec7nh ng\u1eabu nhi\u00ean, Dockerfile c\u1ea7n tu\u00e2n theo m\u1ed9t c\u1ea5u tr\u00fac logic d\u01b0\u1edbi \u0111\u00e2y:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-ch\u1ecdn-image-n\u1ec1n-base-image\"><strong>Ch\u1ecdn image n\u1ec1n (Base image)<\/strong><\/h3>\n\n\n\n<p>Dockerfile s\u1ebd b\u1eaft \u0111\u1ea7u v\u1edbi m\u1ed9t image c\u00f3 s\u1eb5n t\u1eeb <a href=\"https:\/\/itviec.com\/blog\/docker-hub-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Docker Hub<\/a> nh\u01b0 <a href=\"https:\/\/itviec.com\/blog\/nodejs-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Node.js<\/a>, <a href=\"https:\/\/itviec.com\/blog\/python-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Python<\/a>, <a href=\"https:\/\/itviec.com\/blog\/ubuntu-la-gi\/\" target=\"_blank\" rel=\"noreferrer noopener\">Ubuntu<\/a>, Nginx,&#8230;&nbsp;<\/p>\n\n\n\n<p>B\u01b0\u1edbc n\u00e0y gi\u00fap \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n \u201ck\u1ebf th\u1eeba\u201d m\u1ed9t h\u1ec7 \u0111i\u1ec1u h\u00e0nh ho\u1eb7c n\u1ec1n t\u1ea3ng \u0111\u00e3 \u0111\u01b0\u1ee3c chu\u1ea9n b\u1ecb tr\u01b0\u1edbc.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-chu\u1ea9n-b\u1ecb-moi-tr\u01b0\u1eddng-lam-vi\u1ec7c\"><strong>Chu\u1ea9n b\u1ecb m\u00f4i tr\u01b0\u1eddng l\u00e0m vi\u1ec7c<\/strong><\/h3>\n\n\n\n<p>Bao g\u1ed3m thi\u1ebft l\u1eadp th\u01b0 m\u1ee5c l\u00e0m vi\u1ec7c (WORKDIR), c\u00e1c bi\u1ebfn m\u00f4i tr\u01b0\u1eddng, quy\u1ec1n truy c\u1eadp&#8230; \u0111\u1ec3 s\u1eb5n s\u00e0ng cho vi\u1ec7c sao ch\u00e9p v\u00e0 x\u1eed l\u00fd m\u00e3 ngu\u1ed3n.&nbsp;<\/p>\n\n\n\n<p>\u0110\u00e2y l\u00e0 b\u01b0\u1edbc \u201cset up\u201d kh\u00f4ng gian l\u00e0m vi\u1ec7c trong container.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-copy-ma-ngu\u1ed3n-amp-cai-d\u1eb7t-ph\u1ee5-thu\u1ed9c\"><strong>Copy m\u00e3 ngu\u1ed3n &amp; c\u00e0i \u0111\u1eb7t ph\u1ee5 thu\u1ed9c<\/strong><\/h3>\n\n\n\n<p>Dockerfile s\u1ebd sao ch\u00e9p c\u00e1c file c\u1ea5u h\u00ecnh dependency tr\u01b0\u1edbc (nh\u01b0 package.json, requirements.txt), c\u00e0i \u0111\u1eb7t dependencies, sau \u0111\u00f3 m\u1edbi sao ch\u00e9p to\u00e0n b\u1ed9 m\u00e3 \u1ee9ng d\u1ee5ng v\u00e0o container, sau \u0111\u00f3 ch\u1ea1y l\u1ec7nh \u0111\u1ec3 c\u00e0i \u0111\u1eb7t c\u00e1c dependency (v\u00ed d\u1ee5: npm install, composer install,&#8230;).<\/p>\n\n\n\n<p>\u0110\u00e2y l\u00e0 b\u01b0\u1edbc \u201cbuild\u201d ch\u00ednh, n\u01a1i to\u00e0n b\u1ed9 code v\u00e0 th\u01b0 vi\u1ec7n \u0111\u01b0\u1ee3c t\u00edch h\u1ee3p.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-c\u1ea5u-hinh-thong-tin-v\u1eadn-hanh\"><strong>C\u1ea5u h\u00ecnh th\u00f4ng tin v\u1eadn h\u00e0nh<\/strong><\/h3>\n\n\n\n<p>B\u1ea1n c\u00f3 th\u1ec3 thi\u1ebft l\u1eadp bi\u1ebfn m\u00f4i tr\u01b0\u1eddng (ENV), khai b\u00e1o port s\u1ebd s\u1eed d\u1ee5ng (EXPOSE), ho\u1eb7c ph\u00e2n quy\u1ec1n n\u1ebfu c\u1ea7n.<\/p>\n\n\n\n<p>B\u01b0\u1edbc n\u00e0y nh\u1eb1m \u0111\u1ea3m b\u1ea3o container t\u01b0\u01a1ng t\u00e1c \u0111\u01b0\u1ee3c v\u1edbi b\u00ean ngo\u00e0i m\u1ed9t c\u00e1ch an to\u00e0n v\u00e0 \u0111\u00fang m\u1ee5c \u0111\u00edch.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-kh\u1edfi-d\u1ed9ng-\u1ee9ng-d\u1ee5ng-khi-container-ch\u1ea1y\"><strong>Kh\u1edfi \u0111\u1ed9ng \u1ee9ng d\u1ee5ng khi container ch\u1ea1y<\/strong><\/h3>\n\n\n\n<p>Cu\u1ed1i c\u00f9ng, Dockerfile ch\u1ec9 \u0111\u1ecbnh l\u1ec7nh m\u1eb7c \u0111\u1ecbnh s\u1ebd th\u1ef1c thi khi container b\u1eaft \u0111\u1ea7u \u2013 nh\u01b0 kh\u1edfi ch\u1ea1y server, \u1ee9ng d\u1ee5ng, ho\u1eb7c script ch\u00ednh.<\/p>\n\n\n\n<p>B\u01b0\u1edbc n\u00e0y bi\u1ebfn container t\u1eeb \u201c\u0111\u00f3ng g\u00f3i\u201d th\u00e0nh \u201cho\u1ea1t \u0111\u1ed9ng\u201d.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-h\u01b0\u1edbng-d\u1eabn-8-b\u01b0\u1edbc-vi\u1ebft-dockerfile-chi-ti\u1ebft\"><span class=\"ez-toc-section\" id=\"Huong_dan_8_buoc_viet_Dockerfile_chi_tiet\"><\/span><strong>H\u01b0\u1edbng d\u1eabn 8 b\u01b0\u1edbc vi\u1ebft Dockerfile chi ti\u1ebft<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Sau khi b\u1ea1n \u0111\u00e3 n\u1eafm to\u00e0n b\u1ed9 c\u1ea5u tr\u00fac Docker File v\u00e0 hi\u1ec3u m\u1ee5c \u0111\u00edch c\u1ee7a c\u00e1c b\u01b0\u1edbc, ph\u1ea7n d\u01b0\u1edbi \u0111\u00e2y s\u1ebd h\u01b0\u1edbng d\u1eabn b\u1ea1n vi\u1ebft Dockerfile chi ti\u1ebft:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-1-kh\u1edfi-t\u1ea1o-dockerfile\"><strong>B\u01b0\u1edbc 1: Kh\u1edfi t\u1ea1o Dockerfile<\/strong><\/h3>\n\n\n\n<p>Trong th\u01b0 m\u1ee5c g\u1ed1c c\u1ee7a d\u1ef1 \u00e1n, t\u1ea1o m\u1ed9t file t\u00ean l\u00e0 <strong>Dockerfile<\/strong> (vi\u1ebft hoa ch\u1eef D, kh\u00f4ng c\u00f3 \u0111u\u00f4i .txt hay .yaml).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>touch Dockerfile<\/code><\/pre>\n\n\n\n<p>G\u1ee3i \u00fd: \u0110\u1eb7t Dockerfile c\u00f9ng c\u1ea5p v\u1edbi file ch\u00ednh (v\u00ed d\u1ee5: index.js, app.py, composer.json, v.v.)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-2-ch\u1ecdn-base-image-image-n\u1ec1n\"><strong>B\u01b0\u1edbc 2: Ch\u1ecdn base image (image n\u1ec1n)<\/strong><\/h3>\n\n\n\n<p>S\u1eed d\u1ee5ng ch\u1ec9 th\u1ecb FROM \u0111\u1ec3 ch\u1ecdn n\u1ec1n t\u1ea3ng cho \u1ee9ng d\u1ee5ng. Base image l\u00e0 m\u00f4i tr\u01b0\u1eddng h\u1ec7 \u0111i\u1ec1u h\u00e0nh ho\u1eb7c runtime \u0111\u00e3 \u0111\u01b0\u1ee3c c\u1ea5u h\u00ecnh s\u1eb5n (Node, PHP, Python,&#8230;).<\/p>\n\n\n\n<p>V\u00ed d\u1ee5 v\u1edbi Node.js:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM node:18<\/code><\/pre>\n\n\n\n<p>C\u00e1c l\u01b0u \u00fd quan tr\u1ecdng:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>D\u00f9ng phi\u00ean b\u1ea3n ch\u00ednh x\u00e1c \u0111\u1ec3 tr\u00e1nh l\u1ed7i kh\u00f4ng t\u01b0\u01a1ng th\u00edch, v\u00ed d\u1ee5 d\u00f9ng node:18-alpine n\u1ebfu mu\u1ed1n image nh\u1eb9 h\u01a1n (Alpine Linux ~5MB; Ubuntu ~72MB).<\/li>\n\n\n\n<li>Lu\u00f4n d\u00f9ng tag c\u1ee5 th\u1ec3 (v\u00ed d\u1ee5<strong> <code>node:18<\/code>, <code>python:3.11<\/code><\/strong>) thay v\u00ec <strong><code>latest<\/code><\/strong> \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o build nh\u1ea5t qu\u00e1n.<\/li>\n\n\n\n<li>Ki\u1ec3m tra CVE (Common Vulnerabilities and Exposures &#8211; l\u1ed7 h\u1ed5ng b\u1ea3o m\u1ea5t) c\u1ee7a base image th\u01b0\u1eddng xuy\u00ean.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-3-d\u1eb7t-th\u01b0-m\u1ee5c-lam-vi\u1ec7c-trong-container\"><strong>B\u01b0\u1edbc 3: \u0110\u1eb7t th\u01b0 m\u1ee5c l\u00e0m vi\u1ec7c trong container<\/strong><\/h3>\n\n\n\n<p>D\u00f9ng l\u1ec7nh:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>WORKDIR \/app<\/code><\/pre>\n\n\n\n<p>L\u1ec7nh n\u00e0y t\u1ea1o (n\u1ebfu ch\u01b0a c\u00f3) v\u00e0 chuy\u1ec3n v\u00e0o th\u01b0 m\u1ee5c \/app b\u00ean trong container. T\u1eeb \u0111\u00e2y, m\u1ecdi l\u1ec7nh ti\u1ebfp theo nh\u01b0 COPY, RUN,&#8230; s\u1ebd th\u1ef1c thi trong th\u01b0 m\u1ee5c \/app.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-4-copy-ma-ngu\u1ed3n-va-file-cai-d\u1eb7t\"><strong>B\u01b0\u1edbc 4: Copy m\u00e3 ngu\u1ed3n v\u00e0 file c\u00e0i \u0111\u1eb7t<\/strong><\/h3>\n\n\n\n<p>Docker s\u1eed d\u1ee5ng layer caching, v\u00ec v\u1eady b\u1ea1n n\u00ean copy tr\u01b0\u1edbc c\u00e1c file khai b\u00e1o dependency (nh\u01b0 package.json, composer.json,&#8230;) \u0111\u1ec3 t\u1eadn d\u1ee5ng cache.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5 v\u1edbi Node.js:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>COPY package*.json .&nbsp;&nbsp;\n\nRUN npm install\n\nCOPY . .<\/code><\/pre>\n\n\n\n<p>C\u00e1c l\u01b0u \u00fd quan tr\u1ecdng:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>N\u1ebfu kh\u00f4ng t\u00e1ch COPY package*.json ri\u00eang, Docker s\u1ebd ph\u1ea3i c\u00e0i l\u1ea1i to\u00e0n b\u1ed9 m\u1ed7i l\u1ea7n build, d\u00f9 m\u00e3 ngu\u1ed3n kh\u00f4ng \u0111\u1ed5i.<\/li>\n\n\n\n<li>S\u1eed d\u1ee5ng <strong><code>.\/<\/code><\/strong> thay v\u00ec <strong><code>.<\/code><\/strong> \u0111\u1ec3 r\u00f5 r\u00e0ng h\u01a1n v\u1ec1 n\u01a1i file \u0111\u01b0\u1ee3c sao ch\u00e9p \u0111\u1ebfn.<\/li>\n\n\n\n<li>Trong production, n\u00ean d\u00f9ng <strong><code>npm ci<\/code><\/strong> thay v\u00ec <strong><code>npm install<\/code><\/strong> \u0111\u1ec3 c\u00e0i \u0111\u1eb7t nhanh v\u00e0 chu\u1ea9n x\u00e1c h\u01a1n.<\/li>\n\n\n\n<li>C\u00f3 th\u1ec3 th\u00eam <strong><code>npm cache clean --force<\/code><\/strong> \u0111\u1ec3 gi\u1ea3m k\u00edch th\u01b0\u1edbc image.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-5-thi\u1ebft-l\u1eadp-bi\u1ebfn-moi-tr\u01b0\u1eddng-n\u1ebfu-c\u1ea7n\"><strong>B\u01b0\u1edbc 5: Thi\u1ebft l\u1eadp bi\u1ebfn m\u00f4i tr\u01b0\u1eddng (n\u1ebfu c\u1ea7n)<\/strong><\/h3>\n\n\n\n<p>V\u00ed d\u1ee5 d\u00f9ng l\u1ec7nh ENV:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ENV NODE_ENV=production<\/code><\/pre>\n\n\n\n<p>C\u00e1c bi\u1ebfn m\u00f4i tr\u01b0\u1eddng \u0111\u01b0\u1ee3c khai b\u00e1o b\u1eb1ng ENV s\u1ebd c\u00f3 s\u1eb5n khi \u1ee9ng d\u1ee5ng kh\u1edfi ch\u1ea1y. ENV kh\u00e1c v\u1edbi ARG \u1edf ch\u1ed7 ENV c\u00f3 hi\u1ec7u l\u1ef1c c\u1ea3 trong build time v\u00e0 runtime, trong khi ARG ch\u1ec9 c\u00f3 hi\u1ec7u l\u1ef1c trong build time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-6-khai-bao-port-container-s\u1ebd-dung\"><strong>B\u01b0\u1edbc 6: Khai b\u00e1o port container s\u1ebd d\u00f9ng<\/strong><\/h3>\n\n\n\n<p>Khi container ch\u1ea1y, b\u1ea1n c\u1ea7n x\u00e1c \u0111\u1ecbnh \u1ee9ng d\u1ee5ng s\u1ebd \u201cl\u1eafng nghe\u201d \u1edf c\u1ed5ng n\u00e0o \u0111\u1ec3 c\u00f3 th\u1ec3 truy c\u1eadp t\u1eeb b\u00ean ngo\u00e0i.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXPOSE 3000<\/code><\/pre>\n\n\n\n<p>Nh\u01b0 v\u1eady, Docker s\u1ebd bi\u1ebft r\u1eb1ng container \u0111ang \u201cl\u1eafng nghe\u201d c\u1ed5ng 3000 \u2013 b\u1ea1n c\u00f3 th\u1ec3 \u00e1nh x\u1ea1 c\u1ed5ng n\u00e0y ra b\u00ean ngo\u00e0i khi ch\u1ea1y container.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-7-khai-bao-l\u1ec7nh-ch\u1ea1y-khi-container-kh\u1edfi-d\u1ed9ng\"><strong>B\u01b0\u1edbc 7: Khai b\u00e1o l\u1ec7nh ch\u1ea1y khi container kh\u1edfi \u0111\u1ed9ng<\/strong><\/h3>\n\n\n\n<p>S\u1eed d\u1ee5ng CMD \u0111\u1ec3 \u0111\u1ecbnh ngh\u0129a l\u1ec7nh m\u1eb7c \u0111\u1ecbnh khi container b\u1eaft \u0111\u1ea7u:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CMD &#91;\"node\", \"index.js\"]<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-8-t\u1ea1o-file-dockerignore-r\u1ea5t-quan-tr\u1ecdng\"><strong>B\u01b0\u1edbc 8: T\u1ea1o file .dockerignore (R\u1ea5t quan tr\u1ecdng!)<\/strong><\/h3>\n\n\n\n<p>File <strong>.dockerignore<\/strong> gi\u00fap lo\u1ea1i b\u1ecf c\u00e1c file kh\u00f4ng c\u1ea7n thi\u1ebft kh\u1ecfi qu\u00e1 tr\u00ecnh build, nh\u01b0 node_modules, .git, *.log,&#8230; \u0110i\u1ec1u n\u00e0y r\u1ea5t quan tr\u1ecdng trong vi\u1ec7c gi\u1ea3m build context size v\u00e0 t\u0103ng t\u1ed1c \u0111\u1ed9 build.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>node_modules\n\n.git\n\nDockerfile\n\nREADME.md\n\n*.log<\/code><\/pre>\n\n\n\n<p><strong>V\u00ed d\u1ee5 Dockerfile ho\u00e0n ch\u1ec9nh (cho \u1ee9ng d\u1ee5ng <\/strong><a href=\"http:\/\/node.js\" target=\"_blank\" rel=\"noreferrer noopener\"><strong>Node.js<\/strong><\/a><strong>)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># 1. Ch\u1ecdn m\u00f4i tr\u01b0\u1eddng n\u1ec1n (s\u1eed d\u1ee5ng Alpine \u0111\u1ec3 gi\u1ea3m k\u00edch th\u01b0\u1edbc)\n\nFROM node:18-alpine\n\n# 2. T\u1ea1o user non-root \u0111\u1ec3 t\u0103ng b\u1ea3o m\u1eadt\n\nRUN addgroup -g 1001 -S nodejs\n\nRUN adduser -S nextjs -u 1001\n\n# 3. \u0110\u1eb7t th\u01b0 m\u1ee5c l\u00e0m vi\u1ec7c\n\nWORKDIR \/app\n\n# 4. Copy file khai b\u00e1o ph\u1ee5 thu\u1ed9c v\u00e0 c\u00e0i \u0111\u1eb7t (t\u1ed1i \u01b0u caching)\n\nCOPY package*.json .\/\n\nRUN npm ci --only=production &amp;&amp; npm cache clean --force\n\n# 5. Copy to\u00e0n b\u1ed9 m\u00e3 ngu\u1ed3n\n\nCOPY . .\n\n# 6. Chuy\u1ec3n ownership cho non-root user\n\nRUN chown -R nextjs:nodejs \/app\n\nUSER nextjs\n\n# 7. Thi\u1ebft l\u1eadp bi\u1ebfn m\u00f4i tr\u01b0\u1eddng v\u00e0 c\u1ed5ng\n\nENV NODE_ENV=production\n\nEXPOSE 3000\n\n# 8. Health check\n\nHEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\\n\nCMD node healthcheck.js\n\n# 9. L\u1ec7nh ch\u1ea1y khi container kh\u1edfi \u0111\u1ed9ng\n\nCMD &#91;\"node\", \"index.js\"]<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cach-t\u1ea1o-image-t\u1eeb-dockerfile\"><span class=\"ez-toc-section\" id=\"Cach_tao_image_tu_Dockerfile\"><\/span><strong>C\u00e1ch t\u1ea1o image t\u1eeb Dockerfile<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Sau khi \u0111\u00e3 vi\u1ebft xong m\u1ed9t Dockerfile chu\u1ea9n, b\u01b0\u1edbc ti\u1ebfp theo l\u00e0 build image t\u1eeb file \u0111\u00f3. Image ch\u00ednh l\u00e0 \u201ckhu\u00f4n m\u1eabu\u201d \u0111\u1ec3 Docker t\u1ea1o ra container \u2013 m\u00f4i tr\u01b0\u1eddng ch\u1ea1y \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-1-ki\u1ec3m-tra-c\u1ea5u-truc-th\u01b0-m\u1ee5c\"><strong>B\u01b0\u1edbc 1: Ki\u1ec3m tra c\u1ea5u tr\u00fac th\u01b0 m\u1ee5c<\/strong><\/h3>\n\n\n\n<p>Tr\u01b0\u1edbc khi build image, h\u00e3y \u0111\u1ea3m b\u1ea3o r\u1eb1ng b\u1ea1n \u0111\u00e3 c\u00f3:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/my-app\/\n\n\u251c\u2500\u2500 Dockerfile\n\u251c\u2500\u2500 .dockerignore\n\u251c\u2500\u2500 package.json (ho\u1eb7c requirements.txt, composer.json,...)\n\u251c\u2500\u2500 m\u00e3 ngu\u1ed3n \u1ee9ng d\u1ee5ng<\/code><\/pre>\n\n\n\n<p>L\u01b0u \u00fd:&nbsp;<\/p>\n\n\n\n<div class=\"wp-block-group is-layout-constrained wp-block-group-is-layout-constrained\">\n<ul class=\"wp-block-list\">\n<li>Dockerfile ph\u1ea3i n\u1eb1m \u1edf th\u01b0 m\u1ee5c g\u1ed1c ho\u1eb7c th\u01b0 m\u1ee5c b\u1ea1n ch\u1ec9 \u0111\u1ecbnh khi build.<\/li>\n\n\n\n<li>\u0110\u1ea3m b\u1ea3o <code>.dockerignore<\/code> \u0111\u00e3 lo\u1ea1i tr\u1eeb c\u00e1c file kh\u00f4ng c\u1ea7n thi\u1ebft \u0111\u1ec3 gi\u1ea3m <code>build context size-<\/code>.<\/li>\n\n\n\n<li>Ki\u1ec3m tra quy\u1ec1n truy c\u1eadp file n\u1ebfu build tr\u00ean Linux\/macOS.<\/li>\n<\/ul>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-2-dung-l\u1ec7nh-docker-build\"><strong>B\u01b0\u1edbc 2: D\u00f9ng l\u1ec7nh Docker build<\/strong><\/h3>\n\n\n\n<p>M\u1edf terminal v\u00e0 \u0111i\u1ec1u h\u01b0\u1edbng \u0111\u1ebfn th\u01b0 m\u1ee5c ch\u1ee9a Dockerfile, sau \u0111\u00f3 d\u00f9ng l\u1ec7nh:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker build -t ten-image .<\/code><\/pre>\n\n\n\n<p>Trong \u0111\u00f3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>docker build<\/code><\/strong>: l\u1ec7nh d\u00f9ng \u0111\u1ec3 t\u1ea1o image t\u1eeb Dockerfile<\/li>\n\n\n\n<li><strong><code>-t ten-image<\/code><\/strong>: \u0111\u1eb7t t\u00ean cho image (tag). V\u00ed d\u1ee5: <code>myapp:v1<\/code>, <code>node-api:latest<\/code><\/li>\n\n\n\n<li><strong><code>.<\/code><\/strong> (d\u1ea5u ch\u1ea5m): \u0111\u1ea1i di\u1ec7n cho th\u01b0 m\u1ee5c hi\u1ec7n t\u1ea1i \u2013 n\u01a1i ch\u1ee9a Dockerfile<\/li>\n<\/ul>\n\n\n\n<p>V\u00ed d\u1ee5:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker build -t node-app:1.0 .<\/code><\/pre>\n\n\n\n<p>K\u1ebft qu\u1ea3: Docker s\u1ebd \u0111\u1ecdc Dockerfile, th\u1ef1c hi\u1ec7n l\u1ea7n l\u01b0\u1ee3t c\u00e1c ch\u1ec9 th\u1ecb (FROM, COPY, RUN,&#8230;) v\u00e0 t\u1ea1o ra m\u1ed9t Docker image t\u00ean l\u00e0 node-app v\u1edbi tag 1.0.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-3-ki\u1ec3m-tra-image-da-t\u1ea1o\"><strong>B\u01b0\u1edbc 3: Ki\u1ec3m tra image \u0111\u00e3 t\u1ea1o<\/strong><\/h3>\n\n\n\n<p>D\u00f9ng l\u1ec7nh sau \u0111\u1ec3 li\u1ec7t k\u00ea t\u1ea5t c\u1ea3 c\u00e1c image c\u00f3 trong m\u00e1y:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker images<\/code><\/pre>\n\n\n\n<p>B\u1ea1n s\u1ebd th\u1ea5y k\u1ebft qu\u1ea3 t\u01b0\u01a1ng t\u1ef1:<\/p>\n\n\n\n<p>REPOSITORY      TAG     IMAGE ID             CREATED              SIZE<\/p>\n\n\n\n<p>Node-app.           1.0 &nbsp; &nbsp;    83faab2c3a22      2 minutes ago     150MB<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-b\u01b0\u1edbc-4-ch\u1ea1y-container-t\u1eeb-image-m\u1edbi-t\u1ea1o\"><strong>B\u01b0\u1edbc 4: Ch\u1ea1y container t\u1eeb image m\u1edbi t\u1ea1o<\/strong><\/h3>\n\n\n\n<p>Sau khi t\u1ea1o image t\u1eeb Dockerfile, b\u1ea1n c\u00f3 th\u1ec3 ch\u1ea1y container t\u1eeb image \u0111\u00f3 b\u1eb1ng l\u1ec7nh sau:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -d -p 3000:3000 --name ten-container node-app:1.0<\/code><\/pre>\n\n\n\n<p>Trong \u0111\u00f3:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>-d<\/code><\/strong>: ch\u1ea1y container \u1edf ch\u1ebf \u0111\u1ed9 n\u1ec1n<\/li>\n\n\n\n<li><strong><code>-p<\/code><\/strong>: \u00e1nh x\u1ea1 port t\u1eeb m\u00e1y host (b\u00ean tr\u00e1i) sang container (b\u00ean ph\u1ea3i)<\/li>\n\n\n\n<li><strong><code>--name<\/code><\/strong>: \u0111\u1eb7t t\u00ean container<\/li>\n\n\n\n<li><code><strong>node-app<\/strong>:1.0<\/code>: image v\u1eeba t\u1ea1o<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-so-sanh-dockerfile-va-docker-compose-nbsp\"><span class=\"ez-toc-section\" id=\"So_sanh_Dockerfile_va_Docker_Compose\"><\/span><strong>So s\u00e1nh Dockerfile v\u00e0 Docker Compose&nbsp;<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Dockerfile v\u00e0 Docker Compose \u0111\u1ec1u l\u00e0 c\u00f4ng c\u1ee5 h\u1ed7 tr\u1ee3 tri\u1ec3n khai \u1ee9ng d\u1ee5ng v\u1edbi Docker. Tuy nhi\u00ean, ch\u00fang ph\u1ee5c v\u1ee5 c\u00e1c m\u1ee5c \u0111\u00edch kh\u00e1c nhau:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dockerfile<\/strong> \u0111\u01b0\u1ee3c d\u00f9ng \u0111\u1ec3 t\u1ea1o Docker image. N\u00f3 m\u00f4 t\u1ea3 c\u00e1ch x\u00e2y d\u1ef1ng m\u1ed9t m\u00f4i tr\u01b0\u1eddng container c\u1ee5 th\u1ec3, bao g\u1ed3m h\u1ec7 \u0111i\u1ec1u h\u00e0nh, th\u01b0 vi\u1ec7n, m\u00e3 ngu\u1ed3n v\u00e0 l\u1ec7nh ch\u1ea1y \u1ee9ng d\u1ee5ng. B\u1ea1n d\u00f9ng l\u1ec7nh docker build \u0111\u1ec3 th\u1ef1c thi n\u1ed9i dung trong Dockerfile v\u00e0 sinh ra m\u1ed9t image.<\/li>\n\n\n\n<li><strong>Docker Compose<\/strong> d\u00f9ng \u0111\u1ec3 qu\u1ea3n l\u00fd v\u00e0 kh\u1edfi ch\u1ea1y nhi\u1ec1u container c\u00f9ng l\u00fac (v\u00ed d\u1ee5: m\u1ed9t \u1ee9ng d\u1ee5ng backend + frontend + database). B\u1ea1n \u0111\u1ecbnh ngh\u0129a c\u00e1c service trong file docker-compose.yml, sau \u0111\u00f3 d\u00f9ng docker-compose up \u0111\u1ec3 kh\u1edfi \u0111\u1ed9ng to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng.<\/li>\n<\/ul>\n\n\n\n<p>\u0110i\u1ec3m kh\u00e1c bi\u1ec7t ch\u00ednh:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Dockerfile t\u1ea1o ra m\u1ed9t image duy nh\u1ea5t. Docker Compose kh\u1edfi \u0111\u1ed9ng nhi\u1ec1u container (t\u1eeb nhi\u1ec1u image) v\u00e0 k\u1ebft n\u1ed1i ch\u00fang v\u1edbi nhau.<\/li>\n\n\n\n<li>Dockerfile t\u1eadp trung v\u00e0o vi\u1ec7c build, c\u00f2n Docker Compose t\u1eadp trung v\u00e0o vi\u1ec7c run &amp; orchestrate (\u0111i\u1ec1u ph\u1ed1i container).<\/li>\n\n\n\n<li>Trong th\u1ef1c t\u1ebf, Docker Compose th\u01b0\u1eddng s\u1eed d\u1ee5ng Dockerfile \u0111\u1ec3 build image tr\u01b0\u1edbc khi ch\u1ea1y container.<\/li>\n<\/ul>\n\n\n\n<p>D\u01b0\u1edbi \u0111\u00e2y l\u00e0 b\u1ea3ng so s\u00e1nh chi ti\u1ebft:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Ti\u00eau ch\u00ed<\/strong><\/td><td><strong>Dockerfile<\/strong><\/td><td><strong>Docker Compose<\/strong><\/td><\/tr><tr><td>Ch\u1ee9c n\u0103ng ch\u00ednh<\/td><td>T\u1ea1o image cho m\u1ed9t container<\/td><td>Kh\u1edfi ch\u1ea1y v\u00e0 qu\u1ea3n l\u00fd nhi\u1ec1u container c\u00f9ng l\u00fac<\/td><\/tr><tr><td>T\u1ec7p c\u1ea5u h\u00ecnh<\/td><td>Dockerfile<\/td><td>docker-compose.yml<\/td><\/tr><tr><td>C\u00e1ch s\u1eed d\u1ee5ng<\/td><td>D\u00f9ng v\u1edbi docker build<\/td><td>D\u00f9ng v\u1edbi docker-compose up\/down<\/td><\/tr><tr><td>Ph\u1ea1m vi t\u00e1c \u0111\u1ed9ng<\/td><td>M\u1ed9t image\/container \u0111\u01a1n l\u1ebb<\/td><td>Nhi\u1ec1u service\/container v\u00e0 m\u1ea1ng l\u01b0\u1edbi k\u1ebft n\u1ed1i<\/td><\/tr><tr><td>C\u00e0i \u0111\u1eb7t package, m\u00e3 ngu\u1ed3n<\/td><td>Th\u1ef1c hi\u1ec7n tr\u1ef1c ti\u1ebfp trong file<\/td><td>Kh\u00f4ng, ch\u1ec9 \u0111\u1ecbnh image c\u00f3 s\u1eb5n ho\u1eb7c build t\u1eeb Dockerfile<\/td><\/tr><tr><td>Qu\u1ea3n l\u00fd m\u1ea1ng, volume, env<\/td><td>Gi\u1edbi h\u1ea1n<\/td><td>H\u1ed7 tr\u1ee3 \u0111\u1ea7y \u0111\u1ee7<\/td><\/tr><tr><td>T\u1ef1 \u0111\u1ed9ng h\u00f3a tri\u1ec3n khai<\/td><td>Kh\u00f4ng<\/td><td>C\u00f3 th\u1ec3 \u0111i\u1ec1u ph\u1ed1i to\u00e0n b\u1ed9 h\u1ec7 th\u1ed1ng<\/td><\/tr><tr><td>Kh\u1ea3 n\u0103ng d\u00f9ng \u0111\u1ed9c l\u1eadp<\/td><td>C\u00f3 th\u1ec3 d\u00f9ng ri\u00eang<\/td><td>Th\u01b0\u1eddng ph\u1ee5 thu\u1ed9c v\u00e0o Dockerfile ho\u1eb7c image<\/td><\/tr><tr><td>Th\u01b0\u1eddng d\u00f9ng khi<\/td><td>T\u1ea1o m\u00f4i tr\u01b0\u1eddng ch\u1ea1y \u1ee9ng d\u1ee5ng cho m\u1ed9t service c\u1ee5 th\u1ec3<\/td><td>Ch\u1ea1y h\u1ec7 th\u1ed1ng nhi\u1ec1u th\u00e0nh ph\u1ea7n li\u00ean k\u1ebft \u0111\u1ec3 build image<\/td><\/tr><tr><td>Kh\u1ea3 n\u0103ng k\u1ebft h\u1ee3p<\/td><td>C\u00f3 th\u1ec3 k\u1ebft h\u1ee3p v\u1edbi Compose<\/td><td>Th\u01b0\u1eddng s\u1eed d\u1ee5ng Dockerfile \u0111\u1ec3 build image ho\u1eb7c pull t\u1eeb registry<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-nh\u1eefng-l\u1ed7i-ph\u1ed5-bi\u1ebfn-khi-vi\u1ebft-dockerfile-va-cach-kh\u1eafc-ph\u1ee5c-nbsp\"><span class=\"ez-toc-section\" id=\"Nhung_loi_pho_bien_khi_viet_Dockerfile_va_cach_khac_phuc\"><\/span><strong>Nh\u1eefng l\u1ed7i ph\u1ed5 bi\u1ebfn khi vi\u1ebft Dockerfile v\u00e0 c\u00e1ch kh\u1eafc ph\u1ee5c&nbsp;<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Vi\u1ec7c vi\u1ebft Dockerfile tr\u00ean th\u1ef1c t\u1ebf r\u1ea5t d\u1ec5 m\u1eafc l\u1ed7i, \u0111\u1eb7c bi\u1ec7t v\u1edbi ng\u01b0\u1eddi m\u1edbi b\u1eaft \u0111\u1ea7u. D\u01b0\u1edbi \u0111\u00e2y l\u00e0 c\u00e1c l\u1ed7i th\u01b0\u1eddng g\u1eb7p nh\u1ea5t khi l\u00e0m vi\u1ec7c v\u1edbi Dockerfile v\u00e0 c\u00e1ch x\u1eed l\u00fd hi\u1ec7u qu\u1ea3 \u0111\u1ec3 tr\u00e1nh \u1ea3nh h\u01b0\u1edfng \u0111\u1ebfn hi\u1ec7u su\u1ea5t ho\u1eb7c t\u00ednh \u1ed5n \u0111\u1ecbnh c\u1ee7a image.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-dung-qua-nhi\u1ec1u-layer-khong-c\u1ea7n-thi\u1ebft\"><strong>D\u00f9ng qu\u00e1 nhi\u1ec1u layer kh\u00f4ng c\u1ea7n thi\u1ebft<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>V\u1ea5n \u0111\u1ec1:<\/li>\n<\/ul>\n\n\n\n<p>M\u1ed7i ch\u1ec9 th\u1ecb (RUN, COPY, ADD&#8230;) trong Dockerfile t\u1ea1o ra m\u1ed9t layer m\u1edbi. Vi\u1ec7c vi\u1ebft nhi\u1ec1u l\u1ec7nh RUN ri\u00eang l\u1ebb d\u1eabn \u0111\u1ebfn image l\u1edbn kh\u00f4ng c\u1ea7n thi\u1ebft.<\/p>\n\n\n\n<p>V\u00ed d\u1ee5 l\u1ed7i:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RUN apt-get update\n\nRUN apt-get install -y curl<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e1ch kh\u1eafc ph\u1ee5c:<\/li>\n<\/ul>\n\n\n\n<p>G\u1ed9p c\u00e1c l\u1ec7nh th\u00e0nh m\u1ed9t d\u00f2ng \u0111\u1ec3 t\u1ed1i \u01b0u layer:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RUN apt-get update &amp;&amp; apt-get install -y curl<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-khong-s\u1eed-d\u1ee5ng-dockerignore\"><strong>Kh\u00f4ng s\u1eed d\u1ee5ng .dockerignore<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>V\u1ea5n \u0111\u1ec1:<\/li>\n<\/ul>\n\n\n\n<p>N\u1ebfu kh\u00f4ng d\u00f9ng .dockerignore, Docker s\u1ebd copy to\u00e0n b\u1ed9 file\/folder trong th\u01b0 m\u1ee5c build, bao g\u1ed3m c\u1ea3 file log, node_modules, .git\u2026 H\u1eadu qu\u1ea3 l\u00e0 Image to, build l\u00e2u, l\u1ed9 d\u1eef li\u1ec7u nh\u1ea1y c\u1ea3m.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e1ch kh\u1eafc ph\u1ee5c:<\/li>\n<\/ul>\n\n\n\n<p>T\u1ea1o file .dockerignore v\u1edbi n\u1ed9i dung:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>node_modules\n\n.git\n\n*.log\n\n.env<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-s\u1eed-d\u1ee5ng-image-n\u1ec1n-khong-phu-h\u1ee3p\"><strong>S\u1eed d\u1ee5ng image n\u1ec1n kh\u00f4ng ph\u00f9 h\u1ee3p<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>V\u1ea5n \u0111\u1ec1:<\/li>\n<\/ul>\n\n\n\n<p>D\u00f9ng image qu\u00e1 l\u1edbn nh\u01b0 ubuntu trong khi ch\u1ec9 c\u1ea7n base nh\u1eb9 nh\u01b0 alpine, d\u1eabn \u0111\u1ebfn image n\u1eb7ng, t\u1ed1n t\u00e0i nguy\u00ean.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e1ch kh\u1eafc ph\u1ee5c:<\/li>\n<\/ul>\n\n\n\n<p>Ch\u1ecdn image base nh\u1ecf g\u1ecdn:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM node:18-alpine<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-khong-pin-fix-phien-b\u1ea3n-goi-cai-d\u1eb7t\"><strong>Kh\u00f4ng pin (fix) phi\u00ean b\u1ea3n g\u00f3i c\u00e0i \u0111\u1eb7t<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>V\u1ea5n \u0111\u1ec1:<\/li>\n<\/ul>\n\n\n\n<p>Kh\u00f4ng ch\u1ec9 \u0111\u1ecbnh phi\u00ean b\u1ea3n (latest ho\u1eb7c b\u1ecf version) d\u1eabn \u0111\u1ebfn m\u1ea5t ki\u1ec3m so\u00e1t m\u00f4i tr\u01b0\u1eddng khi image \u0111\u01b0\u1ee3c rebuild sau n\u00e0y.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e1ch kh\u1eafc ph\u1ee5c:<\/li>\n<\/ul>\n\n\n\n<p>Lu\u00f4n ghi r\u00f5 version:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>RUN apt-get install -y nginx=1.18.*<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-ch\u1ea1y-l\u1ec7nh-khong-c\u1ea7n-thi\u1ebft-trong-moi-tr\u01b0\u1eddng-production\"><strong>Ch\u1ea1y l\u1ec7nh kh\u00f4ng c\u1ea7n thi\u1ebft trong m\u00f4i tr\u01b0\u1eddng production<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>V\u1ea5n \u0111\u1ec1:<\/li>\n<\/ul>\n\n\n\n<p>Th\u00eam tool debug, test ho\u1eb7c dependency dev trong image ch\u1ea1y production l\u00e0m t\u0103ng dung l\u01b0\u1ee3ng v\u00e0 r\u1ee7i ro b\u1ea3o m\u1eadt.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e1ch kh\u1eafc ph\u1ee5c:<\/li>\n<\/ul>\n\n\n\n<p>T\u00e1ch Dockerfile theo m\u00f4i tr\u01b0\u1eddng (Dockerfile.dev, Dockerfile.prod) ho\u1eb7c d\u00f9ng ARG \u0111\u1ec3 linh ho\u1ea1t theo m\u1ee5c \u0111\u00edch.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-thi\u1ebfu-cmd-ho\u1eb7c-entrypoint\"><strong>Thi\u1ebfu CMD ho\u1eb7c ENTRYPOINT<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>V\u1ea5n \u0111\u1ec1:<\/li>\n<\/ul>\n\n\n\n<p>Kh\u00f4ng c\u00f3 l\u1ec7nh n\u00e0o \u0111\u1ec3 ch\u1ea1y container =&gt; Container kh\u1edfi \u0111\u1ed9ng xong r\u1ed3i d\u1eebng ngay l\u1eadp t\u1ee9c.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e1ch kh\u1eafc ph\u1ee5c:<\/li>\n<\/ul>\n\n\n\n<p>Th\u00eam l\u1ec7nh kh\u1edfi \u0111\u1ed9ng cu\u1ed1i file:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CMD &#91;\"npm\", \"start\"]<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-dung-add-thay-vi-copy-khi-khong-c\u1ea7n-thi\u1ebft\"><strong>D\u00f9ng ADD thay v\u00ec COPY khi kh\u00f4ng c\u1ea7n thi\u1ebft<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>V\u1ea5n \u0111\u1ec1:<\/li>\n<\/ul>\n\n\n\n<p>ADD c\u00f3 th\u00eam ch\u1ee9c n\u0103ng gi\u1ea3i n\u00e9n v\u00e0 t\u1ea3i t\u1eeb URL, nh\u01b0ng d\u00f9ng kh\u00f4ng \u0111\u00fang m\u1ee5c \u0111\u00edch s\u1ebd g\u00e2y kh\u00f3 ki\u1ec3m so\u00e1t.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>C\u00e1ch kh\u1eafc ph\u1ee5c:\n<ul class=\"wp-block-list\">\n<li>D\u00f9ng COPY cho file n\u1ed9i b\u1ed9<\/li>\n\n\n\n<li>Ch\u1ec9 d\u00f9ng ADD khi c\u1ea7n t\u00ednh n\u0103ng \u0111\u1eb7c bi\u1ec7t (gi\u1ea3i n\u00e9n file .tar,&#8230;)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-cac-cau-h\u1ecfi-th\u01b0\u1eddng-g\u1eb7p-v\u1ec1-dockerfile\"><span class=\"ez-toc-section\" id=\"Cac_cau_hoi_thuong_gap_ve_Dockerfile\"><\/span><strong>C\u00e1c c\u00e2u h\u1ecfi th\u01b0\u1eddng g\u1eb7p v\u1ec1 Dockerfile<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-cmd-va-entrypoint-trong-dockerfile-khac-nhau-nh\u01b0-th\u1ebf-nao\"><strong>CMD v\u00e0 ENTRYPOINT trong Dockerfile kh\u00e1c nhau nh\u01b0 th\u1ebf n\u00e0o?<\/strong><\/h3>\n\n\n\n<p>Trong Dockerfile, c\u1ea3 CMD v\u00e0 ENTRYPOINT \u0111\u1ec1u d\u00f9ng \u0111\u1ec3 ch\u1ec9 \u0111\u1ecbnh l\u1ec7nh s\u1ebd ch\u1ea1y khi container kh\u1edfi \u0111\u1ed9ng, nh\u01b0ng ch\u00fang c\u00f3 c\u00e1ch ho\u1ea1t \u0111\u1ed9ng kh\u00e1c nhau:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ENTRYPOINT c\u1ed1 \u0111\u1ecbnh l\u1ec7nh ch\u00ednh v\u00e0 kh\u00f4ng th\u1ec3 b\u1ecb override khi ch\u1ea1y docker run.<\/li>\n\n\n\n<li>CMD cung c\u1ea5p gi\u00e1 tr\u1ecb m\u1eb7c \u0111\u1ecbnh c\u00f3 th\u1ec3 b\u1ecb ghi \u0111\u00e8 ho\u00e0n to\u00e0n khi ch\u1ea1y container.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Khi k\u1ebft h\u1ee3p c\u1ea3 hai trong Dockerfile, CMD s\u1ebd \u0111\u01b0\u1ee3c truy\u1ec1n l\u00e0m \u0111\u1ed1i s\u1ed1 cho ENTRYPOINT.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-dockerfile-nen-d\u1eb7t-\u1edf-dau-trong-d\u1ef1-an\"><strong>Dockerfile n\u00ean \u0111\u1eb7t \u1edf \u0111\u00e2u trong d\u1ef1 \u00e1n?<\/strong><\/h3>\n\n\n\n<p>Trong m\u1ed9t d\u1ef1 \u00e1n, Dockerfile th\u01b0\u1eddng \u0111\u01b0\u1ee3c \u0111\u1eb7t t\u1ea1i th\u01b0 m\u1ee5c g\u1ed1c \u0111\u1ec3 d\u1ec5 qu\u1ea3n l\u00fd v\u00e0 build image nhanh ch\u00f3ng. Vi\u1ec7c \u0111\u1eb7t Dockerfile \u1edf c\u1ea5p cao nh\u1ea5t gi\u00fap Docker d\u1ec5 truy c\u1eadp to\u00e0n b\u1ed9 m\u00e3 ngu\u1ed3n v\u00e0 t\u00e0i nguy\u00ean c\u1ea7n thi\u1ebft. N\u1ebfu c\u1ea7n t\u1ed5 ch\u1ee9c ri\u00eang cho t\u1eebng service, b\u1ea1n c\u00f3 th\u1ec3 t\u1ea1o nhi\u1ec1u Dockerfile trong t\u1eebng th\u01b0 m\u1ee5c con v\u00e0 ch\u1ec9 \u0111\u1ecbnh \u0111\u01b0\u1eddng d\u1eabn khi build.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-co-th\u1ec3-co-nhi\u1ec1u-cmd-trong-dockerfile-khong\"><strong>C\u00f3 th\u1ec3 c\u00f3 nhi\u1ec1u CMD trong Dockerfile kh\u00f4ng?<\/strong><\/h3>\n\n\n\n<p>Trong Dockerfile, b\u1ea1n c\u00f3 th\u1ec3 khai b\u00e1o nhi\u1ec1u l\u1ec7nh CMD, nh\u01b0ng ch\u1ec9 l\u1ec7nh CMD cu\u1ed1i c\u00f9ng m\u1edbi c\u00f3 hi\u1ec7u l\u1ef1c. C\u00e1c l\u1ec7nh CMD tr\u01b0\u1edbc \u0111\u00f3 s\u1ebd b\u1ecb ghi \u0111\u00e8 trong qu\u00e1 tr\u00ecnh build. Do \u0111\u00f3, khi vi\u1ebft Dockerfile, h\u00e3y \u0111\u1ea3m b\u1ea3o CMD cu\u1ed1i ph\u1ea3n \u00e1nh \u0111\u00fang l\u1ec7nh kh\u1edfi \u0111\u1ed9ng b\u1ea1n mu\u1ed1n s\u1eed d\u1ee5ng cho container.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-t\u1ed5ng-k\u1ebft-dockerfile-la-gi\"><span class=\"ez-toc-section\" id=\"Tong_ket_Dockerfile_la_gi\"><\/span><strong>T\u1ed5ng k\u1ebft Dockerfile l\u00e0 g\u00ec<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Vi\u1ec7c n\u1eafm v\u1eefng c\u00e1ch vi\u1ebft v\u00e0 s\u1eed d\u1ee5ng Dockerfile l\u00e0 b\u01b0\u1edbc quan tr\u1ecdng gi\u00fap b\u1ea1n x\u00e2y d\u1ef1ng m\u00f4i tr\u01b0\u1eddng ph\u00e1t tri\u1ec3n v\u00e0 tri\u1ec3n khai \u1ee9ng d\u1ee5ng hi\u1ec7u qu\u1ea3, nh\u1ea5t qu\u00e1n v\u00e0 c\u00f3 th\u1ec3 t\u00e1i s\u1eed d\u1ee5ng. T\u1eeb c\u1ea5u tr\u00fac c\u01a1 b\u1ea3n \u0111\u1ebfn c\u00e1c ch\u1ec9 th\u1ecb th\u01b0\u1eddng d\u00f9ng, m\u1ed7i ph\u1ea7n trong Dockerfile \u0111\u1ec1u \u0111\u00f3ng vai tr\u00f2 then ch\u1ed1t trong qu\u00e1 tr\u00ecnh t\u1ea1o image t\u1ed1i \u01b0u. Hy v\u1ecdng qua b\u00e0i vi\u1ebft n\u00e0y, b\u1ea1n \u0111\u00e3 c\u00f3 c\u00e1i nh\u00ecn r\u00f5 r\u00e0ng v\u00e0 c\u00f3 th\u1ec3 t\u1ef1 tin t\u1ea1o ra Dockerfile ph\u00f9 h\u1ee3p v\u1edbi d\u1ef1 \u00e1n c\u1ee7a m\u00ecnh. \u0110\u1eebng qu\u00ean k\u1ebft h\u1ee3p v\u1edbi Docker Compose n\u1ebfu \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n c\u1ea7n nhi\u1ec1u service c\u00f9ng l\u00fac!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Khi b\u1eaft \u0111\u1ea7u v\u1edbi Docker, Dockerfile ch\u00ednh l\u00e0 b\u01b0\u1edbc \u0111\u1ea7u ti\u00ean \u0111\u1ec3 &#8220;l\u00e0m ch\u1ee7&#8221; c\u00f4ng ngh\u1ec7 container. D\u00f9 ch\u1ec9 l\u00e0 m\u1ed9t file v\u0103n b\u1ea3n \u0111\u01a1n gi\u1ea3n, Dockerfile l\u1ea1i \u0111\u00f3ng vai tr\u00f2 quan tr\u1ecdng trong vi\u1ec7c t\u1ef1 \u0111\u1ed9ng h\u00f3a qu\u00e1 tr\u00ecnh t\u1ea1o ra Docker image cho \u1ee9ng d\u1ee5ng c\u1ee7a b\u1ea1n. Ch\u00fang ta s\u1ebd c\u00f9ng nhau t\u00ecm [&hellip;]<\/p>\n","protected":false},"author":214,"featured_media":88628,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_gspb_post_css":"","footnotes":""},"categories":[109],"tags":[],"class_list":["post-88584","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-chuyen-mon-it"],"blocksy_meta":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.8 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Dockerfile l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn vi\u1ebft Dockerfile theo c\u1ea5u tr\u00fac chu\u1ea9n - ITviec Blog<\/title>\n<meta name=\"description\" content=\"Hi\u1ec3u r\u00f5 Dockerfile l\u00e0 g\u00ec v\u00e0 h\u01b0\u1edbng d\u1eabn c\u00e1ch vi\u1ebft Dockerfile c\u1ea5u tr\u00fac chu\u1ea9n v\u1edbi v\u00ed d\u1ee5 d\u1ec5 hi\u1ec3u, gi\u00fap t\u1ea1o image v\u00e0 tr\u00e1nh c\u00e1c l\u1ed7i ph\u1ed5 bi\u1ebfn.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/\" \/>\n<meta property=\"og:locale\" content=\"vi_VN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dockerfile l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn vi\u1ebft Dockerfile theo c\u1ea5u tr\u00fac chu\u1ea9n\" \/>\n<meta property=\"og:description\" content=\"Khi b\u1eaft \u0111\u1ea7u v\u1edbi Docker, Dockerfile ch\u00ednh l\u00e0 b\u01b0\u1edbc \u0111\u1ea7u ti\u00ean \u0111\u1ec3 &quot;l\u00e0m ch\u1ee7&quot; c\u00f4ng ngh\u1ec7 container. D\u00f9 ch\u1ec9 l\u00e0 m\u1ed9t file v\u0103n b\u1ea3n \u0111\u01a1n gi\u1ea3n, Dockerfile l\u1ea1i \u0111\u00f3ng vai\" \/>\n<meta property=\"og:url\" content=\"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/\" \/>\n<meta property=\"og:site_name\" content=\"ITviec Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/ITviec\" \/>\n<meta property=\"article:published_time\" content=\"2025-06-29T06:54:45+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-29T15:33:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/06\/dockerfile-la-gi-vippro-scaled.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1347\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Hi\u1ebfu Phan\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@ITviec\" \/>\n<meta name=\"twitter:site\" content=\"@ITviec\" \/>\n<meta name=\"twitter:label1\" content=\"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hi\u1ebfu Phan\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 ph\u00fat\" \/>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Dockerfile l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn vi\u1ebft Dockerfile theo c\u1ea5u tr\u00fac chu\u1ea9n - ITviec Blog","description":"Hi\u1ec3u r\u00f5 Dockerfile l\u00e0 g\u00ec v\u00e0 h\u01b0\u1edbng d\u1eabn c\u00e1ch vi\u1ebft Dockerfile c\u1ea5u tr\u00fac chu\u1ea9n v\u1edbi v\u00ed d\u1ee5 d\u1ec5 hi\u1ec3u, gi\u00fap t\u1ea1o image v\u00e0 tr\u00e1nh c\u00e1c l\u1ed7i ph\u1ed5 bi\u1ebfn.","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:\/\/itviec.com\/blog\/dockerfile-la-gi\/","og_locale":"vi_VN","og_type":"article","og_title":"Dockerfile l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn vi\u1ebft Dockerfile theo c\u1ea5u tr\u00fac chu\u1ea9n","og_description":"Khi b\u1eaft \u0111\u1ea7u v\u1edbi Docker, Dockerfile ch\u00ednh l\u00e0 b\u01b0\u1edbc \u0111\u1ea7u ti\u00ean \u0111\u1ec3 \"l\u00e0m ch\u1ee7\" c\u00f4ng ngh\u1ec7 container. D\u00f9 ch\u1ec9 l\u00e0 m\u1ed9t file v\u0103n b\u1ea3n \u0111\u01a1n gi\u1ea3n, Dockerfile l\u1ea1i \u0111\u00f3ng vai","og_url":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/","og_site_name":"ITviec Blog","article_publisher":"https:\/\/www.facebook.com\/ITviec","article_published_time":"2025-06-29T06:54:45+00:00","article_modified_time":"2025-06-29T15:33:15+00:00","og_image":[{"width":2560,"height":1347,"url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/06\/dockerfile-la-gi-vippro-scaled.png","type":"image\/png"}],"author":"Hi\u1ebfu Phan","twitter_card":"summary_large_image","twitter_creator":"@ITviec","twitter_site":"@ITviec","twitter_misc":{"\u0110\u01b0\u1ee3c vi\u1ebft b\u1edfi":"Hi\u1ebfu Phan","\u01af\u1edbc t\u00ednh th\u1eddi gian \u0111\u1ecdc":"17 ph\u00fat"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#article","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/"},"author":{"name":"Hi\u1ebfu Phan","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/d9f4dfc3237d95eb1549e5adb2ede904"},"headline":"Dockerfile l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn vi\u1ebft Dockerfile theo c\u1ea5u tr\u00fac chu\u1ea9n","datePublished":"2025-06-29T06:54:45+00:00","dateModified":"2025-06-29T15:33:15+00:00","mainEntityOfPage":{"@id":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/"},"wordCount":4438,"publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"image":{"@id":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/06\/dockerfile-la-gi-vippro-scaled.png","articleSection":["Chuy\u00ean m\u00f4n IT"],"inLanguage":"vi"},{"@type":"WebPage","@id":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/","url":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/","name":"Dockerfile l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn vi\u1ebft Dockerfile theo c\u1ea5u tr\u00fac chu\u1ea9n - ITviec Blog","isPartOf":{"@id":"https:\/\/itviec.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#primaryimage"},"image":{"@id":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#primaryimage"},"thumbnailUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/06\/dockerfile-la-gi-vippro-scaled.png","datePublished":"2025-06-29T06:54:45+00:00","dateModified":"2025-06-29T15:33:15+00:00","description":"Hi\u1ec3u r\u00f5 Dockerfile l\u00e0 g\u00ec v\u00e0 h\u01b0\u1edbng d\u1eabn c\u00e1ch vi\u1ebft Dockerfile c\u1ea5u tr\u00fac chu\u1ea9n v\u1edbi v\u00ed d\u1ee5 d\u1ec5 hi\u1ec3u, gi\u00fap t\u1ea1o image v\u00e0 tr\u00e1nh c\u00e1c l\u1ed7i ph\u1ed5 bi\u1ebfn.","breadcrumb":{"@id":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#breadcrumb"},"inLanguage":"vi","potentialAction":[{"@type":"ReadAction","target":["https:\/\/itviec.com\/blog\/dockerfile-la-gi\/"]}]},{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#primaryimage","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/06\/dockerfile-la-gi-vippro-scaled.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2025\/06\/dockerfile-la-gi-vippro-scaled.png","width":2560,"height":1347,"caption":"Dockerfile l\u00e0 g\u00ec - itviec blog"},{"@type":"BreadcrumbList","@id":"https:\/\/itviec.com\/blog\/dockerfile-la-gi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Chuy\u00ean m\u00f4n IT","item":"https:\/\/itviec.com\/blog\/chuyen-mon-it\/"},{"@type":"ListItem","position":2,"name":"Dockerfile l\u00e0 g\u00ec: H\u01b0\u1edbng d\u1eabn vi\u1ebft Dockerfile theo c\u1ea5u tr\u00fac chu\u1ea9n"}]},{"@type":"WebSite","@id":"https:\/\/itviec.com\/blog\/#website","url":"https:\/\/itviec.com\/blog\/","name":"ITviec Blog","description":"IT Jobs &amp; People in Vietnam","publisher":{"@id":"https:\/\/itviec.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/itviec.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"vi"},{"@type":"Organization","@id":"https:\/\/itviec.com\/blog\/#organization","name":"ITviec","url":"https:\/\/itviec.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2018\/12\/itviec-black-square-facebook.png","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2018\/12\/itviec-black-square-facebook.png","width":1800,"height":1800,"caption":"ITviec"},"image":{"@id":"https:\/\/itviec.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/ITviec","https:\/\/x.com\/ITviec","https:\/\/www.linkedin.com\/company\/itviec","https:\/\/www.youtube.com\/channel\/UCYthAQ3bcGr57M_ag5gHDvQ"]},{"@type":"Person","@id":"https:\/\/itviec.com\/blog\/#\/schema\/person\/d9f4dfc3237d95eb1549e5adb2ede904","name":"Hi\u1ebfu Phan","image":{"@type":"ImageObject","inLanguage":"vi","@id":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/03\/phan-trung-hieu-author-e1709881921227-100x100.jpg","url":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/03\/phan-trung-hieu-author-e1709881921227-100x100.jpg","contentUrl":"https:\/\/itviec.com\/blog\/wp-content\/uploads\/2024\/03\/phan-trung-hieu-author-e1709881921227-100x100.jpg","caption":"Hi\u1ebfu Phan"},"url":"https:\/\/itviec.com\/blog\/author\/hieu-phan\/"}]}},"_links":{"self":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/88584","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/users\/214"}],"replies":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/comments?post=88584"}],"version-history":[{"count":5,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/88584\/revisions"}],"predecessor-version":[{"id":88683,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/posts\/88584\/revisions\/88683"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media\/88628"}],"wp:attachment":[{"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/media?parent=88584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/categories?post=88584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/itviec.com\/blog\/wp-json\/wp\/v2\/tags?post=88584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}