Docker에 MongoDB를 설치하고 무료 접속 툴인 Studio 3T를 이용해서 접속해보고 쿼리를 사용해보자.

1. Docker에 MongoDB 설치

Docker에서 MongoDB 설치를 위해 필요한 내용을 docker-compose.yml 파일을 만든다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
version: '3'
 
services:
  mongodb:
    image: mongo:latest
    container_name: "mongodb"
    environment:
      - MONGO_DATA_DIR=/data/db
      - MONGO_LOG_DIR=/dev/null
    ports:
      - 27017:27017
    volumes:
      - /Users/wedul/Documents/docker/datafile/mongodb/:/data/db
 
cs

그리고 작성한 명령어를 통해 mongoDB가 담긴 컨테이너를 설치한다.

1
docker-compose up -d
cs

2. 클라이언트 툴 Studio 3T 설치

https://studio3t.com/ 에서 프로그램을 다운로드 한다.


3. 접속하여 쿼리 날려보기

host에 localhost port에 docker-compose.yml에 기재한 포트를 기입하고 접속하면 접속이 된다.
그리고 Query랑 Projection, Sort, Limit등등 사용해서 결과를 확인할 수 있다.



스프링 부트 애플리케이션을 Docker image로 빌드해서 컨테이너에 올리는 작업을 진행해 보겠다.

 

필요사항

  • JDK 1.8 later
  • Maven 3.2 이상
  • STS
  • Docker

 

Pom.xml 수정을 먼저 진행해야한다.

  • wedul 이라는 이름의 jar 파일이 생성된다.
  • docker에서 실행하기 위한 Maven 설정이 들어있는 jar file이 만들어 진다.
  • 만약 image prefix 값을 별도로 지정하지 않으면 artifact id가 명시된다.
<properties>
   <docker.image.prefix>wedul</docker.image.prefix>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>com.spotify</groupId>
            <artifactId>dockerfile-maven-plugin</artifactId>
            <version>1.3.6</version>
            <configuration>
                <repository>${docker.image.prefix}/${project.artifactId}</repository>
                <buildArgs>
                    <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
                </buildArgs>
            </configuration>
        </plugin>
    </plugins>
</build>

 

그리고 프로젝트 Root에 Dockerfile을 위치시켜야 한다. 

FROM java:8
VOLUME /tmp
ADD /target/wedulpos-0.0.1-SNAPSHOT.jar wedulpos.jar
ENTRYPOINT ["java","-jar","wedulpos.jar"]

DockerFile 옵션 설명 (출처 : https://www.callicoder.com/spring-boot-docker-example/)

VOLUME 

볼륨은 호스트 OS에서 컨테이너에 의해 생성 된 데이터를 유지하고 호스트 OS에서 컨테이너로 디렉토리를 공유하는 메커니즘입니다.

VOLUME 명령은 컨테이너에 지정된 경로로 마운트 포인트를 작성합니다. 컨테이너를 실행할 때 지정된 마운트 지점이 매핑 될 Hot OS의 디렉토리를 지정할 수 있습니다. 그런 다음, 컨테이너가 마운트 된 경로에 쓰는 것이 호스트 OS의 매핑 된 디렉토리에 기록됩니다. 볼륨의 가장 일반적인 사용 사례 중 하나는 컨테이너에 의해 생성 된 로그 파일을 호스트 OS에 저장하는 것입니다.

예를 들어, 응용 프로그램이 로그 파일을 /var/log/app.log 위치에 기록한다고 가정 해 봅시다. Dockerfile에 / var / log 경로로 VOLUME을 마운트 한 다음 컨테이너를 실행하는 동안이 마운트 지점이 매핑 될 호스트 OS의 디렉토리를 지정할 수 있습니다. 그런 다음 호스트 OS의 매핑 된 디렉토리에서 로그에 액세스 할 수 있습니다.

위의 Dockerfile에서 / tmp 경로를 사용하여 마운트 지점을 만들었습니다. 이것이 스프링 부트 응용 프로그램이 Tomcat에 대한 작업 디렉토리를 기본적으로 만드는 위치이기 때문입니다. 이 스프링 부트 응용 프로그램에는 바람둥이 디렉토리에 관심이 있기 때문에 필수는 아니지만. 그러나 Tomcat 액세스 로그와 같은 항목을 저장하려는 경우 VOLUMES는 매우 유용합니다.

 

ADD

ADD 명령은 새 파일과 디렉토리를 고정 이미지에 복사하는 데 사용됩니다.

 

ENTRYPOINT

응용 프로그램이 컨테이너 내부에서 실행되는 방법을 구성하는 곳입니다. 

 

그렇게 설정을 마치고 명령어를 통해 docker에서 사용할 수 있는 이미지 파일로 빌드를 진행한다.

./mvnw install dockerfile:build

설정을 정상적으로 하고 빌드가 진행이 완료되면 BUILD SUCCESS가 보일 것이다.

Docker image ls 명령어를 통해 지금 설치가 완료된 이미지 파일도 확인할 수 있다.

 

 

Docker의 컨테이너를 실행시키기 위해서는 다음가 같은 명령어를 사용할 수 있다.

 

docker run [OPTIONS] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...]
옵션 설명
-d detached mode 흔히 말하는 백그라운드 모드
-p 호스트와 컨테이너의 포트를 연결 (포워딩)
-v 호스트와 컨테이너의 디렉토리를 연결 (마운트)
-e 컨테이너 내에서 사용할 환경변수 설정
–name 컨테이너 이름 설정
–rm 프로세스 종료시 컨테이너 자동 제거
-it -i와 -t를 동시에 사용한 것으로 터미널 입력을 위한 옵션
–link 컨테이너 연결 [컨테이너명:별칭]
/bin/bash bash 쉘 접속 가능


그럼 한번 mysql을 실행 시켜보자.기본적으로 docker run 이미지를 입력하여 컨테이너를 실행시킬 경우에 이미지가 다운받아진 경우가 없는경우에는 Docker 레퍼지토리에서 pull 한후에 컨테이너를 생성하고 시작한다.

-p 옵션의 경우에는 2222:3112로 설정할 수 있다. 이럴경우 호스트에서 2222로 접속하면 내부에서 컨테이너에 6379로 매핑하여 실행한다.

그럼 이 옵션을 이용해서 2개의 mysql을 실행시켜보자.

 

Mysql 이미지 사용하기

기본적인 설명은 Mysql의 Docker 문서를 참고하면 된다.

간편하게 사용테스트를 진행하기 위해서 비밀번호가 없고 보트를 3306과 3310 두개를 사용하는 mysql을 만들고 docker container가 종료되면 바로 삭제하는 옵션을 사용해서 진행해보자. 두 개 모두 서로 다른 방식으로 진행해보자.

먼저 첫번째는 컨테이너를 명령어를 실행시켜서 진행하는 방식을 사용해보자.

docker run -d --rm -p 3306:3306 -e MYSQL_ALLOW_EMPTY_PASSWORD=true --name mysql_test1 mysql:5.7

-e 옵션에 MYSQL_ALLOW_EMPTY_PASSWORD의 경우 패스워드 없이 사용할 수 있는 옵션이다.


명령어를 실행하면 기존에 Mysql의 이미지가 없었기 때문에 이를 다운로드 받는다.

그리고 모든 컨테이너 적제가 완료되면 컨테이너 내부에 mysql을 제어하기 위해 docker 명령어를 사용하여 들어가보자.

docker exec -i -t mysql_test1 bash

 

 

성공적으로 접속한 것을 확인할 수 있다. 접속해서 User를 만들고 접속권한을 부여한다.

그 다음 쿼리박스를 이용해서 접속을 시도해보자. 성공적으로 접속을 완료했다.

 

그럼 이제 3307 포트를 사용하는 다른 Mysql을 docker에서 제공하는 docker-compose를 사용하여 만들어보자.

docker-compose란 무엇인가?

우선 기존에는 docker에 필요한 이미지를 받고 실행 방법을 설정하기 위해서 일일히 명령어에 추가하기에는 어려움이 있다. 방금 전 까지만 해도 비밀번호 없게 하라, 포트는 무엇으로 하라 등등 많은 설정을 명령어 라인으로 실행했었다. 

하지만 이를 yml 문법에 맞게 설정파일을 작성한 뒤에 docker 레포지토리에서 다운을 요청하면 그에 맞게 실행파일 및 설정이 적용되어 컨테이너에 이미지를 적재 시켜준다. 훨씬 간편하다.

그럼 우선 yml 문법으로 mysql 이미지를 실행하는 문법을 만들어보자.

version: '3.1'
services:
  db:
    image: mysql:5.5
    container_name: mysql5.5_test2
    ports:
      - "3307:3306"
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=dbsafer00
      - MYSQL_USER=wedul
      - MYSQL_PASSWORD=dbsafer00
      - MYSQL_DATABASE=wedul

문법은 생각보다 간단하다. image 버전과 container_name을 적고 포트의 인바운드 아웃바운드를 적어준다. 그리고 추가적인 환경으로 mysql의 정보를 기재할 수 있다. 

그리고 docker-compse 명령어로 컨테이너에 등재시킬 수 있다.

docker-compose up -d

도커 프로세스를 확인해보면 두 개의 mysql 컨테이너가 실행중인 것을 확인할 수 있다.

 

두 번째에 실행시킨 Mysql도 동일하게 QueryBox에서 사용이 가능하다.

 

기존에는 DBMS가 필요하거나 할 때, VM을 사용하거나 실 서버를 사용하였지만 도커를 이용하면 아주 간단하게 사용할 수 있어서 좋은 것 같다. 이번에는 Mysql만 해보았지만, Repository에 있는 워드프레스나 레디스 등등도 사용할 수 있따. 실무에서도 시간이 나면 환경을 만들어서 써봐야겠다. 

 

 

+ Recent posts