Cài đặt docker mongodb

 

Bài viết thuộc quyền Phạm Quang Minh - Minh Monmen. Techmaster đăng bài dưới sự cho phép của tác giả

Link bài viết gốc https. //kipalog. com/posts/Dev-hien-dai-phan-1--Setup-moi-truong-dev-voi-docker

Thầy Phạm Quang Minh hiện tại là giảng viên Techmaster trong các Khoa học Lộ trình DevOps cho cá nhân và doanh nghiệp


 

Đã qua rồi cái thời nông dân ấy, khi nào cứ mỗi lần cài lại máy, tôi lại mất cả ngày để setup LAMP stack. Đã qua rồi cái thời kỳ khốn khó đấy, khi mà bookmark của tôi luôn tràn ngập những bài viết hướng dẫn "Hướng dẫn cài đặt php 5. 6 lên ubuntu 14. 04". Dù biết đó là một thời hoài niệm, nhưng tôi sẽ phải tiến lên

điều đầu tiên đầu tiên

Chào các bạn. Nhân lúc thiên hạ vừa kết thúc ngày làm việc cuối cùng của năm 2018 dương lịch, mình tranh thủ làm vài dòng về những thứ mà mình đã được trải nghiệm trong công việc của một lập trình viên. Đây sẽ là một chùm bài viết có liên quan đến nhau được mình xây dựng để hướng dẫn các bạn tiến sâu hơn vào cuộc sống và công việc hàng ngày của một nhà phát triển. Mình chỉ mới nghĩ ra một số nội dung sẽ nói trong những bài viết sau, thế nên rất hy vọng mình có thể kiên trì thực hiện hết được series này cũng dựa trên sự ủng hộ của các bạn

Mình là Monmen, một backend developer, vì vậy chủ yếu các nội dung mình chia sẻ sẽ xoay quanh các công nghệ backend, kiến ​​trúc, đóng gói và triển khai ứng dụng bên server. Nếu các bạn quan tâm thì đọc tiếp nha

Truyện trước mắt thì series sẽ có 2 phần mở đầu như sau. Tất cả những kiến ​​thức và kinh nghiệm từ 2 bài viết này đều sẽ được áp dụng trong những series sau, khi mình bắt đầu nói về việc phát triển microservice hay quy trình CI/CD,.
- Phần 1. Setuppersistent stack for process dev with docker
- Phần 2. Run application on. máy mình

Mặc dù mình muốn bắt đầu từ những thứ thô sơ như là "Cách thức hoạt động của trang web" hay đại loại thế, nhưng vì bản tính ham vui nên mình sẽ bắt đầu từ khúc giữa cho nó mới lạ =))

Request of process development

Ngày xưa khi còn làm việc với team kha khá người, điều mình sợ nhất đó chính là công việc mỗi khi có ai đó tham gia vào dự án, là sẽ lại phải ngồi hỗ trợ người ta cài đủ thứ lên máy, cấu hình đủ thứ gió.

Một điều nữa là khi cài đặt lại máy. Quả là ác mộng khi bạn phải ngồi setup lại hết các stack công nghệ trên máy, rồi lại vẫn y như rằng gặp những lỗi quái dị, khi thì thiếu cấu hình, khi thì cho phép,. make you play crazy

Vì vậy mình rút ra mấy thứ cần phải giải quyết là.
- Tạo môi trường đồng bộ giữa những người trong nhóm
- Đẩy nhanh quá trình giả lập môi trường để bắt đầu mã

Mất rất lâu để mình nhận ra và bắt đầu sử dụng docker như 1 vị trí cứu tinh. Ấy nhưng mà nó cũng lại dẫn mình vào một loạt những nỗi buồn buồn cười khác

Cần thiết lập những gì

Sau rất nhiều lần làm theo tut trên mạng về việc setup môi trường dev laravel, nodejs,. Mình cảm thấy đây đều là những hướng dẫn tiếp giáp từ hướng làm cách nào để bạn "chạy" được dự án đó bằng docker (kiểu để nó chạy được ra chữ 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
5 thành công chức năng), hơn nữa là để các bạn áp dụng vào quá . Vì thế mình đã phân chia lại việc setup môi trường dev như sau

  • Thiết lập 1 ngăn xếp liên tục riêng biệt trên máy và chạy chung cho các dự án. Điều này khá hợp lý vì nó mô phỏng chính quá trình bạn cài đặt các dịch vụ mongodb, mysql, redis,. up your old host. Chỉ khác là nó nhanh hơn rất nhiều thôi
  • Với từng dự án thì sẽ tạo trường thời gian chạy trường riêng, và sẽ kết nối với ngăn xếp liên tục phía trên

Tưởng tượng bây giờ bạn thiết lập toàn bộ các dịch vụ cần thiết cho ứng dụng của bạn như cơ sở dữ liệu, bộ đệm, hàng đợi,. chỉ trong 1 nốt nhạc, điều mà trước đây bạn phải ngồi cả ngày mới thật tuyệt làm sao

Yêu cầu kiến ​​thức

Vì là bài mở đầu nên nói hơi dông dài, thôi giờ bắt tay vào việc luôn nhỉ. Đầu tiên là thứ bạn cần có để đọc bài viết này

  • Biết docker và docker-compose là gì. (có rất nhiều bài viết rồi tự tìm nha)
  • Máy tính đã cài linux (mình dùng ubuntu nên không đảm bảo mọi thứ sẽ chạy trên win hay mac)
  • Cài đặt docker và docker-compose trong máy

đầu ra. Setup thành công các loại cơ sở dữ liệu, bộ đệm,. nói chung là ngăn xếp liên tục để sử dụng chung cho việc phát triển nhiều dự án

tài nguyên. Tất cả những gì mình nói trong bài viết này đã được mình tổng hợp lại vào 1 kho lưu trữ trên github, sẵn sàng cho công việc sử dụng của các bạn với kiến ​​trúc thư mục chuẩn và 1 số đoạn mã cho các dịch vụ đi kèm

Tôi cần Mongodb cho dự án

Nguyên mẫu đơn giản

Được rồi, giờ là lúc bạn nghĩ xem dự án của các bạn cần 1 stack công nghệ như thế nào. Please started with 1 stack menu. MongoDB - ExpressJS - NodeJS. Vì vậy, bạn đã nhìn thấy thành phần liên tục chính là MongoDB rồi. Ta started with an file 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
6 đơn giản để chạy được mongodb

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        ports:
            - "27017:27017"
        restart: always

Trong bài viết này mình chỉ dùng cú pháp soạn bản 2 nhé, chi tiết các bạn xem trong docs của nó

Giải thích ý nghĩa. Trong tệp trên mình định nghĩa là 1 dịch vụ có tên là 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
7, với hình ảnh 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
8 đang chạy trong vùng chứa có 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
0 là 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
7. Cuối cùng là hiển thị cổng 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
2 từ vùng chứa ra bên ngoài máy chủ để mình có thể sử dụng các loại công cụ như 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
3 để truy cập và quản lý

Rất đơn giản phải không nào, chỉ cần tạo tệp 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
6 và chạy 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
5 là bạn đã có ngay một bản cài đặt mongodb mới nhất trên máy cá nhân ngay trong vài nốt nhạc

Dữ liệu ở đâu?

Rất tiếc, vấn đề xuất hiện, khi mình tiếp tục chạy docker-compose, có thể là với việc đang chạy 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
6, hoặc là tắt máy,. và ngẫu nhiên dữ liệu của biến mất dữ liệu của mình. Đây chính là lý do mongodb thuộc về ngăn xếp liên tục, tức là mình cần nó lưu lại dữ liệu mỗi khi mình tắt máy

Giải pháp xem ra cũng hết sức đơn giản, chỉ cần mount vùng dữ liệu của mongodb lên bên ngoài máy chủ của mình thôi. Vì thế là mình tạo thêm 1 thư mục 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
7 để chứa dữ liệu cho vùng chứa này và viết thêm vào tệp 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
6 như sau

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always

Trong đó 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
7 là thư mục mới được tạo ra trong dự án này, còn 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        user: "1000:1000"
        ports:
            - "27017:27017"
        restart: always
0 là nơi mongodb chứa dữ liệu trong vùng chứa. Thử lại với 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
5 và vào xem trong thư mục 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
7 nào. Bạn sẽ thấy 1 lô những tệp mới được thêm vào bởi mongo container

 

Cài đặt docker mongodb

Sao tôi lại không có quyền?

Nhưng mà lạ chưa, sao tất cả file sinh ra lại đều thuộc về 1 user 999 xa lạ thế kia? . Như các bạn đã biết là những tập tin này thuộc về 1 người dùng và nhóm khác với tài khoản của bạn thì đơn giản là bạn không có quyền đối với chúng. Sau này muốn sao chép dữ liệu này đi chỗ khác, hay xóa đi thì cũng không được

 

Cài đặt docker mongodb

Thật có thể cho chúng ta là mặc dù quyền volume vẫn là một vấn đề hết sức đau đầu khi làm việc với docker, nhưng với 1 số hình ảnh được viết chuẩn và xuề xòa như mongodb thì họ đã kiến ​​trúc 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        user: "1000:1000"
        ports:
            - "27017:27017"
        restart: always
3 cho phép chúng ta chạy chương trình . Tức là tập tin trong tập được sinh ra sẽ thuộc về người dùng và nhóm thật của chúng ta luôn. Và ta sẽ có toàn quyền với nó

Giờ các bạn hãy xóa toàn bộ thư mục 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
7 theo lệnh 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        user: "1000:1000"
        ports:
            - "27017:27017"
        restart: always
5 và tạo lại dữ liệu thư mục để chúng ta bắt đầu lại từ đầu. Nhưng là với tệp 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
6 đã được chỉnh sửa như sau

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        user: "1000:1000"
        ports:
            - "27017:27017"
        restart: always

Và chúng ta thử xem lại file dữ liệu nhé

 

Cài đặt docker mongodb

Thật bất ngờ, tất cả các tệp mới sinh ra trong thư mục dữ liệu mình chọn làm tập đã xuất hiện với người dùng và nhóm của mình. Giờ mình đã có toàn quyền với các dữ liệu này mà không sợ việc thay đổi ảnh của mình ảnh hưởng đến quyền của mongodb trong container

Giải thích 1 chút. ở đây mình thêm dòng 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        user: "1000:1000"
        ports:
            - "27017:27017"
        restart: always
7 trong tệp 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
6 thực chất là bảo thằng docker. "Đây là 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        user: "1000:1000"
        ports:
            - "27017:27017"
        restart: always
9 và 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
80 tài khoản 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
81 của anh, chú ý vào vùng chứa chạy mấy cái quy trình trong vùng chứa dưới 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        user: "1000:1000"
        ports:
            - "27017:27017"
        restart: always
9 và 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
80 này nhé. "

Hệ thống linux chỉ quan tâm đến 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        user: "1000:1000"
        ports:
            - "27017:27017"
        restart: always
9 và 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
80 của người dùng, chứ không quan tâm đến 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
86 đâu nhé, nên mình chỉ cần pass cho docker cái 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        user: "1000:1000"
        ports:
            - "27017:27017"
        restart: always
9 và 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
80 của mình là được. Còn tìm 2 con số này ở đâu thì đơn giản là bạn gõ lệnh sau vào terminal

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
8

Sử dụng như thế nào?

Giờ sau khi bày ra được thằng mongodb, mình bắt đầu truy cập câu hỏi, vậy những thằng khác kết nối với mongo của mình thế nào?

  • If want to connect to mongodb from host (tức là từ bên ngoài máy của bạn) as running Studio 3T, mongo shell,. then can connect qua port 27017 của localhost mình vừa Exposure ở trên
  • Nếu muốn kết nối từ trong các vùng chứa khác (ví dụ vùng chứa chứa ứng dụng của bạn) thì phải xác định luôn cái ứng dụng của bạn vào tệp
    version: '2'
    
    services:
        mongo:
            container_name: mongo
            image: mongo:latest
            volumes:
                - ./data/mongo:/data/db
            ports:
                - "27017:27017"
            restart: always
    
    6 này, rồi dùng 
    version: '2'
    
    services:
        mongo:
            container_name: mongo
            image: mongo:latest
            volumes:
                - ./data/mongo:/data/db
            ports:
                - "27017:27017"
            restart: always
    
    80 hay là 
    version: '2'
    
    services:
        mongo:
            container_name: mongo
            image: mongo:latest
            volumes:
                - ./data/mongo:/data/db
            ports:
                - "27017:27017"
            restart: always
    
    81 bla bla như các hướng dẫn trên mạng. Đây là cái mình không muốn. Bởi vì mongodb được dùng chung cho nhiều dự án của mình, nên mình không thể định nghĩa hết các dự án của mình vào đây được. Do đó mình sẽ tạo 1 
    version: '2'
    
    services:
        mongo:
            container_name: mongo
            image: mongo:latest
            volumes:
                - ./data/mongo:/data/db
            ports:
                - "27017:27017"
            restart: always
    
    82 cho những ứng dụng của mình dù định nghĩa ở đâu cũng có thể sử dụng được
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
8

Ở đây mình định nghĩa 1 mạng có tên là 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
83 và sử dụng nó cho dịch vụ 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
7 ở trên. try to run any

 

Cài đặt docker mongodb

Các bạn có để ý vài dòng đầu tiên, khi docker-compose tạo ra mạng 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
85 mà không phải chỉ 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
86 như mình định nghĩa không? . This is call is
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
88 with default value get from the name folder contains (
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
89). Giá trị này có thể thay đổi được, nhưng mình sẽ không nói ở đây cho đỡ rối nhé. Các bạn hãy nhớ cái tên dài loằng ngoằng này, vì tới phần 2 của series này sẽ dùng tới đó

Thêm redis và mysql xem thế nào

Đáng lý là bạn đã quan tâm vì vừa có ngay 1 con mongodb sẵn sàng hoạt động ở trên rồi, nhưng không, dự án của bạn lớn quá, anh Màn yêu cầu sử dụng redis để lưu trữ dữ liệu nữa. Ô rồi bạn lại đang ở bên ngoài 1 dự án php chạy MySQL. Add into any time?

Vẫn theo đúng các bước với mongo ở trên, mình cắm được con redis và mysql vào ngăn xếp liên tục của mình như sau

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
8

Chiêu dùng lại, mình áp dụng y như cũ với thằng mongo (may mắn là bạn làm image redis và mysql cũng thông minh như mongo trong cách dùng 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        user: "1000:1000"
        ports:
            - "27017:27017"
        restart: always
9 và 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
80 vậy). And back____15

 

Cài đặt docker mongodb

Tada, thế là mình đã luôn có con redis và mysql có sẵn ở cổng 

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
83 và 
version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
84 rồi, tất cả chỉ trong khoảng thời gian 1 đoạn trà. Tất cả đã có sẵn cho công việc phát triển ứng dụng của mình

Tổng kết

Qua bài hướng dẫn này, mình đã tạo xong cho các bạn 1 ngăn xếp liên tục sử dụng cho mục đích phát triển trên localhost. Ngăn xếp này hoàn toàn có thể bổ sung, loại bỏ các dịch vụ khác như thỏmq, postgresql, neo4j,. hay bất cứ điều gì bạn cần cho sự phát triển của mình. Phía dưới đây mình có dẫn link tới kho github chứa nguồn của toàn bộ bài hướng dẫn, cũng như thư mục kiến ​​trúc chuẩn, 1 số cấu hình phức tạp hơn và 1 số đoạn trích dịch vụ khác để các bạn bổ sung thêm vào tệp

version: '2'

services:
    mongo:
        container_name: mongo
        image: mongo:latest
        volumes:
            - ./data/mongo:/data/db
        ports:
            - "27017:27017"
        restart: always
85

Nếu bạn là người mới, chỉ cần sao chép repo này của mình, chọn đoạn mã dịch vụ mà bạn cần rồi làm theo hướng dẫn là bạn đã có ngay 1 ngăn xếp dịch vụ phát triển

Trong bài viết tiếp theo, mình sẽ hướng dẫn các bạn tạo môi trường cho việc chạy code của từng dự án và sử dụng các dịch vụ từ ngăn xếp liên tục này