<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: duytruong09</title>
    <description>The latest articles on DEV Community by duytruong09 (@duytruong09).</description>
    <link>https://dev.to/duytruong09</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1117204%2Fa3a44e3a-ba1b-4533-8653-be96064d4572.png</url>
      <title>DEV Community: duytruong09</title>
      <link>https://dev.to/duytruong09</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/duytruong09"/>
    <language>en</language>
    <item>
      <title>Docker build, run, tag and push</title>
      <dc:creator>duytruong09</dc:creator>
      <pubDate>Sun, 27 Jul 2025 17:35:38 +0000</pubDate>
      <link>https://dev.to/duytruong09/docker-build-run-tag-and-push-4h50</link>
      <guid>https://dev.to/duytruong09/docker-build-run-tag-and-push-4h50</guid>
      <description>&lt;h1&gt;
  
  
  Các câu lệnh cơ bản trong Docker
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Docker build
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cách dễ nhất để check các options trong docker build là dùng 
&lt;code&gt;docker build -h&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2F2vsps780vs0bee44nz50.png" class="article-body-image-wrapper"&gt;&lt;img 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%2F2vsps780vs0bee44nz50.png" alt="image" width="745" height="404"&gt;&lt;/a&gt;&lt;br&gt;
&lt;code&gt;docker buildx build [OPTIONS] PATH | URL | -&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chúng ta đi những options được sử dụng nhiều nhất
Cấu trúc
`docker build [options] path&lt;/li&gt;
&lt;li&gt;Build với 1 tag
&lt;code&gt;docker build -t vue-hello-world .&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Build với nhiều tag khác nhau
&lt;code&gt;docker build -t vue-hello-world:latest -t vue-hello-world:v1.0 .&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Build với no cache (force rebuild)
&lt;code&gt;docker build --no-cache -t vue-hello-world .&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Build để xem chi tiết
&lt;code&gt;docker build --progress=plain -t vue-hello-world:debug .&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Buld với build arguments
&lt;code&gt;docker build --build-arg NODE_ENV=production -t vue-hello-world:prod .
&lt;/code&gt;
&lt;img 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%2Fg4jj5r99v5ocoozluwod.png" alt="image" width="704" height="139"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2.Docker run
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Cách để xem chi tiết các options khi run &lt;code&gt;docker run --help &lt;/code&gt;
&lt;img 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%2Fnsm9lfdywto34hk93r0q.png" alt="image" width="800" height="320"&gt;
&lt;code&gt;docker run [OPTIONS] IMAGE [COMMAND] [ARG...]&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Để run được container thì dùng có 
&lt;code&gt;docker run -d --name vue-basic -p 8080:80 vue-hello-world:latest&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Fcqwmekeogjmy0lkw1knq.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fcqwmekeogjmy0lkw1knq.png" alt="image" width="800" height="88"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2Feifbcplk4q79dvbbpo1v.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Feifbcplk4q79dvbbpo1v.png" alt="image" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Docker tag
&lt;/h2&gt;

&lt;p&gt;&lt;a href="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%2Fnw36jfwbcw1sjg0ln0ib.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fnw36jfwbcw1sjg0ln0ib.png" alt="image" width="634" height="140"&gt;&lt;/a&gt;&lt;br&gt;
&lt;code&gt;docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tag với tag latest
&lt;code&gt;docker tag $vue-hello-world:latest $azura1809/$vue-hello-world:latest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Tag với ta v1.0
&lt;code&gt;docker tag $vue-hello-world:latest $azura1809/$vue-hello-world:v1.0&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="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%2Ffzvgmdibdmzesggx82rt.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Ffzvgmdibdmzesggx82rt.png" alt="image" width="800" height="47"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Push container
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Lên Docker Hub
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker info | grep Username&lt;/code&gt;&lt;br&gt;
&lt;code&gt;docker login&lt;/code&gt;&lt;br&gt;
&lt;code&gt;docker push azura1809/vue-hello-world:latest&lt;/code&gt;&lt;br&gt;
&lt;code&gt;docker push azura1809/vue-hello-world:v1.0&lt;/code&gt;&lt;br&gt;
&lt;a href="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%2Fokav8tng1cse18qiditv.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fokav8tng1cse18qiditv.png" alt="image" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Lên Gitlab Container Registry
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;docker login registry.gitlab.com&lt;/code&gt;&lt;br&gt;
&lt;code&gt;docker build -t registry.gitlab.com/truong.nd09/vue-helloworld .&lt;/code&gt;&lt;br&gt;
&lt;code&gt;docker push registry.gitlab.com/truong.nd09/vue-helloworld&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="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%2F89rwfq1odtiouy5by5jr.png" class="article-body-image-wrapper"&gt;&lt;img 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%2F89rwfq1odtiouy5by5jr.png" alt="image" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Quản lý Docker Image &amp; Container Cơ Bản</title>
      <dc:creator>duytruong09</dc:creator>
      <pubDate>Sun, 20 Jul 2025 17:11:59 +0000</pubDate>
      <link>https://dev.to/duytruong09/quan-ly-docker-image-container-co-ban-1a60</link>
      <guid>https://dev.to/duytruong09/quan-ly-docker-image-container-co-ban-1a60</guid>
      <description>&lt;ol&gt;
&lt;li&gt;Quản lý Image
Docker file của api-portal
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM node:20-alpine3.18 AS build
WORKDIR /app

COPY package*.json ./
ARG NPM_TOKEN_GLOBAL
RUN apk update
RUN apk add git
RUN apk add --no-cache make gcc g++ libc6-compat bash python3 vips-dev

RUN echo /packages/npm/ &amp;gt;&amp;gt; .npmrc
RUN echo /packages/npm/:_authToken=$NPM_TOKEN_GLOBAL &amp;gt;&amp;gt; .npmrc
RUN npm install --force

COPY . .
RUN npm run build

FROM node:20-alpine3.18
WORKDIR /app
COPY --from=build /app /app
RUN apk add \
      --no-cache \
      --repository http://dl-cdn.alpinelinux.org/alpine/v3.14/main \
      ca-certificates
ENV NODE_SERVER_PORT=8081
EXPOSE 8081
ENTRYPOINT ["yarn", "start" ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;docker build&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Khi nào: tạo một image mới từ Dockerfile.&lt;/li&gt;
&lt;li&gt;Mục đích: build một image như portal để khỏi chạy run code 
Ví dụ:
&lt;code&gt;docker build .&lt;/code&gt;
&lt;img 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%2Flkvwu0mmp80bjtp4nlow.png" alt="image" width="800" height="212"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bị lỗi: do không có token &lt;br&gt;
&lt;a href="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%2Fjibe3153q81s91uos1ki.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fjibe3153q81s91uos1ki.png" alt="image" width="800" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;docker build --build-arg NPM_TOKEN_GLOBAL=glpat-bzMY8GLHz15XXXXXXX .&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Vì sao lại có option &lt;code&gt;--build-arge&lt;/code&gt;?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mục đích để truyền tham số trong quá trình build&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vì sao lại lại là token?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Vì để buld ở dev với prod thì có token khác nhau, không bị lộ token nên bị đọc source code -&amp;gt; bảo mật hơn - đổi token linh hoạt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Trong file ci-template.yml có docker build&lt;br&gt;
&lt;a href="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%2Fhdkimagtwpmob9ell3sv.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fhdkimagtwpmob9ell3sv.png" alt="image" width="800" height="19"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;có cách khác để lấy image là pull image có sẵn trên kho &lt;strong&gt;docker pull&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;docker pull hello-world&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;docker images&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Khi nào: Khi cần xem các image đã build&lt;/li&gt;
&lt;li&gt;Mục đích: Kiểm tra, quản lý dung lượng, tên, tag image.
Ví dụ:
&lt;code&gt;docker images&lt;/code&gt;
&lt;img 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%2F06kf3lut0f7xwcc4crs1.png" alt="image" width="800" height="250"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;docker rmi&lt;/strong&gt;: (remove image)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Khi nào: Khi muốn xoá image không dùng nữa.&lt;/li&gt;
&lt;li&gt;Mục đích: Giải phóng dung lượng, dọn dẹp hệ thống.
Ví dụ:
&lt;code&gt;docker rmi hello-world:latest&lt;/code&gt;
&lt;img 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%2F7nv78ni8413ji555tgug.png" alt="image" width="800" height="350"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Quản lý Container
&lt;strong&gt;docker run&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Khi nào: khi muốn chạy một image&lt;/li&gt;
&lt;li&gt;Mục đích: Chạy dịch vụ, ứng dụng, môi trường phát triển/nghiệm thử.
Ví dụ:
&lt;code&gt;docker run hello-world&lt;/code&gt;
&lt;img 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%2F892gs5pthgqwyzctdzk1.png" alt="image" width="776" height="450"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;docker ps&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Khi nào: Khi muốn xem các container đang chạy.
Mục đích: Giám sát hoạt động container, lấy ID/container-name.&lt;/li&gt;
&lt;li&gt;Dùng ở đâu: Sau khi đã chạy các container.
Ví dụ:
&lt;code&gt;docker ps&lt;/code&gt; 
&lt;code&gt;docker ps -a&lt;/code&gt;
&lt;img 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%2Fexmiecerkebfhmokigsi.png" alt="image" width="800" height="238"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;docker exec&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Khi nào: Khi muốn truy cập hoặc thực thi lệnh trong container đang chạy.&lt;/li&gt;
&lt;li&gt;Mục đích: Debug, cài bổ sung, kiểm tra tệp/phần mềm bên trong container.&lt;/li&gt;
&lt;li&gt;Dùng ở đâu: Trong quá trình phát triển hoặc khắc phục lỗi.
Ví dụ:
&lt;code&gt;docker exec -it bfa6acb3eb2f bash&lt;/code&gt;
&lt;img 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%2Fqrzmnru031owpmiscwgm.png" alt="image" width="800" height="394"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;docker logs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Khi nào: Khi cần xem log ứng dụng/container.&lt;/li&gt;
&lt;li&gt;Mục đích: Kiểm tra hoạt động, phát hiện lỗi.&lt;/li&gt;
&lt;li&gt;Dùng ở đâu: Sau khi ứng dụng chạy, gặp sự cố cần kiểm tra log.
Ví dụ:
&lt;code&gt;docker logs 108c20adb38e&lt;/code&gt;
&lt;img 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%2Ffo9ytktjv5q1asv7ii3y.png" alt="image" width="800" height="222"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;docker stop&lt;/strong&gt;&lt;br&gt;
Khi nào: Khi muốn dừng một container đang hoạt động.&lt;br&gt;
Mục đích: Ngừng ứng dụng đang chạy, giải phóng ram&lt;br&gt;
Ví dụ:&lt;br&gt;
&lt;code&gt;docker stop 108c20adb38e&lt;/code&gt;&lt;br&gt;
&lt;a href="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%2Fixhwu3s3m0w5k8sndzdu.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fixhwu3s3m0w5k8sndzdu.png" alt="image" width="395" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;docker rm&lt;/strong&gt;: (remove container)&lt;br&gt;
Khi nào: Sau khi đã dừng (stop) container, muốn xoá nó khỏi máy.&lt;br&gt;
Mục đích: Dọn dẹp các container không sử dụng.&lt;/p&gt;

&lt;p&gt;Ví dụ:&lt;br&gt;
&lt;code&gt;docker rm 6b5cf67fa07&lt;/code&gt;&lt;br&gt;
&lt;a href="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%2Fe5da7ivoi67rmt0nin7m.png" class="article-body-image-wrapper"&gt;&lt;img 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%2Fe5da7ivoi67rmt0nin7m.png" alt="image" width="800" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 Docker Phần 3: Docker Compose, volume, network</title>
      <dc:creator>duytruong09</dc:creator>
      <pubDate>Sun, 13 Jul 2025 16:58:51 +0000</pubDate>
      <link>https://dev.to/duytruong09/docker-phan-3-docker-compose-volume-network-3h7c</link>
      <guid>https://dev.to/duytruong09/docker-phan-3-docker-compose-volume-network-3h7c</guid>
      <description>&lt;h2&gt;
  
  
  1. Volumes: Lưu Trữ Dữ Liệu Bền Vững Trong Docker
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1.1. Bind Mounts vs. Named Volumes
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bind Mounts&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Khái niệm&lt;/strong&gt;: Cho phép bạn mount một thư mục hoặc file từ &lt;strong&gt;host machine&lt;/strong&gt; (máy tính của bạn) vào bên trong container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ưu điểm&lt;/strong&gt;: Rất tiện lợi cho việc phát triển cục bộ. Khi bạn chỉnh sửa mã nguồn trên máy tính, thay đổi sẽ được phản ánh ngay lập tức trong container mà không cần build lại image.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nhược điểm&lt;/strong&gt;: Phụ thuộc vào cấu trúc thư mục của host. Kém portable hơn vì đường dẫn trên host có thể khác nhau giữa các môi trường.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ví dụ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  web:
    image: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf # Mount file cấu hình
      - ./src:/usr/share/nginx/html      # Mount thư mục mã nguồn
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Named Volumes&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Khái niệm&lt;/strong&gt;: Là các khu vực lưu trữ được Docker quản lý hoàn toàn. Bạn chỉ cần đặt tên cho chúng và Docker sẽ tự động tạo/quản lý vị trí lưu trữ trên host.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ưu điểm&lt;/strong&gt;: Dễ dàng sao lưu, di chuyển và chia sẻ giữa các container. Không phụ thuộc vào cấu trúc thư mục của host, tăng tính portable. Lý tưởng cho dữ liệu database hoặc dữ liệu cần tồn tại độc lập với container.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nhược điểm&lt;/strong&gt;: Khó truy cập trực tiếp từ host để chỉnh sửa nội dung (phải thông qua container hoặc Docker CLI).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ví dụ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  db:
    image: postgres
    volumes:
      - db_data:/var/lib/postgresql/data # Sử dụng named volume 'db_data'

volumes:
  db_data: # Khai báo named volume
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.2. Port Mapping (-p)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Port mapping&lt;/strong&gt; (hay &lt;strong&gt;port forwarding&lt;/strong&gt;) là cách để expose các cổng của container ra bên ngoài host machine, cho phép bạn truy cập ứng dụng đang chạy trong container từ trình duyệt hoặc các ứng dụng khác trên host.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cú pháp&lt;/strong&gt;: &lt;code&gt;-p HOST_PORT:CONTAINER_PORT&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ví dụ&lt;/strong&gt;: &lt;code&gt;ports: - "8080:80"&lt;/code&gt; nghĩa là cổng 80 của container sẽ được ánh xạ tới cổng 8080 trên host của bạn. Khi bạn truy cập &lt;code&gt;localhost:8080&lt;/code&gt;, yêu cầu sẽ được chuyển đến cổng 80 của container.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Docker Networks: Giao Tiếp Giữa Các Container
&lt;/h2&gt;

&lt;p&gt;Các container cần giao tiếp với nhau. Docker cung cấp cơ chế network để các container có thể "nói chuyện" với nhau một cách an toàn và hiệu quả.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1. Cách Các Container Giao Tiếp
&lt;/h3&gt;

&lt;p&gt;Khi bạn sử dụng Docker Compose, một &lt;strong&gt;mạng bridge mặc định&lt;/strong&gt; sẽ được tạo cho toàn bộ ứng dụng của bạn. Tất cả các service trong file &lt;code&gt;docker-compose.yml&lt;/code&gt; sẽ tự động được kết nối vào mạng này.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service Discovery&lt;/strong&gt;: Các container có thể giao tiếp với nhau bằng cách sử dụng &lt;strong&gt;tên dịch vụ (service name)&lt;/strong&gt; làm hostname. Ví dụ, nếu bạn có một service tên là &lt;code&gt;db&lt;/code&gt;, service &lt;code&gt;web&lt;/code&gt; có thể kết nối tới database bằng hostname &lt;code&gt;db&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  web:
    image: myapp-web
    environment:
      DB_HOST: db # "db" là tên của service database
  db:
    image: postgres
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.2. Docker Networks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;```
services:
  web:
    image: nginx
    ports:
      - "80:80"
    networks:
      - frontend_network # Kết nối vào mạng frontend
  api:
    image: myapp-api
    networks:
      - frontend_network
      - backend_network # Kết nối vào cả frontend và backend
  db:
    image: postgres
    networks:
      - backend_network # Chỉ kết nối vào mạng backend

networks:
  frontend_network:
    driver: bridge # Có thể dùng driver khác nếu cần (ví dụ: overlay cho Swarm)
  backend_network:
    driver: bridge
```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trong ví dụ này, `web` và `api` có thể giao tiếp với nhau qua `frontend_network`. `api` và `db` có thể giao tiếp qua `backend_network`. `web` và `db` không thể giao tiếp trực tiếp trừ khi cả hai cùng nằm trên một mạng chung.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  3. Docker Compose: Ứng Dụng Đa Container Trong Một File
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Docker Compose&lt;/strong&gt; là công cụ giúp bạn định nghĩa và chạy các ứng dụng Docker đa container. Thay vì chạy từng container một bằng lệnh &lt;code&gt;docker run&lt;/code&gt;, bạn có thể dùng một file YAML để mô tả toàn bộ kiến trúc ứng dụng của mình.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1. Khái Niệm Multi-Container Apps
&lt;/h3&gt;

&lt;p&gt;Một ứng dụng thực tế thường không chỉ có một container. Nó có thể bao gồm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Một &lt;strong&gt;web server&lt;/strong&gt; (Nginx, Apache)&lt;/li&gt;
&lt;li&gt;Một &lt;strong&gt;backend API&lt;/strong&gt; (Node.js, Python Flask, Java Spring Boot)&lt;/li&gt;
&lt;li&gt;Một &lt;strong&gt;database&lt;/strong&gt; (PostgreSQL, MySQL, MongoDB)&lt;/li&gt;
&lt;li&gt;Một &lt;strong&gt;message queue&lt;/strong&gt; (RabbitMQ, Kafka)&lt;/li&gt;
&lt;li&gt;Một &lt;strong&gt;cache&lt;/strong&gt; (Redis)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Docker Compose giúp bạn quản lý tất cả các thành phần này một cách mạch lạc.&lt;/p&gt;

&lt;p&gt;File &lt;code&gt;docker-compose.yml&lt;/code&gt; là nơi bạn định nghĩa cấu hình cho ứng dụng của mình. Nó thường bao gồm các phần chính:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;services&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mỗi entry dưới &lt;code&gt;services&lt;/code&gt; đại diện cho một container trong ứng dụng của bạn.&lt;/li&gt;
&lt;li&gt;Bạn định nghĩa &lt;code&gt;image&lt;/code&gt; (tên image Docker), &lt;code&gt;build&lt;/code&gt; (đường dẫn đến Dockerfile để build custom image), &lt;code&gt;ports&lt;/code&gt;, &lt;code&gt;volumes&lt;/code&gt;, &lt;code&gt;environment&lt;/code&gt; (biến môi trường), &lt;code&gt;networks&lt;/code&gt;, v.v.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ví dụ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: '3.8' # Phiên bản của Docker Compose file

services:
  web:
    build: ./web # Build image từ Dockerfile trong thư mục ./web
    ports:
      - "80:80"
    volumes:
      - ./web/src:/app
    environment:
      NODE_ENV: development
    depends_on:
      - api # Đảm bảo service 'api' khởi động trước
    networks:
      - app_network

  api:
    image: my_api_image:latest # Sử dụng image đã có
    ports:
      - "3000:3000"
    environment:
      DB_HOST: db
    networks:
      - app_network
      - db_network

  db:
    image: postgres:13
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: mydb
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    networks:
      - db_network
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;volumes&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Khai báo các &lt;strong&gt;named volumes&lt;/strong&gt; để lưu trữ dữ liệu bền vững.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ví dụ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;volumes:
  db_data: # Định nghĩa named volume tên là 'db_data'
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;networks&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Khai báo các &lt;strong&gt;mạng tùy chỉnh&lt;/strong&gt; để kiểm soát giao tiếp giữa các service.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ví dụ&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;networks:
  app_network:
  db_network:
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.2. Các Lệnh Docker Compose Cơ Bản
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;docker compose up&lt;/code&gt;&lt;/strong&gt;: Xây dựng (nếu cần), tạo và khởi chạy tất cả các service được định nghĩa trong &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/strong&gt;: Chạy các service trong chế độ nền (detached mode)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;docker compose down&lt;/code&gt;&lt;/strong&gt;: Dừng và xóa tất cả các container, network và volume được tạo bởi &lt;code&gt;up&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker compose down --volumes&lt;/code&gt;&lt;/strong&gt;: Dừng, xóa container, network và &lt;strong&gt;cả các named volumes&lt;/strong&gt;. Hãy cẩn thận khi sử dụng, vì nó sẽ xóa dữ liệu.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;docker compose logs [service_name]&lt;/code&gt;&lt;/strong&gt;: Hiển thị log output từ các service.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;docker compose logs -f&lt;/code&gt;&lt;/strong&gt;: Theo dõi log theo thời gian thực (follow).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;docker compose build [service_name]&lt;/code&gt;&lt;/strong&gt;: Xây dựng hoặc tái xây dựng image cho một hoặc tất cả các service được định nghĩa bằng &lt;code&gt;build&lt;/code&gt; trong file &lt;code&gt;docker-compose.yml&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>🚀 Docker Phần 2: Hiểu về Layer, ENV, ARG, CMD, ENTRYPOINT và cách build/run Docker</title>
      <dc:creator>duytruong09</dc:creator>
      <pubDate>Sun, 06 Jul 2025 13:57:19 +0000</pubDate>
      <link>https://dev.to/duytruong09/docker-phan-2-hieu-ve-layer-env-arg-cmd-entrypoint-va-cach-buildrun-docker-2o6a</link>
      <guid>https://dev.to/duytruong09/docker-phan-2-hieu-ve-layer-env-arg-cmd-entrypoint-va-cach-buildrun-docker-2o6a</guid>
      <description>&lt;h1&gt;
  
  
  Hiểu về Layer, ENV, ARG, CMD, ENTRYPOINT và cách build/run Docker
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Bài viết này dành cho người mới học Docker hoặc cần hiểu rõ hơn về cách hoạt động của Dockerfile.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. Layer trong Docker là gì?
&lt;/h2&gt;

&lt;p&gt;Khi bạn build một Docker image từ &lt;code&gt;Dockerfile&lt;/code&gt;, Docker sẽ tạo ra &lt;strong&gt;các lớp (layer)&lt;/strong&gt; tương ứng với mỗi dòng lệnh trong file.&lt;/p&gt;

&lt;p&gt;Mỗi layer là một lớp &lt;strong&gt;bất biến&lt;/strong&gt; (immutable) — nếu dòng lệnh không thay đổi, Docker có thể &lt;strong&gt;cache lại layer đó&lt;/strong&gt;, giúp build nhanh hơn và tiết kiệm dung lượng.&lt;/p&gt;

&lt;h3&gt;
  
  
  Câu lệnh tạo layer mới:
&lt;/h3&gt;

&lt;p&gt;Các chỉ thị trong &lt;code&gt;Dockerfile&lt;/code&gt; tạo ra layer mới gồm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM: # Bắt đầu một image base mới
RUN: # dùng để chạy lệnh trong lúc build, ví dụ: # RUN apt-get install ...
COPY: # copy file từ máy host vào image
ADD: # giống COPY nhưng thông minh hơn (có thể giải nén) 
CMD: # chỉ định lệnh mặc định khi container chạy
ENTRYPOINT: # giống CMD nhưng bắt buôc hơn
ENV: # thiết lập biến môi trường cho image
ARG: # thiết lập biến môi trường khi build
WORKDIR: # thiết lập thư mục làm việc
EXPOSE: # Mô tả cổng mở ra ngoài (chỉ làm tài ENVliệu)
LABEL: # Thêm metadata
USER, VOLUMN: # các chỉ thị khác cũng tạo layer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lưu ý: Việc sắp xếp và gom các lệnh &lt;code&gt;RUN&lt;/code&gt; cũng giúp giảm số lượng layer (ví dụ: dùng &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; để nối nhiều lệnh).&lt;/p&gt;




&lt;h2&gt;
  
  
  2. ENV vs ARG – khác nhau thế nào?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;ARG&lt;/code&gt; – Dùng trong lúc build
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;ARG&lt;/span&gt;&lt;span class="s"&gt; NODE_VERSION=18&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:${NODE_VERSION}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ARG&lt;/code&gt; chỉ dùng &lt;strong&gt;trong quá trình build&lt;/strong&gt;, không tồn tại khi container chạy.&lt;/li&gt;
&lt;li&gt;Có thể truyền giá trị với &lt;code&gt;--build-arg&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;ENV&lt;/code&gt; – Dùng khi container chạy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; NODE_ENV=production&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ENV&lt;/code&gt; tồn tại cả trong lúc build &lt;strong&gt;và&lt;/strong&gt; khi container chạy.&lt;/li&gt;
&lt;li&gt;Có thể ghi đè bằng &lt;code&gt;docker run -e&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tóm lại:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Đặc điểm&lt;/th&gt;
&lt;th&gt;ARG&lt;/th&gt;
&lt;th&gt;ENV&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dùng lúc build&lt;/td&gt;
&lt;td&gt;có&lt;/td&gt;
&lt;td&gt;có&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dùng lúc run&lt;/td&gt;
&lt;td&gt;không&lt;/td&gt;
&lt;td&gt;có&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Truyền từ CLI&lt;/td&gt;
&lt;td&gt;có &lt;code&gt;--build-arg&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;có &lt;code&gt;-e&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Có trong image&lt;/td&gt;
&lt;td&gt;không&lt;/td&gt;
&lt;td&gt;có&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  3. CMD vs ENTRYPOINT – khác nhau?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CMD
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["node", "app.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Là &lt;strong&gt;lệnh mặc định&lt;/strong&gt;, có thể ghi đè khi &lt;code&gt;docker run&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ENTRYPOINT
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;ENTRYPOINT&lt;/span&gt;&lt;span class="s"&gt; ["node"]&lt;/span&gt;
&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["app.js"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ENTRYPOINT&lt;/code&gt; giống như "lệnh bắt buộc", không dễ ghi đè.&lt;/li&gt;
&lt;li&gt;Thường kết hợp &lt;code&gt;CMD&lt;/code&gt; để truyền thêm args.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  So sánh nhanh:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Đặc điểm&lt;/th&gt;
&lt;th&gt;CMD&lt;/th&gt;
&lt;th&gt;ENTRYPOINT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ghi đè bằng CLI&lt;/td&gt;
&lt;td&gt;có&lt;/td&gt;
&lt;td&gt;không (phải dùng &lt;code&gt;--entrypoint&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dùng mặc định&lt;/td&gt;
&lt;td&gt;có&lt;/td&gt;
&lt;td&gt;có&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ưu tiên hơn&lt;/td&gt;
&lt;td&gt;không&lt;/td&gt;
&lt;td&gt;có&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  4. Cách dùng docker build và docker run
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Build image:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; myapp:latest &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-t&lt;/code&gt; đặt tên image.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.&lt;/code&gt; là thư mục chứa &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Truyền &lt;code&gt;ARG&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker build &lt;span class="nt"&gt;--build-arg&lt;/span&gt; &lt;span class="nv"&gt;NODE_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;20 &lt;span class="nt"&gt;-t&lt;/span&gt; myapp:node20 &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Run container:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="nt"&gt;--name&lt;/span&gt; myapp myapp:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;-d&lt;/code&gt;: chạy nền.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;-p&lt;/code&gt;: ánh xạ cổng.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--name&lt;/code&gt;: đặt tên container.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Truyền &lt;code&gt;ENV&lt;/code&gt; khi run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;NODE_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;production myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Kết luận
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Hiểu rõ cách Docker tạo layer sẽ giúp bạn viết Dockerfile tối ưu.&lt;/li&gt;
&lt;li&gt;Sử dụng đúng &lt;code&gt;ENV&lt;/code&gt;, &lt;code&gt;ARG&lt;/code&gt;, &lt;code&gt;CMD&lt;/code&gt;, &lt;code&gt;ENTRYPOINT&lt;/code&gt; giúp container linh hoạt và dễ tái sử dụng.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>docker</category>
    </item>
    <item>
      <title>🚀 Docker Phần 1: Giới Thiệu Container, Image và Dockerfile</title>
      <dc:creator>duytruong09</dc:creator>
      <pubDate>Sun, 29 Jun 2025 15:08:01 +0000</pubDate>
      <link>https://dev.to/duytruong09/docker-phan-1-gioi-thieu-container-image-va-dockerfile-25e1</link>
      <guid>https://dev.to/duytruong09/docker-phan-1-gioi-thieu-container-image-va-dockerfile-25e1</guid>
      <description>&lt;h1&gt;
  
  
  Docker cơ bản: Container, Image và Dockerfile
&lt;/h1&gt;

&lt;p&gt;Docker đang là công cụ không thể thiếu trong hành trình phát triển và triển khai ứng dụng hiện đại. Nếu bạn vẫn còn bỡ ngỡ với các khái niệm như Container, Image hay Dockerfile, bài viết này sẽ giúp bạn hiểu rõ và sử dụng Docker hiệu quả hơn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker là gì?
&lt;/h2&gt;

&lt;p&gt;Docker là nền tảng giúp bạn đóng gói ứng dụng cùng toàn bộ môi trường chạy (thư viện, dependencies...) vào trong một &lt;strong&gt;container&lt;/strong&gt;. Nhờ đó, ứng dụng sẽ chạy nhất quán trên mọi môi trường, từ máy tính cá nhân đến server hay cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Container và Image là gì?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image&lt;/strong&gt; là bản "chụp" tĩnh của ứng dụng và môi trường chạy. Nó giống như một bản thiết kế.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Container&lt;/strong&gt; là thể hiện động của image, tức là một instance đang chạy dựa trên image đó.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bạn có thể tưởng tượng image như file cài đặt, còn container là phần mềm đang chạy trên máy bạn.&lt;/p&gt;

&lt;h2&gt;
  
  
  Container khác gì so với Virtual Machine (VM)?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tiêu chí&lt;/th&gt;
&lt;th&gt;Container&lt;/th&gt;
&lt;th&gt;Virtual Machine (VM)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hệ điều hành&lt;/td&gt;
&lt;td&gt;Chia sẻ kernel với host OS&lt;/td&gt;
&lt;td&gt;Có hệ điều hành riêng&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kích thước&lt;/td&gt;
&lt;td&gt;Nhẹ, vài MB&lt;/td&gt;
&lt;td&gt;Nặng, vài GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tốc độ khởi động&lt;/td&gt;
&lt;td&gt;Nhanh, vài giây&lt;/td&gt;
&lt;td&gt;Chậm, vài phút&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hiệu suất&lt;/td&gt;
&lt;td&gt;Cao, ít overhead&lt;/td&gt;
&lt;td&gt;Thấp hơn do ảo hóa toàn bộ OS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Container giúp bạn tiết kiệm tài nguyên và tăng tốc độ phát triển, đặc biệt phù hợp với microservices và môi trường cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Các thành phần chính của Docker
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Client:&lt;/strong&gt; Giao diện dòng lệnh bạn sử dụng.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Daemon:&lt;/strong&gt; Quản lý container và image chạy ngầm.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker Registry:&lt;/strong&gt; Nơi lưu trữ image (ví dụ Docker Hub).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Dockerfile – “Công thức” tạo Image
&lt;/h2&gt;

&lt;p&gt;Dockerfile là file cấu hình giúp bạn tự động hóa việc tạo image. Một số chỉ thị quan trọng:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;FROM&lt;/code&gt;: Chọn image gốc.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;RUN&lt;/code&gt;: Chạy lệnh trong quá trình build (cài đặt phần mềm...).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CMD&lt;/code&gt;: Lệnh mặc định khi container chạy.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ENTRYPOINT&lt;/code&gt;: Lệnh chính, không dễ bị ghi đè.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;COPY&lt;/code&gt; / &lt;code&gt;ADD&lt;/code&gt;: Sao chép file vào image.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ENV&lt;/code&gt;: Thiết lập biến môi trường.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;EXPOSE&lt;/code&gt;: Khai báo port.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WORKDIR&lt;/code&gt;: Thư mục làm việc.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;VOLUME&lt;/code&gt;: Định nghĩa vùng lưu trữ dữ liệu ngoài container.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;USER&lt;/code&gt;: Chạy lệnh với user cụ thể.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Multi-stage build
&lt;/h3&gt;

&lt;p&gt;Multi-stage build giúp bạn tạo image nhỏ gọn bằng cách tách build và runtime thành nhiều giai đoạn. Ví dụ, bạn có thể build ứng dụng trong một image đầy đủ công cụ, rồi chỉ copy file cần thiết sang image cuối cùng nhẹ hơn.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
