Docker/compose

Docker-compose.yml 작성

PSAwesome 2020. 1. 4. 16:21
반응형

안녕하세요.

이번 글은 여러 도커를 한 묶음으로 활용하는 도커 컴포즈(docker-compose) 설정에 대해 작성하려고 합니다.

시작 명령어

docker-compose up
  • 현재 디렉토리에 있는 docker-compose.yml 또는 docker-compose.yaml 파일을 찾아 내부에 정의된 명령어를 실행합니다.

도커 파일 생성

FROM hirokimatsumoto/alpine-openjdk-11

MAINTAINER PS

ADD build/libs/*.jar app.jar

#CMD ["java", "-jar", "/app.jar"]
ENTRYPOINT ["java","-jar","/app.jar"]

 

도커 파일 설명

키워드

키워드 설명

예제 값 설명
FROM

생성할 이미지의 베이스 이미지로
필수 입력값입니다.

openjdk:<version>
의 값을 입력할 수 있으며, 이미지 크기가 낮은 알파인을 사용했습니다.
- 참조 링크

MANITAINER 이미지 작성자의 정보를 입력합니다.  
ADD 선택된 파일을 도커 이미지에 추가합니다. gradle build 이후 생성되는 jar파일을 도커 이미지에 추가하였습니다.
추가할 때 app.jar로 이름이 변경됩니다.
CMD 이미지 실행 시 인자 값을 받아 명령어를 변경할 수 있는 명령어입니다. java -jar /app.jar
친숙한 명령은 jar 파일을 실행하는 명령어이며 list로 표기한 것입니다.
ENTRYPOINT 이미지 생성 시 변동이 없는 명령어를 의미합니다.
도커 실행 때 별도 인자 값으로 명령어를 추가할 경우 CMD 인자에 추가되므로 CMD 보다 더 상수적인 실행을 의미합니다. 
java -jar /app.jar

 

도커 컴포즈 (docker-compose.yml) 파일 생성

version: '3.0'
services:

  web:                                                                     ① 
    build: .                                                                      ② 
    ports:
      - 5000:8080                                                                     ③
    volumes:
      - .:/code
    depends_on:
      - mongo_user                                                                              ④

  mongo_user:                                                          ① 
    image: mongo                                                            ②
    ports:
      - 27017:27017                                                                  ③

  

Numbering 설명

  • 최상위 services는 docker-compose로 묶을 서비스 단위를 의미합니다.
    (위 예제에서는 2개의 컨테이너가 패키징 되었습니다.)
  • ① services 기준으로 one Depth인 [ web ] [ mongo_user ]
    • - [web]
      • spring web server 입니다.
    •  - [mongo_user]
      • spring web server에서 활용할 몽고 DB 입니다.
    • 두 명칭은 사용자 임의의 정의가 가능합니다. (구분을 위해 mongo에는 user를 붙였습니다.)

실행 프로세스

 

  • ② [ build ] [ image ]
    • - [build]
      • 현재 위치를 나타내는 접근 연산자 [ . ] 가 있습니다.
      • 현재 디렉토리 기준으로 Dockerfile 을 찾아 실행하여 이미지를 생성합니다.
    • - [image]
      • docker run mongo:latest 와 같이 이미지를 지정할 수 있습니다.
      • docker hub에서 pull 할 수 있는 존재하는 이미지를 입력합니다.
      • mongoDB 이미지인 mongo:latest를 호출하게 됩니다.
    • build와 image는 당연하지만 keyword 입니다.

 

  • ③ [ports]
    • docker run -p 6379:6379 ... 와 같은 포트 바인딩입니다.
    • - [web]
      • - 5000
        • 로컬 PC의 브라우저에서 요청을 보낼 때 입력할 포트입니다.
          ex) localhost:5000
      • - 8080
        • 도커 컨테이너에서 연결될 포트입니다.
          ex) 요청 5000 -> 응답 8080
    • - [mongo_user]
      • mongoDB에서 기본 포트는 27017로, 같은 값으로 바인딩하도록 설정하였습니다.
    • 위 ports 설정이 없을 경우 로컬의 입력이 도커 컨테이너와 통신하지 못합니다.
      그렇기 때문에 포트 바인딩 설정을 해주었습니다.
    • 사용자가 입력한 5000 :
      도커 컨테이너에서 받아 줄 : 8080

// TODO 이미지 삽입 : 사용자가 요청할 때 도커 컨테이너로 바인딩시키는 이미지

 

  • ④ [depends_on]
    • 컨테이너 간 의존 관계를 의미
    • [web] 컨테이너는
      [mongo_user] 에 의존적이다.
      • 예제에서 docker-compose up을 실행하게 되면 mongo_user 가 먼저 실행됩니다.

 

docker-compose를 사용하며 즐거웠던 부분이 있어 글을 작성하게 되었습니다.

Dockerfile이나 docker-compose.yaml 또는 .yml 파일의 설정은 이보다 더 많이 있습니다만, 

프로젝트를 내려받고 해당 명령어만 사용하면 데모를 확인해볼 수 있는 기능에 있어선 이 정도의 사용 방법으로 가능하였습니다.

gradle build
docker-compose up -d 

 

감사합니다.

반응형