DevOps

[Docker] 도커에 MongoDB 설치 및 MongoDB GUI 툴 Mongo Compass로 접속하기 (2/3)

nooblette 2023. 9. 4. 20:14

목차

    글 목록

    배경

    지난 글에 이어서 Portainer를 활용하여 도커에 MongoDB를 설치하고, MongoDB GUI 툴인 Mongo Compass로 접속해보도록 하겠습니다.


    MongoDB GUI 툴은 Robo 3T와 Mongo Compass가 가장 많이 쓰이는 것으로 알고 있는데, Mongo Compass가 상대적으로 UI가 사용하기 간편하고 (주관적이지만) 한눈에 들어오게 구현되어있어 Mongo Compass를 사용하기로 하였다. 덧붙여서 Mongo 공식사이트에서도 Mongo Compass 관련내용이 있어 조금 더 접근성이 좋을 것 같아 MongoDB Compass를 선택하였다.

     

    MongoDB Compass

    Explore and interact with your data using Compass, the GUI for MongoDB. Query, modify, delete, and more — all from one interface.

    www.mongodb.com

     

    내용

    지난 글에 이어서 Portainer 접속을 한 상태에서 좌측 메뉴에 있는 탭을 활용하여 Mongo Docker image 다운로드, 볼륨설정, Docker Container 실행을 통해 MongoDB를 띄우고 이를 Mongo Compass로 접속까지 해보았다.

    Portainer를 활용한 Docker Container 세팅 과정을 모두 다음 글을 참고하여 진행하였다.

     

    단 몇초만의 클라우드 | iwinv 서버

    본 매뉴얼은 도커를 기반으로한 환경에서 Portainer*를 설정하는 방법을 안내합니다.iwinv에서 도커가 포함된 운영체제를 설치해 이용중인 사용자는 '3. Portainer 로그인' 부터 설정을 진행할 수 있습

    help.iwinv.kr

     

    도커 Mongo 이미지 pull

    (도커 이미지에 대해서는 간략하게 다뤘던 지난 글의 도커 이미지(Docker Image)를 참고하면 될 것 같습니다.)

    좌측 local 란에서 Images 탭을 선택한 후 다운받고자 하는 Docker Image 명을 지정하여 Pull the Image 버튼으로 도커 이미지를 받아왔다. 오탈자 없이 정확하게 입력해야하며, 나는 Mongo DB 이미지를 받을 것이기 때문에 mongo로 검색했다. 

    만일 도커 이미지 명을 정확하게 알 수 없다면 docker hub 사이트를 참고해서 이미지 명을 검색하면 된다.

     

    도커 볼륨 생성

    그 이후 mongo db의 데이터를 저장할 볼륨을 생성하였다. 지난 글에서 설명했 듯이, 도커 컨테이너는 종료될때 그 데이터를 모두 지워버리기 때문에 바인드 마운트 혹은 볼륨을 통해 데이터를 영구적으로 저장하고 사용하도록 하였고 다음과 같은 이유로 바인드 마운트가 아닌 볼륨(Volumes) 방식을 선택했다.

     

    1. 백업하거나 이동(migration)시키기 쉽다. 
    2. docker CLI 명령어나 docker API로 볼륨을 관리할 수 있다. 
    3. 볼륨은 리눅스, 윈도우 컨테이너에서 모두 작동한다. 
    4. 컨테이너 간 볼륨을 안전하게 공유할 수 있다. 
    5. 볼륨 드라이버를 사용하면 볼륨의 내용을 암호화하거나 다른 기능을 추가할 수 있다. 
    6. 새로운 볼륨은 컨테이너로 내용을 미리 채울 수 있다. 
    7. Docker Desktop의 볼륨은 Mac, Windows 호스트의 바인드 마운트보다 성능이 훨씬 높다. 

     

    mongo-data라는 이름의 볼륨을 생성하여 도커 컨테이너의 /data/db 디렉토리에 마운트하였다.

    우측 상단에 Success라고 적혀진 토스트를 볼 수 있고, Volume list에도 정상적으로 mongodb-data 볼륨이 생성된 것을 볼 수 있다.

    위와 동일한 과정을 거쳐 /data/configdb가 마운트 할 mongdb-configdata 라는 볼륨을 생성하였다.

    (만일 /data/db만 마운트를 하면 아래와 같이 도커 컨테이너 생성시에 도커가 알아서 익명의 볼륨을 생성하여 컨테이너의 /data/configdb에 마운트한다. 정확히는 모르겠으나, mongodb의 데이터가 저장될 볼륨과 샤드, 클러스터와 같은 mongo의 메타데이터를 저장해줄 설정 디렉토리로 구분되어 있는 것 같았다.) (만일 이부분에 대해 정확한 내용을 알고 계신다면 댓글 작성해주시면 감사하겠습니다.)

    Mongo 컨테이너 생성

    Mongo image를 pull하고, data를 마운트할 volume까지 생성한 후에 도커 컨테이너를 생성하였다. 마찬가지로 우측 상단에 Add Container를 통해 생성하였다.

    상단의 빨간색으로 아스터리스크가 표기된 Image에 방금 pull 받았던 mongo 이미지를 지정하였다.

    그 후 Manul netwokr port publishing 칸에 host와 container의 사용 포트번호를 27017로 지정하였다.

    앞서 생성해두었던 mongo-data 볼륨과 mongodb-configdata 볼륨에 각각 Mongo 컨테이너의 /data/db 디렉토리와 /data/configdb 디렉토리를 마운트하였다.

    그 후 Advanced container settings 란의 Restart policy 탭에서 Restart policy를 Always로 선택하였다.

    (재시작 정책을 항상 재시작으로 지정하여 도커를 재기동 할때 해당 컨테이너도 실행되도록 설정하였다.)

    그 후 Deploy the container 로 컨테이너 생성을 마무리하였다.

    docker ps 실행 결과

    볼륨 생성시와 동일하게 우측에 Success라는 토스트를 확인할 수 있고 Container list에서 mongodb-container라는 이름으로 몽고 DB 컨테이너가 돌아가고 있음을 확인 할 수 있다.

     

    현재 동작하고 있는 도커 컨테이너는 아래와 같은 리눅스 명령어도 확인할 수 있다.(Portainer와 동일한 내역을 확인할 수 있다)

    docker ps

     

    현재 동작하고 있는 도커 컨테이너에 Shell을 통해서 접속해보았다. docker 컨테이너 접속 쉘 명령어는 다음과 같다.

    docker exec -it mongodb-container bash

    mongodb container 접속 성공

     

    Mongo 컨테이너 접속 및 Mongo Compass 연동

    이제 mongo db에서 사용자를 지정하여 데이터를 조회하고 확인해야하는데 이상태로 몽고의 계정 switch 명령어인 use admin으로 접속 계정을 바꾸지 못한다.

    왜냐하면 당연하게도.. use 명령어는 몽고쉘명령어이지만, 현재 접속한 공간은(root@로 표시되는) 도커 컨테이너 내부이기 때문이다.(몽고쉘이 아님)

     

    따라서 mongo 계정을 생성하고 그 계정으로 mongo shell에 접속을 해야한다.

    mongo 컨테이너 생성 시에 할 수 도 있지만 나는 gui로 mongo db에 접속해서 계정을 만들어보았다.

     

    mongo compass는 mongo 공식 사이트에서 설치하였다.

    각자 운영체제에 맞게 적절한 설치파일을 내려받으면 된다. 나는 M1 mac을 사용하기 때문에 macOS arm64(M1) (11.0+)를 선택하여 .dmg 파일을 내려받고 실행하였다.

     

    또한, mongo compass 세팅 방법은 Compass를 이용한 DB 서버 접속 및 사용 글을 참고하였다.

     

    Compass를 이용한 DB 서버 접속 및 사용

     

    guide.ncloud-docs.com

     

    정상적으로 다운받은 후 실행이 되었다면 아래와 같은 화면이 보일 것이다.

    서버의 ip주소와 포트번호를 uri에 입력하고 connect를 연결하면 된다.

    앞서 도커 컨테이너 생성시에 27017번 포트에 매핑을 하였으므로 이 포트번호와 현재 로컬에서 수행하고 있으므로 localhost로 Uri를 지정하였다.

     

    도커 컨테이너가 정상적으로 동작하고 있다면 다음과 같은 화면을 볼 수 있다.

    하단에 _MONGOSH 탭을 활성화 하여 현재 접속한 Mongo DB의 shell을 활성화하면된다.

     

    db.createUser() 쉘명령어를 사용하여 admin 계정을 생성해주었다.

    db.createUser({
        user: "admin",
        pwd: "admin",
        roles: [{ role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase"]
    })

    admin 계정 생성 성공

    그 후 다시 도커 컨테이너를 접속한 bash 쉘로 돌아와서 mongsh 명령어를 통해 앞서 생성한 admin 계정으로 몽고 DB에 접속하였다.

    mongsh -u admin -p admin
    • -u : 계정 username을 입력
    • -p : 계정 비밀번호를 입력

    admin 계정으로 전환 성공

    정상적으로 Mongo 에 접속했다면 위와 같은 화면을 볼 수 있다. 여기서 use 명령어를 사용하여 접속 계정을 admin으로 바꿔주었다.

    use admin

    Mongo 데이터 조회

    이렇게 bash shell 로 접속한 mongo와 Mongo Compass가 서로 잘 상호동작하는지 확인해보기 위해, 데이터를 생성하고 조회하였다.

     

    먼저 Mongo Compass에서 local 계정으로 test_collections이라는 신규 컬렉션을 생성하였다.

    그리고 insert document를 통해 임의의 데이터 하나를 생성해보았다.

    _id 필드를 갖는 도큐먼트를 확인할 수 있다.

     

    그 후 다시 bash 쉘로 돌아와서 위에서 생성한 임의의 데이터를 조회해보았다.

    먼저, local 계정에 생성하였으므로 다음 명령어로 사용자를 local로 바꿔주었고, local 계정에 현재 존재하는 collections 내역을 확인했다.

    use local
    show collections

     

    그리고 나서 find() 명령어로 test_collection의 document를 조회하였다.

    db.test_collections.find()

     

    Mongo Compass에서 생성한 Docuemt 내용이 정상적으로 조회되는 것을 볼 수 있다.


     

    다음 글에서 스프링 부트 프로젝트에 이와 같이 Docker Container로 생성한 Mongo에 연동하고, Docker compose를 통해 스프링 부트 프로젝틀 빌드하면서 Mongo가 돌아가고있는 Docker Container도 함께 빌드되도록 세팅하겠습니다.