Cách tạo ứng dụng Node.js với Docker
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 18.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 18.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.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ố:
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ácviews
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ổ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ẽ thấy trang đích sau:
Nhấp vào nút Nhận thông tin cá mập . Bạn sẽ thấy trang thông tin sau:
Đế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 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 xem 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 liệu 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 :
- 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:
- docker images
Bạn sẽ thấy 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ổng80
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 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 :
- 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
:
- docker ps
Bạn sẽ thấy 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
Khi 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 http:// your_server_ip
. Bạn sẽ thấy trang đích ứng dụng của bạn :
Đế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 :
- 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
:
- 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:
- docker ps
Bạn sẽ thấy 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 :
- 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ẽ thấy 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 loại bỏ containers Docker, hình ảnh và dung lượng , vui lòng xem Cách loại bỏ Docker hình ảnh, containers và dung lượng .
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
Bạn sẽ thấy 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 18.04 .
- Cách Cung cấp và Quản lý Server Docker Từ xa với Máy Docker trên Ubuntu 18.04 .
Để 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 xem thư viện hướng dẫn Docker đầy đủ của ta .
Các tin liên quan
Cách quản lý triển khai nhiều node với Máy Rancher và Docker trên Ubuntu 16.042018-10-30
Cách cài đặt và sử dụng Docker trên Ubuntu 16.04
2018-10-19
Cách cung cấp và quản lý server Docker từ xa bằng Máy Docker trên Ubuntu 18.04
2018-10-02
Cách cài đặt và bảo mật OpenFaaS bằng Docker Swarm trên Ubuntu 16.04
2018-09-19
Cách cài đặt Docker Compose trên Debian 9
2018-09-06
Cách cài đặt và sử dụng Docker trên Debian 9
2018-09-04
Cách chia sẻ dữ liệu giữa Docker Container và Host
2018-07-11
Cách cài đặt Docker Compose trên Ubuntu 18.04
2018-07-09
Cách cài đặt và sử dụng Docker trên Ubuntu 18.04
2018-07-05
Cách kiểm tra bảo mật server Docker với Docker Bench cho bảo mật trên Ubuntu 16.04
2018-06-14