Docker-compose nodejs mongodb

Các nhà phát triển giỏi quan tâm nhiều đến hiệu quả như họ quan tâm đến việc viết mã sạch. Containerization có thể tăng thêm hiệu quả cho cả quy trình công việc và ứng dụng của bạn, và do đó đã trở thành cơn thịnh nộ của các nhà phát triển hiện đại. Và, là một nhà phát triển giỏi, bạn biết rằng việc tạo vùng chứa thủ công từ hình ảnh bằng cách sử dụng

services:
  app:
  db:
2 hoặc thậm chí sử dụng
services:
  app:
  db:
3 để tạo vùng chứa là điều không lý tưởng. Bạn muốn có một lệnh yêu cầu Docker xây dựng các thùng chứa cho giao diện người dùng, API, cơ sở dữ liệu và máy chủ bộ đệm như thế nào?

Trong hướng dẫn này, bạn sẽ lấy ứng dụng cơ bản từ GitHub và hoàn thành tệp

services:
  app:
  db:
4 trong đó. Ứng dụng này sử dụng Node, NPM và MongoDB. Đừng lo lắng về việc cài đặt tất cả những thứ đó, bạn chỉ cần cài đặt Docker

Cũng giống như tệp

services:
  app:
  db:
3, tệp
services:
  app:
  db:
4 cho Docker biết cách xây dựng những gì bạn cần cho vùng chứa của mình. Không giống như
services:
  app:
  db:
3, nó được viết bằng thông số tệp YAML và nó làm được nhiều việc hơn là chỉ xây dựng một hình ảnh

Chọn phiên bản Docker Compose của bạn

Dòng đầu tiên của bất kỳ tệp

services:
  app:
  db:
4 nào là cài đặt
services:
  app:
  db:
9. Trong trường hợp này, bạn sẽ sử dụng phiên bản 3. 3, vì vậy chỉ cần nói với Docker Compose rằng

________số 8_______

Bạn có thể xem tài liệu về

app:
  image: sample:1.0
0 phiên bản 3 tại https. // tài liệu. người đóng tàu. com/compose/compose-file/ và bạn có thể thấy sự khác biệt giữa các phiên bản

Xác định các dịch vụ Node và Mongo

Dịch vụ là cách Docker đề cập đến từng vùng chứa bạn muốn xây dựng trong tệp docker-compose. Trong trường hợp này, bạn sẽ tạo hai dịch vụ. một cho ứng dụng NodeJS và một cho cơ sở dữ liệu MongoDB

services:
  app:
  db:

Hãy nhớ rằng phần chú ý là cách định dạng tệp YAML nhóm thông tin, vì vậy phần chú ý rất quan trọng. Tại đây, bạn đã thụt lề các dịch vụ

app:
  image: sample:1.0
1 và
app:
  image: sample:1.0
2 bên dưới thẻ
app:
  image: sample:1.0
3. Đây có thể được đặt tên bất cứ điều gì bạn muốn. Trong trường hợp này,
app:
  image: sample:1.0
1 và 'db` là dễ tham khảo nhất. Bây giờ, bạn sẽ đặt một ít thịt vào hai dịch vụ này

Trước tiên, hãy cho Docker biết bạn muốn xây dựng dịch vụ

app:
  image: sample:1.0
1 bằng hình ảnh nào bằng cách chỉ định rằng bạn sẽ xây dựng từ hình ảnh
app:
  image: sample:1.0
6. Vì vậy, bạn sẽ chỉ định nó được thụt vào dưới thẻ
app:
  image: sample:1.0
1

app:
  image: sample:1.0

Tất nhiên hình ảnh đó không tồn tại, vì vậy bạn sẽ cần cho Docker biết nơi tìm

services:
  app:
  db:
3 để xây dựng nó bằng cách đặt ngữ cảnh xây dựng. Nếu bạn không làm như vậy, Docker sẽ cố gắng kéo hình ảnh từ Docker Hub và khi không thành công, lệnh
app:
  image: sample:1.0
0 sẽ bị lỗi hoàn toàn

app:
  image: sample:1.0
  build: .

Ở đây, bạn đã chỉ định rằng bối cảnh xây dựng là thư mục hiện tại, vì vậy khi Docker không thể tìm thấy hình ảnh

app:
  image: sample:1.0
6 cục bộ, nó sẽ xây dựng nó bằng cách sử dụng Dockerfile trong thư mục hiện tại

Tiếp theo, bạn sẽ cho Docker biết tên vùng chứa sẽ là gì sau khi nó được xây dựng hình ảnh để tạo vùng chứa từ đó

 app:
  image: sample:1.0
  container_name: sample_app
  build: .

Bây giờ, khi Docker build image, nó sẽ ngay lập tức tạo một container tên là

app:
  image: sample:1.0
  build: .
1 từ image đó

Theo mặc định, các ứng dụng NodeJS chạy trên cổng 3000, vì vậy bạn sẽ cần ánh xạ cổng đó thành 80, vì đây là tệp "sản xuất"

app:
  image: sample:1.0
0. Bạn làm điều đó bằng cách sử dụng thẻ
app:
  image: sample:1.0
  build: .
3 trong YAML

app:
  image: sample:1.0
  container_name: sample_app
  build: .
  ports:
    - 80:3000

Tại đây, bạn đã ánh xạ cổng 80 trên hệ điều hành máy chủ tới cổng 3000 từ vùng chứa. Bằng cách đó, khi bạn đã chuyển vùng chứa này sang máy chủ sản xuất, người dùng ứng dụng có thể truy cập cổng 80 của máy chủ và yêu cầu các yêu cầu đó được trả lời từ vùng chứa trên cổng 3000

Ứng dụng của bạn sẽ lấy dữ liệu từ cơ sở dữ liệu MongoDB và để làm được điều đó, ứng dụng sẽ cần một chuỗi kết nối mà nó sẽ lấy từ một biến môi trường có tên là “MONGO_URI”. Để đặt các biến môi trường trong vùng chứa sau khi được tạo, hãy sử dụng thẻ

app:
  image: sample:1.0
  build: .
4 trong tệp YAML

app:
  image: sample:1.0
  container_name: sample_app
  build: .
  ports:
    - 80:3000
  environment:
    - MONGO_URI=mongodb://sampledb/sample

Tạo một mạng Docker

Để dịch vụ ứng dụng thực sự có thể tiếp cận cơ sở dữ liệu mẫu, dịch vụ này cần phải nằm trên cùng một mạng. Để đặt cả hai dịch vụ này trên cùng một mạng, hãy tạo một dịch vụ trong tệp

app:
  image: sample:1.0
0 bằng cách sử dụng thẻ
app:
  image: sample:1.0
  build: .
6 ở cấp cao nhất (cùng cấp độ chỉ định với thẻ
app:
  image: sample:1.0
3

version: '3.3'

services:
  app:...
  db:...
networks:
  samplenet:
    driver: bridge

Điều này tạo ra một mạng gọi là “samplenet” sử dụng mạng kiểu cầu nối. Điều này sẽ cho phép hai vùng chứa giao tiếp qua mạng ảo giữa chúng

Quay lại phần ứng dụng của tệp, tham gia dịch vụ ứng dụng vào mạng “samplenet”

app:
  image: sample:1.0
  container_name: sample_app
  build: .
  ports:
    - 80:3000
  environment:
    - MONGO_URI=mongodb://sampledb/sample
  networks:
    - samplenet

Tạo dịch vụ MongoDB

Bây giờ dịch vụ ứng dụng đã sẵn sàng, nhưng sẽ không tốt nếu không có dịch vụ db. Vì vậy, hãy thêm những thứ tương tự trong phần tiếp theo cho dịch vụ db

 db:
  image: mongo:3.0.15
  container_name: sample_db
  networks:
    samplenet:
      aliases:
        - "sampledb"

Dịch vụ này được xây dựng từ MongoDB 3 chính thức. 0. 15 và tạo vùng chứa có tên “sample_db”. Nó cũng tham gia mạng “samplenet” với bí danh là “sampledb”. Đây giống như một tên DNS trên một mạng vật lý, nó cho phép các dịch vụ khác trên mạng “samplenet” gọi nó bằng bí danh của nó. Điều này rất quan trọng vì nếu không có nó, dịch vụ ứng dụng sẽ gặp khó khăn hơn nhiều khi nói chuyện với nó. (Tôi không biết rằng nó không thể, có lẽ nó sẽ phải sử dụng hàm băm đầy đủ của vùng chứa. )

Sử dụng Docker Volumes

Bạn cũng sẽ muốn tạo một ổ đĩa trong dịch vụ cơ sở dữ liệu. Ổ đĩa cho phép bạn gắn các thư mục trên máy chủ vào các thư mục trong vùng chứa. Có nghĩa là, khi thứ gì đó bên trong vùng chứa đề cập đến một thư mục, nó sẽ thực sự truy cập vào một thư mục trên máy chủ. Điều này đặc biệt hữu ích cho các thùng chứa cơ sở dữ liệu vì các thùng chứa có nghĩa là dùng một lần. Với việc gắn kết vào thư mục vật lý trên máy chủ, bạn sẽ có thể hủy vùng chứa và xây dựng lại nó và các tệp dữ liệu cho vùng chứa sẽ vẫn ở đó trên máy chủ. Vì vậy, hãy thêm thẻ âm lượng trong phần db gắn thư mục

app:
  image: sample:1.0
  build: .
8 trong vùng chứa (nơi Mongo lưu trữ dữ liệu của nó) vào thư mục
app:
  image: sample:1.0
2 trong thư mục gốc của ứng dụng của bạn để phần db cuối cùng trông giống như sau

services:
  app:
  db:
0

Xem lại tệp soạn thảo Docker của bạn

Với tất cả những gì đã làm, docker-compose cuối cùng của bạn. tệp yml sẽ trông giống như

services:
  app:
  db:
1

Khi tất cả đã được thực hiện, bạn sẽ có thể lưu tệp và chạy

 app:
  image: sample:1.0
  container_name: sample_app
  build: .
0 trong thư mục mà bạn docker-compose. yml là và xem Docker xây dựng và bắt đầu môi trường của bạn cho bạn

Nếu mọi thứ hoàn tất thành công, bạn có thể truy cập

 app:
  image: sample:1.0
  container_name: sample_app
  build: .
1 và xem nội dung nào đó giống như hình ảnh bên dưới

Docker-compose nodejs mongodb

Xin chúc mừng. Bạn có một môi trường hoàn chỉnh được xác định trong mã nguồn của mình. Nó có thể được phiên bản và đăng ký để kiểm soát nguồn. Đây là những gì mọi người gọi là "Cơ sở hạ tầng như Code". Điều đó cũng có nghĩa là việc tạo lại môi trường này trên các môi trường thử nghiệm, dàn dựng và sản xuất cũng dễ dàng như chạy

 app:
  image: sample:1.0
  container_name: sample_app
  build: .
0 trên máy tương ứng. Tôi đã nói với bạn rằng các nhà phát triển giỏi đều lười biếng

Tìm hiểu thêm

Bạn có thể tìm hiểu thêm về Docker Compose và Docker nói chung từ tài liệu tương ứng của chúng. Nếu bạn muốn tìm hiểu thêm về

services:
  app:
  db:
3 được sử dụng trong dự án này, hãy xem phần hai của loạt bài này về
services:
  app:
  db:
3

Như mọi khi, nếu bạn có bất kỳ câu hỏi hoặc nhận xét nào về điều này hoặc bất kỳ bài viết nào của tôi, vui lòng liên hệ với tôi trên Twitter hoặc GitHub