코드 저장소.

도커 컴포즈 사용법 본문

웹개발/Web

도커 컴포즈 사용법

slown 2024. 6. 23. 22:44

목차

1.Docker-Compose?
2.Docker-Compose의 필요성?

3.예제

 

1.Docker-Compose?

Docker-Compose는 복수의 컨테이너를 정의하고 실행하기 위한 도구입니다. docker run을 통해서 실행하는 모든 어플리케이션은 docker-compose 명령어를 사용하여 실행할 수 있습니다.

2.Docker-Compose의 필요성?

도커를 사용하다보면 여러 개의 컨테이너가 하나의 애플리케이션으로 동작할 때 테스트하려면 각 컨테이너를 하나씩 생성해야 합니다. 

docker run --name mysql -d alicelk106/composetest:mysql mysqld
docker run -d -p 80:80 \\
--link mysql:db --name web \\
alicek106/composetest:web apachectl -DFOREGROUND

 

위의 명령어는 아파치 웹 서버 컨테이너와 mysql 컨테이너를 생성후 여러 컨테이너로 구성된 애플리케이션을 구축하기 위해 run 명령어를 여러번 사용해야 하지만 테스트 하기가 번거롭다. 이를위해 도커 컴포즈(Docker Compose)는 컨테이너를 이용한 서비스의 개발과 CI를 위해 여러 개의 컨테이너를 하나의 프로젝트로서 다룰 수 있는 작업 환경을 제공한다. 컨테이너의 수가 많아지고 정의 할 옵션이 많아지면 도커 컴포즈를 사용하는 게 좋습니다. 

 

3.예제

우선 프로젝트의 구조는 다음과 같습니다.

 

먼저 자바를 구동시킬 도커파일을 작성합니다.

해당 도커파일의 내용은 다음과 같습니다.

 

  • FROM openjdk:17-jdk
    • OpenJDK 17 이미지를 기반으로 새로운 이미지를 생성합니다.
  • ARG JAR_FILE=build/libs/*.jar
    • 빌드된 JAR 파일의 경로를 변수로 정의합니다.
  • COPY ${JAR_FILE} app.jar
    • 해당 JAR 파일을 Docker 이미지 내에 app.jar로 복사합니다.
  • ENTRYPOINT[ java -Djava.security.egd=file:/dev/./urandom -jar /app.jar]
    • 컨테이너가 시작되면 java -Djava.security.egd=file:/dev/./urandom -jar /app.jar 명령어를 실행하여 Java 애플리케이션을 실행합니다.

그 다음 docker-compose.yml에 컨테이너에 관련된 내용을 작성을 합니다.

version: '3'

services:
  database:
    container_name: maria-db
    image: mariadb:10.11.2
    environment:
      MARIADB_DATABASE: test
      MARIADB_USER: "root"
      MARIADB_ROOT_PASSWORD: "root"
      MARIADB_HOST: '%'
      TZ: 'Asian/Seoul'
    ports:
      - "3307:3306"
    restart: always
    networks:
      - compose
  redis-cache:
    container_name: redis-cache
    image: redis:latest
    command: redis-server --port 6379
    ports:
      - "6379:6379"
    networks:
      - compose
  redis-session:
    container_name: redis-session
    image: redis:latest
    command: redis-server --port 6380
    ports:
      - "6380:6379"
    networks:
      - compose
  application1:
    container_name: application-1
    restart: always
    build: .
    ports:
      - "8081:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mariadb://maria-db:3306/test
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "root"
    depends_on:
      - database
      - redis-cache
      - redis-session
    networks:
      - compose

  application2:
    container_name: application-2
    restart: always
    build: .
    ports:
      - "8082:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mariadb://maria-db:3306/test
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "root"
    depends_on:
      - database
      - redis-cache
      - redis-session
    networks:
      - compose

  application3:
    container_name: application-3
    restart: always
    build: .
    ports:
      - "8083:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mariadb://maria-db:3306/test
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "root"
    depends_on:
      - database
      - redis-cache
      - redis-session
    networks:
      - compose
networks:
  compose:

 

위의 설정파일을 하나씩 보면 다음과 같이 설명을 할 수 있습니다.

 

version : '3' 

- 도커 컴포즈의 버전입니다.

 

services: 

-service는 service 밑으로 실행하려는 컨테이너를 설정할 수 있습니다.

database:
container_name: maria-db
image: mariadb:10.11.2
environment:
MARIADB_DATABASE: test
MARIADB_USER: "root"
MARIADB_ROOT_PASSWORD: "root"
MARIADB_HOST: '%'
TZ: 'Asian/Seoul'
ports:
- "3307:3306"
  restart: always
  networks:
- compose
redis-cache:
    container_name: redis-cache
    image: redis:latest
    command: redis-server --port 6379
    ports:
      - "6379:6379"
    networks:
      - compose
  redis-session:
    container_name: redis-session
    image: redis:latest
    command: redis-server --port 6380
    ports:
      - "6380:6379"
    networks:
      - compose

 

database(MariaDB)에 관련된 컨테이너의 설정입니다. 설정 내용은 다음과 같습니다.

 

container_name: 컨테이너의 이름
image: 해당 컨테이너의 이미지
environment : 디비에 관련된 설정을 의미합니다. 
port : 포트의 경우에는 '호스트 포트:컨테이너 포트'로 되어있습니다. 여기서 호스트 포트는 외부에 노출할 포트를 의미합니다. 
restart : 컨테이너를 다시 시작을 할때 사용되는 설정이고 특정 컨테이너가 작동하지 않을때만 사용이 되는 설정도 있습니다.  
network : 서비스(컨테이너)가 소속된 네트워크 입니다. 따로 지정하지 않을 경우 default_${project}와 같이 지정됩니다. 기본적으로 컨테이너는 같은 네트워크에 있어야 서로 통신이 가능합니다.
command : 컨테이너가 실행될 때 수행할 명령어를 설정합니다.

application1:
    container_name: application-1
    restart: always
    build: .
    ports:
      - "8081:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mariadb://maria-db:3306/test
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "root"
    depends_on:
      - database
      - redis-cache
      - redis-session
    networks:
      - compose

  application2:
    container_name: application-2
    restart: always
    build: .
    ports:
      - "8082:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mariadb://maria-db:3306/test
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "root"
    depends_on:
      - database
      - redis-cache
      - redis-session
    networks:
      - compose

  application3:
    container_name: application-3
    restart: always
    build: .
    ports:
      - "8083:8080"
    environment:
      SPRING_DATASOURCE_URL: jdbc:mariadb://maria-db:3306/test
      SPRING_DATASOURCE_USERNAME: "root"
      SPRING_DATASOURCE_PASSWORD: "root"
    depends_on:
      - database
      - redis-cache
      - redis-session
    networks:
      - compose

 

위에서 작성한 설정에서 중복된 부분은 제외한 부분을 설명하면 다음과 같다.

depends_on : 특정 컨테이너의 의존 관계를 설정합니다.
build : 도커 이미지를 빌드하기 위한 경로나 설정을 지정합니다.

 

위와 같이 작성을 하고 난뒤에 gradle에서 해당 프로젝트를 빌드를 합니다.  빌드를 하는 명령어는 다음과 같습니다.

./gradlew build

 

빌드가 완료가  되면 다음과 같이 jar파일이 나옵니다. 

 

마지막으로 도커 컴포즈를 작동하기 위해서 명령어를 다음과 같이 입력을 하거나 인텔리제이를 사용을 하면 화면에 있는 맨위에 있는 화살표를 누르면 작동을 합니다.

 

- 도커 컴포즈 작동 명령어

docker-compose up

 

- 도커 컴포즈 중지 명령어

docker-compose down

 

성공을 하면 위의 사진과 같이 나오면 제대로 작동이 된 것입니다.

'웹개발 > Web' 카테고리의 다른 글

Jmeter  (0) 2024.09.21
Docker  (0) 2024.09.05
JWT vs Session  (0) 2024.05.26
Scale-up vs Scale-out  (0) 2024.05.18
Rest Api  (0) 2024.02.13