<!DOCTYPE html>
    <html lang="vi" xmlns="http://www.w3.org/1999/xhtml" prefix="og: http://ogp.me/ns#">
    <head>
<title>Cách container hóa ứng dụng Nest.js bằng Docker và Docker Compose</title>
<meta name="description" content="Cách container hóa ứng dụng Nest.js bằng Docker và Docker Compose - Savefile - Tin Tức -...">
<meta name="author" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :.">
<meta name="copyright" content=".: Nguoicodonvn2008.info - Cõi lòng người cô đơn :. [admin@nguoicodonvn2008.info]">
<meta name="robots" content="index, archive, follow, noodp">
<meta name="googlebot" content="index,archive,follow,noodp">
<meta name="msnbot" content="all,index,follow">
<meta name="generator" content="NukeViet v4.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta property="og:title" content="Cách container hóa ứng dụng Nest.js bằng Docker và Docker Compose">
<meta property="og:type" content="website">
<meta property="og:description" content="Savefile - Tin Tức - https&#x3A;&#x002F;&#x002F;www.nguoicodonvn2008.info&#x002F;vi&#x002F;news&#x002F;savefile&#x002F;kien-thuc-may-tinh&#x002F;cach-container-hoa-ung-dung-nest-js-bang-docker-va-docker-compose-7544.html">
<meta property="og:site_name" content=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.">
<meta property="og:url" content="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-container-hoa-ung-dung-nest-js-bang-docker-va-docker-compose-7544.html">
<link rel="shortcut icon" href="https://nguoicodonvn2008.info/favicon.ico">
<link rel="canonical" href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-container-hoa-ung-dung-nest-js-bang-docker-va-docker-compose-7544.html">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/" title="Tin Tức" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/karaoke-dual/" title="Tin Tức - Karaoke Dual" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/nhac-tre/" title="Tin Tức - Nhạc trẻ" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tru-tinh/" title="Tin Tức - Trữ tình" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/nuoc-ngoai/" title="Tin Tức - Nước ngoài" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/remix/" title="Tin Tức - Remix" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tam-su-tinh-yeu/" title="Tin Tức - Tâm sự tình yêu" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tho-suu-tam/" title="Tin Tức - Thơ sưu tầm" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/cuoc-song/" title="Tin Tức - Cuộc sống" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/phan-mem/" title="Tin Tức - Phần mềm" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/kien-thuc-may-tinh/" title="Tin Tức - Kiến thức máy tính" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/hoc-tap/" title="Tin Tức - Học tập" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/tai-lieu/" title="Tin Tức - Tài liệu" type="application/rss+xml">
<link rel="alternate" href="https://nguoicodonvn2008.info/vi/news/rss/de-thi/" title="Tin Tức - Đề thi" type="application/rss+xml">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/assets/css/font-awesome.min.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/style.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/style.non-responsive.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/news.css" type="text/css">
<link rel="preload" as="style" href="https://nguoicodonvn2008.info/themes/default/css/custom.css" type="text/css">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/jquery/jquery.min.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/language/vi.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/global.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/assets/js/site.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/news.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/main.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/custom.js" type="text/javascript">
<link rel="preload" as="script" href="https://nguoicodonvn2008.info/themes/default/js/bootstrap.min.js" type="text/javascript">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/assets/css/font-awesome.min.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/bootstrap.non-responsive.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/style.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/style.non-responsive.css">
<link rel="StyleSheet" href="https://nguoicodonvn2008.info/themes/default/css/news.css">
<link rel="stylesheet" href="https://nguoicodonvn2008.info/themes/default/css/custom.css">
<style type="text/css">
	body{background: #fff;}
</style>
    </head>
    <body>
<div id="print">
	<div id="hd_print">
		<h2 class="pull-left">.&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.</h2>
		<p class="pull-right"><a title=".&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;." href="https://nguoicodonvn2008.info/">https://nguoicodonvn2008.info</a></p>
	</div>
	<div class="clear"></div>
	<hr />
	<div id="content">
		<h1>Cách container hóa ứng dụng Nest.js bằng Docker và Docker Compose</h1>
		<ul class="list-inline">
			<li>Thứ ba - 19/09/2023 09:55</li>
			<li class="hidden-print txtrequired"><em class="fa fa-print">&nbsp;</em><a title="In ra" href="javascript:;" onclick="window.print()">In ra</a></li>
			<li class="hidden-print txtrequired"><em class="fa fa-power-off">&nbsp;</em><a title="Đóng cửa sổ này" href="javascript:;" onclick="window.close()">Đóng cửa sổ này</a></li>
		</ul>
		<div class="clear"></div>
		<div id="hometext">
		</div>
				<div class="imghome">
			<img alt="Cách container hóa ứng dụng Nest.js bằng Docker và Docker Compose" src="https://st.quantrimang.com/photos/image/2023/09/02/docker-repository.jpg" width="460" class="img-thumbnail" />
		</div>
		<div class="clear"></div>
		<div id="bodytext" class="clearfix">
			<p style="text-align: justify;"><strong>Tận dụng Docker và Docker Compose&nbsp;</strong>để triển khai và chạy liền mạch các ứng dụng Nest.js là lựa chọn thông minh. Dưới đây là hướng dẫn chi tiết.</p>

<p style="text-align: justify;"><img alt="Docker" data-i="0" data-src="https://st.quantrimang.com/photos/image/2023/09/02/Docker-Nestjs-7.jpg" data-was-processed="true" height="340" src="https://st.quantrimang.com/photos/image/2023/09/02/Docker-Nestjs-7.jpg" width="650" /></p>

<h2 style="text-align: justify;">Docker và Docker Compose là gì?</h2>

<p style="text-align: justify;">Docker là một nền tảng phát triển nguồn mở cung cấp công nghệ đóng gói được sử dụng trong việc xây dựng và đóng gói các ứng dụng cùng với các phần phụ thuộc của chúng dưới dạng hình ảnh di động.</p>

<p style="text-align: justify;">Những hình ảnh này sau đó được chạy dưới dạng các thành phần thực thi trong môi trường vùng chứa bị cô lập. Việc chạy các ứng dụng trong các vùng chứa này đảm bảo hiệu suất ứng dụng nhất quán trên các hệ thống sản xuất khác nhau mà không có bất kỳ vấn đề tương thích nào.</p>

<p style="text-align: justify;">Mặt khác, Docker Compose là một công cụ được sử dụng cùng với Docker để đơn giản hóa quá trình xác định và quản lý các ứng dụng nhiều container.</p>

<p style="text-align: justify;">Trong khi Docker chủ yếu được sử dụng để quản lý các vùng chứa riêng lẻ, Docker Compose cho phép bạn quản lý cấu hình của nhiều vùng chứa cần chạy dưới dạng một ứng dụng.</p>

<p style="text-align: justify;">Điều này đặc biệt hữu ích khi một ứng dụng bao gồm nhiều dịch vụ cần hoạt động cùng nhau, chẳng hạn như một số dịch vụ API và cơ sở dữ liệu phụ thuộc.</p>

<p style="text-align: justify;">Trước khi đi sâu vào code, bạn cần cài đặt Docker Desktop trên máy cục bộ.</p>

<h2 style="text-align: justify;">Thiết lập dự án Nest.js</h2>

<p style="text-align: justify;">Hướng dẫn này sẽ giới thiệu quy trình thiết lập hai vùng chứa Docker hoạt động liền mạch như một ứng dụng Nest.js duy nhất. Vùng chứa đầu tiên sẽ chứa một phiên bản image Docker của máy chủ web Nest.js, trong khi vùng chứa thứ hai sẽ thực thi image database PostgreSQL của Docker.</p>

<p style="text-align: justify;">Để bắt đầu, cài đặt công cụ dòng lệnh Nest.js:</p>

<pre id="pre0">
<code>npm i -g @nestjs/cli</code></pre>

<p style="text-align: justify;">Bây giờ,tạo một dự án Nest.js mới bằng cách chạy lệnh bên dưới trong terminal của bạn.</p>

<pre id="pre1">
<code>nest new docker-nest-app</code></pre>

<p style="text-align: justify;">Tiếp theo, công cụ CLI sẽ hiển thị một số trình quản lý gói để bạn lựa chọn tạo dự án. Click tùy chọn ưa thích. Ví dụ này dùng npm.</p>

<p style="text-align: justify;">Cuối cùng, bạn có thể điều hướng đến thư mục dự án và khởi động máy chủ phát triển.</p>

<pre id="pre2">
<code>cd docker-nest-app
npm run start</code></pre>

<h3 style="text-align: justify;">Tạo mô đun database</h3>

<p style="text-align: justify;">Đầu tiên, cài đặt những phần phụ thuộc:</p>

<pre id="pre3">
<code>npm install pg typeorm @nestjs/typeorm @nestjs/config</code></pre>

<p style="text-align: justify;">Tiếp theo, trong thư mục gốc của dự án, hãy tạo tệp&nbsp;<strong>.env&nbsp;</strong>và thêm các giá trị cấu hình kết nối cơ sở dữ liệu sau:</p>

<pre id="pre4">
<code>DATABASE_HOST=&quot;db&quot;
DATABASE_PORT=5432
DATABASE_USER=&quot;testUser&quot;
DATABASE_PASSWORD=&quot;mypassword123&quot;</code></pre>

<p style="text-align: justify;">Cuối cùng, hãy tiếp tục và tạo mô-đun cơ sở dữ liệu.</p>

<pre id="pre5">
<code>nest g module database</code></pre>

<p style="text-align: justify;">Bây giờ, sau khi mô-đun được tạo, hãy mở tệp cơ sở dữ liệu&nbsp;<strong>/database.module.ts</strong>&nbsp;và bao gồm code cấu hình cơ sở dữ liệu sau:</p>

<pre id="pre6">
<code>import { Module } from &#039;@nestjs/common&#039;;
import { TypeOrmModule } from &#039;@nestjs/typeorm&#039;;
import { ConfigModule, ConfigService } from &#039;@nestjs/config&#039;; 
@Module({
  imports: &#91;
    ConfigModule.forRoot(), 
    TypeOrmModule.forRootAsync({
      imports: &#91;ConfigModule&#93;, 
      useFactory: async (configService: ConfigService) =&gt; ({
        type: &#039;postgres&#039;,
        host: configService.get&lt;string&gt;(&#039;DATABASE_HOST&#039;), 
        port: configService.get&lt;number&gt;(&#039;DATABASE_PORT&#039;),
        username: configService.get&lt;string&gt;(&#039;DATABASE_USER&#039;),
        password: configService.get&lt;string&gt;(&#039;DATABASE_PASSWORD&#039;),
        synchronize: true,
      }),
      inject: &#91;ConfigService&#93;, 
    }),
  &#93;,
})

export class DatabaseModule {}</code></pre>

<p style="text-align: justify;">Sau khi thiết lập image Docker PostgreSQL bằng cấu hình TypeORM này, ứng dụng Nest.js sẽ thiết lập kết nối với cơ sở dữ liệu.</p>

<h3 style="text-align: justify;">Update file app.module.ts</h3>

<p style="text-align: justify;">Cuối cùng, cập nhật file mô-đun ứng dụng chính để kết hợp cấu hình cho mô-đun cơ sở dữ liệu.</p>

<pre id="pre7">
<code>import { Module } from &#039;@nestjs/common&#039;;
import { ConfigModule } from &#039;@nestjs/config&#039;;
import { AppController } from &#039;./app.controller&#039;;
import { AppService } from &#039;./app.service&#039;;
import { DatabaseModule } from &#039;./database/database.module&#039;;

@Module({
  imports: &#91;
    ConfigModule.forRoot({
      envFilePath: &#039;.env&#039;, 
    }),
    DatabaseModule,
  &#93;,
  controllers: &#91;AppController&#93;,
  providers: &#91;AppService&#93;,
})

export class AppModule {}</code></pre>

<h2 style="text-align: justify;">Thiết lập Dockerfile</h2>

<p style="text-align: justify;">Dockerfile ghi lại bộ hướng dẫn cần thiết mà công cụ Docker cần để tạo image Docker. Nó bao gồm mã nguồn của ứng dụng và tất cả các phần phụ thuộc.</p>

<p style="text-align: justify;">Trong thư mục gốc của dự án, tạo một tệp mới và đặt tên là Dockerfile. Sau đó, thêm các nội dung sau:</p>

<pre id="pre8">
<code>FROM node:16.3.0-alpine3.13
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
CMD &#91; &quot;npm&quot;, &quot;run&quot;, &quot;start:dev&quot; &#93;</code></pre>

<p style="text-align: justify;">Trong đó:</p>

<ul>
	<li style="text-align: justify;"><strong>FROM</strong>&nbsp;chỉ định hình ảnh cơ sở mà Docker nên sử dụng để xây dựng hình ảnh của ứng dụng.</li>
	<li style="text-align: justify;"><strong>WORKDIR</strong>&nbsp;hướng dẫn Docker đặt thư mục /app làm thư mục làm việc cho ứng dụng trong vùng chứa.</li>
	<li style="text-align: justify;"><strong>COPY package*.json./</strong>&nbsp;sao chép tất cả các file có định dạng tên tệp đó từ thư mục hiện tại trong ứng dụng sang thư mục app.</li>
	<li style="text-align: justify;"><strong>RUN npm install</strong>&nbsp;cài đặt các gói và phần phụ thuộc bắt buộc mà ứng dụng yêu cầu trong vùng chứa Docker.</li>
	<li style="text-align: justify;"><strong>COPY…</strong>&nbsp;hướng dẫn Docker sao chép tất cả các tệp mã nguồn của ứng dụng từ thư mục hiện tại vào thư mục /app.</li>
	<li style="text-align: justify;"><strong>RUN npm run build&nbsp;</strong>xây dựng ứng dụng Nest.js trước khi tạo Docker image. Nó biên dịch mã TypeScript thành JavaScript và lưu trữ kết quả đầu ra của quá trình xây dựng trong một thư mục dist.</li>
	<li style="text-align: justify;"><strong>CMD</strong>&nbsp;xác định lệnh chạy khi container khởi động. Trong trường hợp này, chúng ta sẽ chạy lệnh npm run start:dev để khởi động máy chủ ở chế độ phát triển.</li>
</ul>

<p style="text-align: justify;">Cấu hình này cho phép ứng dụng chủ động theo dõi các thay đổi của code. Khi các thay đổi được phát hiện, vùng chứa sẽ tự động được xây dựng lại.</p>

<h2 style="text-align: justify;">Tạo file Docker Compose</h2>

<p style="text-align: justify;">Trong thư mục gốc của thư mục dự án, tạo tệp&nbsp;<strong>docker-compose.yml</strong>&nbsp;mới và thêm nội dung sau:</p>

<pre id="pre9">
<code>version: &#039;3.9&#039;

services:
  server:
    build: .
    ports:
      - &#039;3000:3000&#039;
    depends_on:
      - db
  db:
    image: &#039;postgres&#039;
    ports:
      - &#039;5432:5432&#039;
    environment:
      POSTGRES_PASSWORD: &#039;mypassword123&#039;
      POSTGRES_USER: &#039;testUser&#039;
    volumes:
      - data:/var/lib/postgresql/data

volumes:
  data:</code></pre>

<p style="text-align: justify;">Docker Compose sẽ sử dụng các hướng dẫn này để xây dựng và chạy hai hình ảnh trong hai vùng chứa Docker. Vùng chứa đầu tiên, máy chủ, sẽ lưu trữ hình ảnh của ứng dụng; chạy trên cổng 3000.</p>

<p style="text-align: justify;">Vùng chứa thứ hai sẽ lưu trữ hình ảnh cơ sở dữ liệu PostgreSQL. Bạn không cần chỉ định Dockerfile cho hình ảnh này—Docker sẽ sử dụng hình ảnh PostgreSQL có sẵn trên sổ đăng ký hình ảnh của Docker để xây dựng nó.</p>

<h2 style="text-align: justify;">Khởi động Docker Container</h2>

<p style="text-align: justify;">Cuối cùng tiếp tục xây dựng các image và khởi động container bằng cách chạy lệnh sau:</p>

<pre id="pre10">
<code>docker compose up</code></pre>

<p style="text-align: justify;">Sau khi quá trình này hoàn tất thành công, bạn sẽ thấy thông tin log tương tự trên terminal.</p>

<p style="text-align: justify;"><img alt="" data-i="1" data-src="https://st.quantrimang.com/photos/image/2023/09/02/Docker-container-hoa.jpg" data-was-processed="true" height="325" src="https://st.quantrimang.com/photos/image/2023/09/02/Docker-container-hoa.jpg" width="650" /></p>

<p style="text-align: justify;">Bây giờ, khi cả máy chủ web và vùng chứa cơ sở dữ liệu của bạn đều chạy, hãy tiếp tục và bổ sung thêm nhiều chức năng hơn cho ứng dụng Nest.js của bạn. Chẳng hạn, bạn có thể xây dựng API CRUD REST của Nest.js.</p>

<h2 style="text-align: justify;">Đẩy image Docker vào Docker Hub</h2>

<p style="text-align: justify;">Hãy làm theo các bước sau:</p>

<p style="text-align: justify;">1. Tới Docker Hub, đăng ký và đăng nhập trang tổng quan tài khoản.</p>

<p style="text-align: justify;">2. Click nút<strong>&nbsp;Create repository</strong>, điền tên của&nbsp;<strong>repository</strong>, xác định khả năng hiển thị nó bằng cách chọn&nbsp;<strong>Public</strong>&nbsp;hoặc&nbsp;<strong>Private</strong>, rồi click<strong>&nbsp;Create</strong>.</p>

<p style="text-align: justify;"><img alt="Tạo repository" data-i="2" data-src="https://st.quantrimang.com/photos/image/2023/09/02/docker-repository.jpg" data-was-processed="true" height="366" src="https://st.quantrimang.com/photos/image/2023/09/02/docker-repository.jpg" width="650" /></p>

<p style="text-align: justify;">3. Bây giờ, bạn cần đăng nhập vào tài khoản thông qua thiết bị đầu cuối bằng cách chạy lệnh bên dưới, sau đó cung cấp tên người dùng và mật khẩu Docker.</p>

<pre id="pre11">
<code>docker login</code></pre>

<p style="text-align: justify;">4. Tiếp theo, update tên image của Docker để khớp với định dạng này:&nbsp;<strong>&lt;your docker username&gt;/&lt;repo name&gt;</strong>&nbsp;bằng lệnh:</p>

<pre id="pre12">
<code>docker tag &lt;image&gt; &lt;your docker username&gt;/&lt;repo name&gt;</code></pre>

<p style="text-align: justify;">5. Cuối cùng, đẩy image Docker.</p>

<pre id="pre13">
<code>docker push &lt;image&gt;/&lt;repo name&gt;</code></pre>

<p style="text-align: justify;">Công nghệ container hóa của Docker cho phép bạn đóng gói một ứng dụng cùng với tất cả các phần phụ thuộc của nó vào image Docker. Sau đó, những hình ảnh này có thể chạy trơn tru trong các vùng chứa ở các môi trường sản xuất và phát triển khác nhau mà không gặp bất kỳ sự cố nào.</p>
		</div>
				<div id="author">
						<p>
				<strong>Nguồn tin:</strong>
				Quantrimang.com:
			</p>
		</div>
	</div>
	<div id="footer" class="clearfix">
		<div id="url">
			<strong>URL của bản tin này: </strong><a href="https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-container-hoa-ung-dung-nest-js-bang-docker-va-docker-compose-7544.html" title="Cách container hóa ứng dụng Nest.js bằng Docker và Docker Compose">https://www.nguoicodonvn2008.info/vi/news/savefile/kien-thuc-may-tinh/cach-container-hoa-ung-dung-nest-js-bang-docker-va-docker-compose-7544.html</a>

		</div>
		<div class="clear"></div>
		<div class="copyright">
			&copy; .&#x3A; Nguoicodonvn2008.info - Cõi lòng người cô đơn &#x3A;.
		</div>
		<div id="contact">
			<a href="mailto:admin@nguoicodonvn2008.info">admin@nguoicodonvn2008.info</a>
		</div>
	</div>
</div>
        <div id="timeoutsess" class="chromeframe">
            Bạn đã không sử dụng Site, <a onclick="timeoutsesscancel();" href="https://nguoicodonvn2008.info/#">Bấm vào đây để duy trì trạng thái đăng nhập</a>. Thời gian chờ: <span id="secField"> 60 </span> giây
        </div>
        <div id="openidResult" class="nv-alert" style="display:none"></div>
        <div id="openidBt" data-result="" data-redirect=""></div>
		</script>
		<div class="car-top">
  <span><img src="https://nguoicodonvn2008.info/themes/default/images/car.png" alt=""></span>
</div>
<script src="https://nguoicodonvn2008.info/assets/js/jquery/jquery.min.js"></script>
<script>var nv_base_siteurl="/",nv_lang_data="vi",nv_lang_interface="vi",nv_name_variable="nv",nv_fc_variable="op",nv_lang_variable="language",nv_module_name="news",nv_func_name="savefile",nv_is_user=0, nv_my_ofs=-4,nv_my_abbr="EDT",nv_cookie_prefix="nv4c_e856T",nv_check_pass_mstime=1738000,nv_area_admin=0,nv_safemode=0,theme_responsive=0,nv_recaptcha_ver=2,nv_recaptcha_sitekey="",nv_recaptcha_type="image",XSSsanitize=1;</script>
<script src="https://nguoicodonvn2008.info/assets/js/language/vi.js"></script>
<script src="https://nguoicodonvn2008.info/assets/js/DOMPurify/purify3.js"></script>
<script src="https://nguoicodonvn2008.info/assets/js/global.js"></script>
<script src="https://nguoicodonvn2008.info/assets/js/site.js"></script>
<script src="https://nguoicodonvn2008.info/themes/default/js/news.js"></script>
<script src="https://nguoicodonvn2008.info/themes/default/js/main.js"></script>
<script src="https://nguoicodonvn2008.info/themes/default/js/custom.js"></script>
<script type="application/ld+json">
        {
            "@context": "https://schema.org",
            "@type": "Organization",
            "url": "https://nguoicodonvn2008.info",
            "logo": "https://nguoicodonvn2008.info/uploads/angel.gif"
        }
        </script>
<script src="https://nguoicodonvn2008.info/themes/default/js/bootstrap.min.js"></script>
<script type="text/javascript">
var $scrolltop = $('.car-top');
$scrolltop.on('click', function () {
    $('html,body').animate({
        scrollTop: 0
    }, 800);
    $(this).addClass("car-run");
    setTimeout(function(){ $scrolltop.removeClass('car-run');}, 1000);
    return false;
});
$(window).on('scroll', function ()
{ 
    if($(window).scrollTop() >= 200)
    {
        $scrolltop.addClass("show");
        $scrolltop.addClass("car-down");
    }
    else
    {
       $scrolltop.removeClass("show");
       setTimeout(function(){ $scrolltop.removeClass('car-down');}, 300);
    }
});
</script>
</body>
</html>