Cách tạo ứng dụng Node.js với Docker trên Ubuntu 20.04
Nền tảng Docker cho phép các nhà phát triển đóng gói và chạy các ứng dụng dưới dạng container . Vùng chứa là một quá trình biệt lập chạy trên hệ điều hành dùng chung, cung cấp một giải pháp thay thế trọng lượng nhẹ hơn cho các máy ảo. Mặc dù các container không phải là mới, nhưng chúng cung cấp các lợi ích - bao gồm cách ly quy trình và tiêu chuẩn hóa môi trường - ngày càng trở nên quan trọng khi nhiều nhà phát triển sử dụng kiến trúc ứng dụng phân tán.Khi xây dựng và mở rộng một ứng dụng bằng Docker, điểm bắt đầu thường là tạo một hình ảnh cho ứng dụng của bạn, sau đó bạn có thể chạy trong một containers . Hình ảnh bao gồm mã ứng dụng, thư viện, file cấu hình, biến môi trường và thời gian chạy. Việc sử dụng hình ảnh đảm bảo môi trường trong containers của bạn được chuẩn hóa và chỉ chứa những gì cần thiết để xây dựng và chạy ứng dụng của bạn.
Trong hướng dẫn này, bạn sẽ tạo một hình ảnh ứng dụng cho một trang web tĩnh sử dụng Express framework và Bootstrap . Sau đó, bạn sẽ tạo một containers bằng cách sử dụng hình ảnh đó và đẩy nó vào Docker Hub để sử dụng trong tương lai. Cuối cùng, bạn sẽ kéo hình ảnh được lưu trữ từ repository Docker Hub của bạn và xây dựng một containers khác, thể hiện cách bạn có thể tạo lại và mở rộng ứng dụng của bạn .
Yêu cầu
Để làm theo hướng dẫn này, bạn cần :
- Một server Ubuntu 20.04, được cài đặt theo hướng dẫn Cài đặt Server Ban đầu này.
- Docker được cài đặt trên server của bạn, làm theo các Bước 1 và 2 của Cách cài đặt và sử dụng Docker trên Ubuntu 20.04 .
- Đã cài đặt Node.js và npm, làm theo các hướng dẫn sau về cài đặt với PPA do NodeSource quản lý .
- Một account Docker Hub. Để biết tổng quan về cách cài đặt , hãy tham khảo phần giới thiệu này về cách bắt đầu với Docker Hub.
Bước 1 - Cài đặt phụ thuộc ứng dụng của bạn
Để tạo hình ảnh, trước tiên bạn cần tạo các file ứng dụng, sau đó bạn có thể sao chép file này vào containers của bạn . Các file này sẽ bao gồm nội dung tĩnh, mã và các phần phụ thuộc của ứng dụng của bạn.
 Đầu tiên, tạo một folder  cho dự án của bạn trong folder  chính của  user  không phải root của bạn.  Ta  sẽ gọi node_project , nhưng bạn nên thay thế nó bằng một cái gì đó khác:
- mkdir node_project 
Điều hướng đến folder này:
- cd node_project 
Đây sẽ là folder root của dự án.
 Tiếp theo, tạo file  package.json với các phụ thuộc dự án của bạn và thông tin nhận dạng khác. Mở file  bằng nano  hoặc editor bạn quen dùng :
- nano package.json 
Thêm thông tin sau về dự án, bao gồm tên, tác giả, giấy phép, điểm vào và các phụ thuộc. Đảm bảo thay thế thông tin tác giả bằng tên của chính bạn và chi tiết liên hệ:
{   "name": "nodejs-image-demo",   "version": "1.0.0",   "description": "nodejs image demo",   "author": "Sammy the Shark <sammy@example.com>",   "license": "MIT",   "main": "app.js",   "keywords": [     "nodejs",     "bootstrap",     "express"   ],   "dependencies": {     "express": "^4.16.4"   } } Tệp này bao gồm tên dự án, tác giả và giấy phép mà nó đang được chia sẻ. Npm khuyên bạn nên đặt tên dự án của bạn ngắn gọn và mang tính mô tả, đồng thời tránh trùng lặp trong register npm . Ta đã liệt kê giấy phép MIT trong trường giấy phép, cho phép sử dụng và phân phối miễn phí mã ứng dụng.
Ngoài ra, file chỉ định:
-  "main": Điểm nhập cho ứng dụng,app.jsBạn sẽ tạo file này tiếp theo.
-  "dependencies": Các phụ thuộc của dự án - trong trường hợp này là Express 4.16.4 trở lên.
 Mặc dù file  này không liệt kê một repository , bạn có thể thêm một repository   theo  các hướng dẫn sau về cách thêm repository  vào file  package.json của bạn . Đây là một bổ sung tốt nếu bạn đang tạo version  cho ứng dụng  của bạn .
Lưu file khi bạn thực hiện xong các thay đổi.
Để cài đặt phần phụ thuộc dự án của bạn, hãy chạy lệnh sau:
- npm install 
Thao tác này sẽ cài đặt các gói bạn đã liệt kê trong file  package.json trong folder  dự án của bạn.
Bây giờ ta có thể chuyển sang xây dựng các file ứng dụng.
Bước 2 - Tạo file ứng dụng
  Ta  sẽ tạo một trang web cung cấp cho  user  thông tin về cá mập. Ứng dụng của  ta  sẽ có một entrypoint chính, app.js và một folder  views sẽ bao gồm các tài sản tĩnh của dự án. Trang đích, index.html , sẽ cung cấp cho  user  một số thông tin sơ bộ và liên kết đến một trang có thông tin chi tiết hơn về cá mập, sharks.html . Trong folder  views ,  ta  sẽ tạo cả trang đích và sharks.html .
 Đầu tiên, mở app.js trong folder  chính của dự án để xác định các tuyến của dự án:
- nano app.js 
Phần đầu tiên của file sẽ tạo ứng dụng Express và các đối tượng Bộ định tuyến, đồng thời xác định folder cơ sở và cổng dưới dạng hằng số:
const express = require('express'); const app = express(); const router = express.Router();  const path = __dirname + '/views/'; const port = 8080; Các require chức năng tải các express module , mà  ta  sau đó sử dụng để tạo ra các app và router các đối tượng. Đối tượng router sẽ thực hiện chức năng định tuyến của ứng dụng và khi  ta  xác định các tuyến phương thức HTTP,  ta  sẽ thêm chúng vào đối tượng này để xác định cách ứng dụng của  ta  sẽ xử lý các yêu cầu.
 Phần này của file  cũng đặt một số hằng số, path và port :
-  path: Xác định folder cơ sở, sẽ là folder con của cácviewstrong folder dự án hiện tại.
-  port: Yêu cầu ứng dụng lắng nghe và liên kết với cổng8080.
 Tiếp theo, đặt các tuyến cho ứng dụng bằng đối tượng router :
...  router.use(function (req,res,next) {   console.log('/' + req.method);   next(); });  router.get('/', function(req,res){   res.sendFile(path + 'index.html'); });  router.get('/sharks', function(req,res){   res.sendFile(path + 'sharks.html'); }); Hàm router.use tải một chức năng phần mềm trung gian sẽ ghi lại các yêu cầu của bộ định tuyến và chuyển chúng đến các tuyến của ứng dụng. Các hàm này được định nghĩa trong các hàm tiếp theo, trong đó chỉ định rằng yêu cầu GET đối với URL của dự án cơ sở sẽ trả về trang index.html , trong khi yêu cầu GET đối với tuyến đường /sharks sharks.html sẽ trả về sharks.html .
 Cuối cùng, gắn phần mềm trung gian của router và nội dung tĩnh của ứng dụng và yêu cầu ứng dụng lắng nghe trên cổng 8080 :
...  app.use(express.static(path)); app.use('/', router);  app.listen(port, function () {   console.log('Example app listening on port 8080!') }) app.js đã hoàn thành sẽ giống như sau:
const express = require('express'); const app = express(); const router = express.Router();  const path = __dirname + '/views/'; const port = 8080;  router.use(function (req,res,next) {   console.log('/' + req.method);   next(); });  router.get('/', function(req,res){   res.sendFile(path + 'index.html'); });  router.get('/sharks', function(req,res){   res.sendFile(path + 'sharks.html'); });  app.use(express.static(path)); app.use('/', router);  app.listen(port, function () {   console.log('Example app listening on port 8080!') }) Lưu file khi bạn hoàn tất.
 Tiếp theo, hãy thêm một số nội dung tĩnh vào ứng dụng. Bắt đầu bằng cách tạo folder  views :
- mkdir views 
Mở file  trang đích, index.html :
- nano views/index.html 
Thêm mã sau vào file , mã này sẽ nhập Boostrap và tạo thành phần jumbotron với liên kết đến trang thông tin chi tiết hơn về sharks.html :
<!DOCTYPE html> <html lang="en">  <head>     <title>About Sharks</title>     <meta charset="utf-8">     <meta name="viewport" content="width=device-width, initial-scale=1">     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">     <link href="css/styles.css" rel="stylesheet">     <link href="https://fonts.googleapis.com/css?family=Merriweather:400,700" rel="stylesheet" type="text/css"> </head>  <body>     <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md">         <div class="container">             <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span>             </button> <a class="navbar-brand" href="#">Everything Sharks</a>             <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">                 <ul class="nav navbar-nav mr-auto">                     <li class="active nav-item"><a href="/" class="nav-link">Home</a>                     </li>                     <li class="nav-item"><a href="/sharks" class="nav-link">Sharks</a>                     </li>                 </ul>             </div>         </div>     </nav>     <div class="jumbotron">         <div class="container">             <h1>Want to Learn About Sharks?</h1>             <p>Are you ready to learn about sharks?</p>             <br>             <p><a class="btn btn-primary btn-lg" href="/sharks" role="button">Get Shark Info</a>             </p>         </div>     </div>     <div class="container">         <div class="row">             <div class="col-lg-6">                 <h3>Not all sharks are alike</h3>                 <p>Though some are dangerous, sharks generally do not attack humans. Out of the 500 species known to researchers, only 30 have been known to attack humans.                 </p>             </div>             <div class="col-lg-6">                 <h3>Sharks are ancient</h3>                 <p>There is evidence to suggest that sharks lived up to 400 million years ago.                 </p>             </div>         </div>     </div> </body>  </html> Thanh  chuyển  cấp cao nhất ở đây cho phép  user  chuyển đổi giữa Trang chủ và Trang cá mập . Trong thành phần con navbar-nav ,  ta  đang sử dụng lớp active của Bootstrap để chỉ ra trang hiện tại cho  user .  Ta  cũng đã chỉ định các tuyến đến các trang tĩnh  của bạn , phù hợp với các tuyến mà  ta  đã xác định trong app.js :
... <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">    <ul class="nav navbar-nav mr-auto">       <li class="active nav-item"><a href="/" class="nav-link">Home</a>       </li>       <li class="nav-item"><a href="/sharks" class="nav-link">Sharks</a>       </li>    </ul> </div> ... Ngoài ra, ta đã tạo một liên kết đến trang thông tin về cá mập của ta trong nút jumbotron của ta :
... <div class="jumbotron">    <div class="container">       <h1>Want to Learn About Sharks?</h1>       <p>Are you ready to learn about sharks?</p>       <br>       <p><a class="btn btn-primary btn-lg" href="/sharks" role="button">Get Shark Info</a>       </p>    </div> </div> ... Ngoài ra còn có một liên kết đến một biểu định kiểu tùy chỉnh trong tiêu đề:
... <link href="css/styles.css" rel="stylesheet"> ... Ta sẽ tạo style sheet này ở cuối bước này.
Lưu file khi bạn hoàn tất.
 Với trang đích của ứng dụng tại chỗ,  ta  có thể tạo trang thông tin về cá mập, sharks.html , trang này sẽ cung cấp cho  user  quan tâm thêm thông tin về cá mập.
Mở tập tin:
- nano views/sharks.html 
Thêm mã sau, nhập Bootstrap và biểu định kiểu tùy chỉnh và cung cấp cho user thông tin chi tiết về một số cá mập nhất định:
<!DOCTYPE html> <html lang="en">  <head>     <title>About Sharks</title>     <meta charset="utf-8">     <meta name="viewport" content="width=device-width, initial-scale=1">     <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">     <link href="css/styles.css" rel="stylesheet">     <link href="https://fonts.googleapis.com/css?family=Merriweather:400,700" rel="stylesheet" type="text/css"> </head> <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md">     <div class="container">         <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span>         </button> <a class="navbar-brand" href="/">Everything Sharks</a>         <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">             <ul class="nav navbar-nav mr-auto">                 <li class="nav-item"><a href="/" class="nav-link">Home</a>                 </li>                 <li class="active nav-item"><a href="/sharks" class="nav-link">Sharks</a>                 </li>             </ul>         </div>     </div> </nav> <div class="jumbotron text-center">     <h1>Shark Info</h1> </div> <div class="container">     <div class="row">         <div class="col-lg-6">             <p>                 <div class="caption">Some sharks are known to be dangerous to humans, though many more are not. The sawshark, for example, is not considered a threat to humans.                 </div>                 <img src="https://assets.digitalocean.com/articles/docker_node_image/sawshark.jpg" alt="Sawshark">             </p>         </div>         <div class="col-lg-6">             <p>                 <div class="caption">Other sharks are known to be friendly and welcoming!</div>                 <img src="https://assets.digitalocean.com/articles/docker_node_image/sammy.png" alt="Sammy the Shark">             </p>         </div>     </div> </div>  </html>  Lưu ý  trong file  này,  ta  lại sử dụng lớp hiện active để chỉ ra trang hiện tại.
Lưu file khi bạn hoàn tất.
 Cuối cùng, tạo biểu định kiểu CSS tùy chỉnh mà bạn đã liên kết đến trong index.html và sharks.html bằng cách tạo folder  css trong folder  views :
- mkdir views/css 
Mở biểu định kiểu:
- nano views/css/styles.css 
Thêm mã sau, mã này sẽ đặt màu và phông chữ mong muốn cho các trang của ta :
.navbar {     margin-bottom: 0; }  body {     background: #020A1B;     color: #ffffff;     font-family: 'Merriweather', sans-serif; }  h1, h2 {     font-weight: bold; }  p {     font-size: 16px;     color: #ffffff; }  .jumbotron {     background: #0048CD;     color: white;     text-align: center; }  .jumbotron p {     color: white;     font-size: 26px; }  .btn-primary {     color: #fff;     text-color: #000000;     border-color: white;     margin-bottom: 5px; }  img, video, audio {     margin-top: 20px;     max-width: 80%; }  div.caption: {     float: left;     clear: both; } Ngoài việc đặt phông chữ và màu sắc, file  này cũng giới hạn kích thước của hình ảnh bằng cách chỉ định max-width là 80%. Điều này sẽ ngăn chúng chiếm nhiều chỗ hơn  ta  muốn trên trang.
Lưu file khi bạn hoàn tất.
Với các file ứng dụng được cài đặt sẵn và các phụ thuộc dự án được cài đặt, bạn đã sẵn sàng khởi động ứng dụng.
 Nếu bạn đã làm theo hướng dẫn  cài đặt   server  ban đầu trong  yêu cầu , bạn sẽ có một firewall  hoạt động chỉ cho phép lưu lượng SSH. Để cho phép giao thông đến cổng 8080 chạy:
- sudo ufw allow 8080 
Để khởi động ứng dụng, hãy đảm bảo bạn đang ở trong folder root của dự án:
- cd ~/node_project 
Khởi động ứng dụng với node app.js :
- node app.js 
Điều hướng trình duyệt của bạn đến http:// your_server_ip :8080 . Bạn sẽ tải trang đích sau: 
Nhấp vào nút Nhận thông tin cá mập . Trang thông tin sau sẽ tải:
  Đến đây bạn  đã có một ứng dụng đang chạy.  Khi đã sẵn sàng , hãy thoát khỏi  server   bằng lệnh  CTRL+C Bây giờ  ta  có thể chuyển sang tạo Dockerfile sẽ cho phép  ta  tạo lại và mở rộng ứng dụng này như mong muốn.
Bước 3 - Viết Dockerfile
Docker file chỉ định những gì sẽ được đưa vào containers ứng dụng của bạn khi nó được thực thi. Sử dụng Dockerfile cho phép bạn xác định môi trường containers của bạn và tránh sự khác biệt với các version phụ thuộc hoặc thời gian chạy.
Tuân theo các nguyên tắc này về xây dựng các containers được tối ưu hóa , ta sẽ làm cho hình ảnh của bạn hiệu quả nhất có thể bằng cách giảm thiểu số lượng các lớp hình ảnh và hạn chế chức năng của hình ảnh cho một mục đích duy nhất - tạo lại các file ứng dụng và nội dung tĩnh của ta .
Trong folder root của dự án của bạn, hãy tạo Dockerfile:
- nano Dockerfile 
Docker image được tạo bằng cách sử dụng liên tiếp các hình ảnh nhiều lớp xây dựng trên nhau. Bước đầu tiên của ta sẽ là thêm hình ảnh cơ sở cho ứng dụng của ta sẽ tạo thành điểm bắt đầu của việc xây dựng ứng dụng.
 Hãy sử dụng node: 10-alpine image , vì tại thời điểm viết bài, đây là phiên bản LTS được đề xuất của Node.js. Hình ảnh alpine có nguồn root  từ dự án Alpine Linux và sẽ giúp  ta  giảm kích thước hình ảnh. Để biết thêm thông tin về việc liệu hình ảnh alpine có phải là lựa chọn phù hợp cho dự án của bạn hay không, vui lòng xem lại toàn bộ cuộc thảo luận trong phần Biến thể hình ảnh của trang  Docker image  Hub Node .
 Thêm lệnh FROM sau để đặt hình ảnh cơ sở của ứng dụng:
FROM node:10-alpine Hình ảnh này bao gồm Node.js và npm. Mỗi Dockerfile phải bắt đầu bằng một lệnh FROM .
Theo mặc định, Docker image Node bao gồm user không phải nút root mà bạn có thể sử dụng để tránh chạy containers ứng dụng của bạn với quyền gốc . Phương pháp bảo mật được khuyến khích là tránh chạy các containers dưới quyền root và hạn chế các khả năng trong containers chỉ những khả năng cần thiết để chạy các quy trình của nó. Do đó, ta sẽ sử dụng folder chính của user nút làm folder làm việc cho ứng dụng của ta và đặt họ làm user của ta bên trong containers . Để biết thêm thông tin về các phương pháp hay nhất khi làm việc với Docker image Node, hãy xem hướng dẫn các phương pháp hay nhất này.
 Để tinh chỉnh các quyền trên mã ứng dụng của  ta  trong containers , hãy tạo folder  con node_modules trong /home/node cùng với folder  app . Việc tạo các folder  này sẽ  đảm bảo  chúng có các quyền mà  ta  muốn, điều này sẽ rất quan trọng khi  ta  tạo các module  nút local  trong containers  với npm install . Ngoài việc tạo các folder  này,  ta  sẽ đặt quyền sở hữu chúng cho  user  nút của  ta :
... RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app Để biết thêm thông tin về tiện ích hợp nhất các hướng dẫn RUN , hãy đọc qua phần thảo luận này về cách quản lý các lớp containers  .
 Tiếp theo, đặt folder  làm việc của ứng dụng thành /home/node/app :
... WORKDIR /home/node/app Nếu WORKDIR không được đặt, Docker sẽ tạo một WORKDIR theo mặc định, vì vậy bạn nên đặt nó một cách rõ ràng.
 Tiếp theo, sao chép file  package.json và package-lock.json (dành cho npm 5+):
... COPY package*.json ./ Việc thêm hướng dẫn COPY này trước khi chạy npm install hoặc sao chép mã ứng dụng cho phép  ta  tận dụng cơ chế bộ nhớ đệm của Docker. Ở mỗi giai đoạn trong bản dựng, Docker sẽ kiểm tra xem nó có một lớp được lưu trong bộ nhớ cache cho lệnh cụ thể đó hay không. Nếu  ta  thay đổi package.json , lớp này sẽ được xây dựng lại, nhưng nếu  ta  không thay đổi, hướng dẫn này sẽ cho phép Docker sử dụng lớp hình ảnh hiện có và bỏ qua việc cài đặt lại module  nút của  ta .
 Để  đảm bảo  tất cả các file  ứng dụng thuộc sở hữu của  user  không phải nút root , bao gồm cả nội dung của folder  node_modules , hãy chuyển  user  sang nút trước khi chạy npm install :
... USER node Sau khi sao chép các phụ thuộc của dự án và chuyển đổi  user  của  ta ,  ta  có thể chạy npm install :
... RUN npm install Tiếp theo, sao chép mã ứng dụng của bạn với các quyền thích hợp vào folder ứng dụng trên containers :
... COPY --chown=node:node . . Điều này sẽ đảm bảo các file ứng dụng được sở hữu bởi user không phải nút root .
 Cuối cùng, để lộ cổng 8080 trên  container  và khởi động ứng dụng:
... EXPOSE 8080  CMD [ "node", "app.js" ] EXPOSE không xuất bản cổng, nhưng thay vào đó hoạt động như một cách ghi lại các cổng nào trên containers  sẽ được xuất bản trong thời gian chạy. CMD chạy lệnh để khởi động ứng dụng - trong trường hợp này là node app.js  Lưu ý  chỉ nên có một lệnh CMD trong mỗi Dockerfile. Nếu bạn bao gồm nhiều hơn một, chỉ cái cuối cùng mới có hiệu lực.
Có nhiều điều bạn có thể làm với Dockerfile. Để có danh sách hướng dẫn đầy đủ, vui lòng tham khảo tài liệu tham khảo Dockerfile của Docker.
Dockerfile hoàn chỉnh trông như thế này:
 FROM node:10-alpine  RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app  WORKDIR /home/node/app  COPY package*.json ./  USER node  RUN npm install  COPY --chown=node:node . .  EXPOSE 8080  CMD [ "node", "app.js" ] Lưu file khi bạn hoàn tất chỉnh sửa.
 Trước khi xây dựng hình ảnh ứng dụng, hãy thêm tệp .dockerignore . Hoạt động theo cách tương tự với tệp .gitignore , .dockerignore chỉ định file  và folder  nào trong folder  dự án của bạn không được sao chép vào containers  của bạn.
 Mở file  .dockerignore :
- nano .dockerignore 
Bên trong file , hãy thêm module  nút local , log  npm, file  .dockerignore và file  .dockerignore :
node_modules npm-debug.log Dockerfile .dockerignore Nếu bạn đang làm việc với Git thì bạn  cũng cần  thêm .git và file  .gitignore .
Lưu file khi bạn hoàn tất.
  Đến đây bạn  đã sẵn sàng để xây dựng hình ảnh ứng dụng bằng lệnh docker build . Sử dụng cờ -t với bản docker build sẽ cho phép bạn gắn thẻ hình ảnh bằng một cái tên dễ nhớ. Bởi vì  ta  sẽ đẩy hình ảnh vào Docker Hub, hãy bao gồm tên  user  Docker Hub của  ta  trong thẻ.  Ta  sẽ gắn thẻ hình ảnh là nodejs-image-demo , nhưng hãy thay thế nó bằng một cái tên mà bạn chọn. Hãy nhớ thay your_dockerhub_username bằng tên  user  Docker Hub  của bạn :
- sudo docker build -t your_dockerhub_username/nodejs-image-demo . 
Các . chỉ định rằng ngữ cảnh xây dựng là folder  hiện tại.
Sẽ mất một hoặc hai phút để xây dựng hình ảnh. Sau khi hoàn tất, hãy kiểm tra hình ảnh của bạn:
- sudo docker images 
Bạn sẽ nhận được kết quả sau:
OutputREPOSITORY                                         TAG                 IMAGE ID            CREATED             SIZE your_dockerhub_username/nodejs-image-demo          latest              1c723fb2ef12        8 seconds ago       73MB node                                               10-alpine           f09e7c96b6de        3 weeks ago        70.7MB Bây giờ có thể tạo một containers  với hình ảnh này bằng cách sử dụng docker run .  Ta  sẽ bao gồm ba cờ với lệnh này:
-  -p: Điều này xuất bản cổng trên containers và ánh xạ nó tới một cổng trên server của ta . Ta sẽ sử dụng cổng80trên server lưu trữ, nhưng bạn nên sửa đổi điều này nếu cần nếu bạn có một quy trình khác đang chạy trên cổng đó. Để biết thêm thông tin về cách thức hoạt động, hãy xem lại cuộc thảo luận này trong tài liệu Docker về cổng kết nối .
-  -d: Thao tác này chạy containers trong nền.
-  --name: Điều này cho phép ta đặt cho containers một cái tên dễ nhớ.
Chạy lệnh sau để tạo containers :
- sudo docker run --name nodejs-image-demo -p 80:8080 -d your_dockerhub_username/nodejs-image-demo  
Khi containers  của bạn đã bắt đầu và đang chạy, bạn có thể kiểm tra danh sách các containers  đang chạy  của bạn  bằng docker ps :
- sudo docker ps 
Bạn sẽ nhận được kết quả sau:
OutputCONTAINER ID        IMAGE                                                   COMMAND             CREATED             STATUS              PORTS                  NAMES e50ad27074a7        your_dockerhub_username/nodejs-image-demo               "node app.js"       8 seconds ago       Up 7 seconds        0.0.0.0:80->8080/tcp   nodejs-image-demo Với containers của bạn đang chạy, bây giờ bạn có thể truy cập ứng dụng của bạn bằng cách chuyển trình duyệt của bạn đến IP server của bạn mà không cần cổng:
http://your_server_ip Trang đích ứng dụng của bạn sẽ reload .
Đến đây bạn đã tạo một hình ảnh cho ứng dụng của bạn , bạn có thể đẩy nó lên Docker Hub để sử dụng trong tương lai.
Bước 4 - Sử dụng repository để làm việc với hình ảnh
Bằng cách đẩy hình ảnh ứng dụng của bạn vào một register như Docker Hub, bạn làm cho nó có sẵn để sử dụng tiếp theo khi bạn xây dựng và mở rộng các containers của bạn . Ta sẽ chứng minh cách hoạt động của điều này bằng cách đẩy hình ảnh ứng dụng vào repository và sau đó sử dụng hình ảnh để tạo lại containers của ta .
Bước đầu tiên để đẩy hình ảnh là đăng nhập vào account Docker Hub bạn đã tạo trong yêu cầu :
- sudo docker login -u your_dockerhub_username  
Khi  được yêu cầu , hãy nhập password  account  Docker Hub của bạn. Đăng nhập theo cách này sẽ tạo file  ~/.docker/config.json trong folder  chính của  user  với thông tin đăng nhập Docker Hub của bạn.
  Như vậy,  bạn có thể đẩy hình ảnh ứng dụng lên Docker Hub bằng thẻ bạn đã tạo trước đó, your_dockerhub_username / nodejs-image-demo :
- sudo docker push your_dockerhub_username/nodejs-image-demo 
Hãy kiểm tra tiện ích của register hình ảnh bằng cách phá hủy containers và hình ảnh ứng dụng hiện tại của ta và xây dựng lại chúng bằng hình ảnh trong repository lưu trữ của ta .
Đầu tiên, liệt kê các containers đang chạy của bạn:
- sudo docker ps 
Bạn sẽ nhận được kết quả sau:
OutputCONTAINER ID        IMAGE                                       COMMAND             CREATED             STATUS              PORTS                  NAMES e50ad27074a7        your_dockerhub_username/nodejs-image-demo   "node app.js"       3 minutes ago       Up 3 minutes        0.0.0.0:80->8080/tcp   nodejs-image-demo Sử dụng CONTAINER ID được liệt kê trong  kết quả  của bạn, dừng containers  ứng dụng đang chạy. Đảm bảo thay thế ID được đánh dấu bên dưới bằng CONTAINER ID  của bạn :
- sudo docker stop e50ad27074a7 
Liệt kê tất cả hình ảnh của bạn với cờ -a :
- docker images -a 
Bạn sẽ nhận được  kết quả  sau với tên hình ảnh của bạn, your_dockerhub_username / nodejs-image-demo , cùng với hình ảnh node và các hình ảnh khác từ bản dựng của bạn:
OutputREPOSITORY                                           TAG                 IMAGE ID            CREATED             SIZE your_dockerhub_username/nodejs-image-demo            latest              1c723fb2ef12        7 minutes ago       73MB <none>                                               <none>              2e3267d9ac02        4 minutes ago       72.9MB <none>                                               <none>              8352b41730b9        4 minutes ago       73MB <none>                                               <none>              5d58b92823cb        4 minutes ago       73MB <none>                                               <none>              3f1e35d7062a        4 minutes ago       73MB <none>                                               <none>              02176311e4d0        4 minutes ago       73MB <none>                                               <none>              8e84b33edcda        4 minutes ago       70.7MB <none>                                               <none>              6a5ed70f86f2        4 minutes ago       70.7MB <none>                                               <none>              776b2637d3c1        4 minutes ago       70.7MB node                                                 10-alpine           f09e7c96b6de        3 weeks ago         70.7MB  Xóa containers đã dừng và tất cả hình ảnh, bao gồm cả hình ảnh không sử dụng hoặc treo, bằng lệnh sau:
- docker system prune -a 
Nhập y khi  được yêu cầu  trong  kết quả  để  xác nhận  bạn muốn xóa containers  và hình ảnh đã dừng.  Lưu ý  điều này cũng sẽ xóa bộ nhớ cache bản dựng của bạn.
Đến đây bạn đã xóa cả containers chạy hình ảnh ứng dụng của bạn và chính hình ảnh đó. Để biết thêm thông tin về cách xóa containers , hình ảnh và tập Docker , vui lòng xem lại Cách xóa hình ảnh, containers và tập Docker .
Với tất cả hình ảnh và containers của bạn đã bị xóa, bây giờ bạn có thể kéo hình ảnh ứng dụng từ Docker Hub:
- docker pull your_dockerhub_username/nodejs-image-demo 
Liệt kê các hình ảnh của bạn :
- docker images 
Đầu ra của bạn sẽ có hình ảnh ứng dụng của bạn:
OutputREPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE your_dockerhub_username/nodejs-image-demo      latest              1c723fb2ef12        11 minutes ago      73MB Đến đây bạn có thể xây dựng lại containers của bạn bằng lệnh từ Bước 3:
- docker run --name nodejs-image-demo -p 80:8080 -d your_dockerhub_username/nodejs-image-demo 
Liệt kê các containers đang chạy của bạn:
- docker ps 
OutputCONTAINER ID        IMAGE                                                   COMMAND             CREATED             STATUS              PORTS                  NAMES f6bc2f50dff6        your_dockerhub_username/nodejs-image-demo               "node app.js"       4 seconds ago       Up 3 seconds        0.0.0.0:80->8080/tcp   nodejs-image-demo Truy cập http:// your_server_ip    để xem ứng dụng đang chạy của bạn.
Kết luận
Trong hướng dẫn này, bạn đã tạo một ứng dụng web tĩnh với Express và Bootstrap, cũng như Docker image cho ứng dụng này. Bạn đã sử dụng hình ảnh này để tạo containers và đẩy hình ảnh vào Docker Hub. Từ đó, bạn có thể hủy hình ảnh và containers của bạn và tạo lại chúng bằng cách sử dụng repository Docker Hub.
Nếu bạn muốn tìm hiểu thêm về cách làm việc với các công cụ như Docker Compose và Docker Machine để tạo cài đặt nhiều containers , bạn có thể xem các hướng dẫn sau:
- Cách cài đặt Docker Compose trên Ubuntu .
- Cách Cung cấp và Quản lý Server Docker Từ xa với Máy Docker trên Ubuntu .
Để biết các mẹo chung về cách làm việc với dữ liệu containers , hãy xem:
- Cách chia sẻ dữ liệu giữa các containers Docker .
- Cách chia sẻ dữ liệu giữa Docker Container và Host .
Nếu bạn quan tâm đến các chủ đề khác liên quan đến Docker, vui lòng tìm thư viện hướng dẫn Docker đầy đủ của ta .
Các tin liên quan
Cách cài đặt Docker Compose trên Ubuntu 20.04 [Quickstart]2020-06-11
Cách cài đặt và thiết lập Laravel với Docker Compose trên Ubuntu 20.04
2020-06-09
Cách cài đặt và sử dụng Docker trên Ubuntu 20.04
2020-06-09
Cách cài đặt và sử dụng Docker Compose trên Ubuntu 20.04
2020-06-05
Cách chia sẻ dữ liệu giữa các container Docker
2020-05-21
Cách sử dụng Traefik 1.7.21 làm Reverse Proxy cho Docker Containers trên CentOS 7
2020-05-12
Cách cài đặt Drupal với Docker Compose
2020-04-25
Cách xây dựng và triển khai ứng dụng Flask bằng Docker trên Ubuntu 18.04
2020-04-05
Como Conteinerizar um aplicativo Laravel para desenvolvimento com o Docker Compose em Ubuntu 18.04
2020-02-20
Cách tạo ứng dụng Node.js với Docker [Quickstart]
2020-02-06
 

