Thứ ba, 30/06/2020 | 00:00 GMT+7

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 :

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ệ:

~ / node_project / package.json
{   "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.js Bạ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ố:

~ / node_project / app.js
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 approuter 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ố, pathport :

  • path : Xác định folder cơ sở, sẽ là folder con của các views trong 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ổng 8080 .

Tiếp theo, đặt các tuyến cho ứng dụng bằng đối tượng router :

~ / node_project / app.js
...  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 :

~ / node_project / app.js
...  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:

~ / node_project / app.js
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 :

~ / node_project / views / index.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ủ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 :

~ / node_project / views / index.html
... <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 :

~ / node_project / views / index.html
... <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 đề:

~ / node_project / views / index.html
... <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:

~ / node_project / views / shark.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> <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.htmlsharks.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 :

~ / node_project / views / css / styles.css
.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:

Trang đích ứng dụng

Nhấp vào nút Nhận thông tin cá mập . Trang thông tin sau sẽ tải:

Trang thông tin cá mập

Đế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:

~ / node_project / Dockerfile
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 roothạ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 :

~ / node_project / Dockerfile
... 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 :

~ / node_project / Dockerfile
... 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.jsonpackage-lock.json (dành cho npm 5+):

~ / node_project / Dockerfile
... 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 :

~ / node_project / Dockerfile
... 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 :

~ / node_project / Dockerfile
... 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 :

~ / node_project / Dockerfile
... 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:

~ / node_project / Dockerfile
... 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:

~ / node_project / Dockerfile
 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_project / .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:

Output
REPOSITORY 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ổng 80 trê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:

Output
CONTAINER 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 .

Trang đích ứng dụng

Đế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:

Output
CONTAINER 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:

Output
REPOSITORY 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:

Output
REPOSITORY 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
Output
CONTAINER 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:

Để biết các mẹo chung về cách làm việc với dữ liệu containers , hãy xem:

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 .


Tags:

Các tin trước

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