도커, 도커 컴포즈

Seung jun Cha·2023년 5월 24일
1

1. 도커

  • 컨테이너 기반의 오픈소스 가상화 플랫폼으로 컨테이너를 사용하여 응용프로그램을 더 쉽게 만들고, 배포하고 실행할 수 있도록 설계된 도구이다. 컨테이너는 어플리케이션 환경에 구애 받지않고 손쉽게 배포 관리를 할 수 있게 해준다
  • 하이퍼바이저는 가상머신을 구동할 수 있게 해주는 소프트웨이이다. 도커는 하이버바이저 구조를 토대로 등장했고 각 컨테이너 안에 다른 환경을 구축할 수 있다.
  1. 도커 파일 : 도커 이미지를 구성하기 위해 필요한 의존성, 소스코드 등을 하나의 file로 기록하여 이미지화 시킬 명령 파일이다. 도커 파일의 명령을 기반으로 도커 이미지가 생성된다.

  2. 도커 이미지 : 도커 컨테이너 생성, 실행에 필요한 명령들을 가지고 있는 스크립트. 많이 사용되는 것들은 공식적으로 찾아서 사용할 수 있다.

2. 도커 컴포즈

  • 도커 컴포즈 : Docker Compose란 여러개의 컨테이너로 이루어진 서비스를 구축 및 네트워크 연결, 실행 순서를 자동으로 관리하는 도구이다.
    docker-compose.yml을 사용하면 어느 서버에든 도커 환경만 설치되어 있을 때, git 등으로 해당 프로젝트를 다운받은 후 똑같은 환경을 조성해서 문제 없이 서비스 돌릴 수 있다.
  • build.gradle 파일에서 .jar 파일이름을 변경할 수 있다. 명령어는
    ./gradlew build
bootJar {
    archiveFileName = 'app.jar'
}
version: "3.8"               # 도커 컴포즈의 버전, 도커버전과의 호환성을 고려
services:                    # 이 항목 밑에 실행하려는 컨테이너들을 정의
  pharmacy-recommendation-redis:     # container_name이 따로 설정되어 있지 않다면 이것과 비슷한 이름으로 컨테이너 이름이 설정됨
    container_name: pharmacy-recommendation-redis    # 컨테이너 명
    build:   # 도커 허브에서 기본이미지를 다운 받아서 사용하는 것이 아닌 Dockerfile로 이미지를 빌드하겠다.
      dockerfile: Dockerfile
      context: ./redis   # dockerfile을 사용하는 폴더명(일반적으로 하위폴더명)
    image: chaseungjun/pharmacy-recommendation-redis
    ports:
      - "6379:6379"
    restart: always   # 컨테이너가 다운되었을 경우 항상 재시작
    
  pharmacy-recommendation-database:
    container_name: pharmacy-recommendation-database
    build:
      dockerfile: Dockerfile
      context: ./database
    image: chaseungjun/pharmacy-recommendation-database
    environment:
      - MARIADB_DATABASE=pharmacy-recommendation
      - MARIADB_ROOT_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
    volumes:
      - ./database/config:/etc/mysql/conf.d
      - ./database/init:/docker-entrypoint-initdb.d
    ports:
      - "3306:3306"      # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
      
  pharmacy-recommendation-app:
    container_name: pharmacy-recommendation-app
    build: .              # 파일의 위치
    depends_on:     # database, redis 컨테이너가 생성,실행된 다음에 app컨테이너를 실행시킨다. (의존성을 생각하면 됨), 
    초기화까지 완료되어서 database,redis에서 사용가능한 상태가 되는 것은 별개임. 돌아가기만 한 상태에서 database가 접근하면 사용 불가능할 수도 있다.,
      - pharmacy-recommendation-database
      - pharmacy-recommendation-redis
    image: chaseungjun/pharmacy-recommendation-app
    environment:        # .env 파일로 환경변수 설정
      - SPRING_DATASOURCE_USERNAME=${SPRING_DATASOURCE_USERNAME}
      - SPRING_DATASOURCE_PASSWORD=${SPRING_DATASOURCE_PASSWORD}
      - SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
      - KAKAO_REST_API_KEY=${KAKAO_REST_API_KEY}
    ports:
      - "80:8080"   # 브라우저의 기본 포트인 80 포트로 접근하면 스프링부트의 기본포트  인 8080 포트로 보낸다
    restart: always # depends on은 실행 순서만 컨트롤 할뿐,
      # 컨테이너 안의 서비스가 실행가능한 상태인지까지는 확인 하지 않기 때문에
    # DB 또는 Redis가 아직 실행가능한 상태가 아니여서 실패하는 경우 재시작 하도록 설정
  • docker-compose -f docker-compose-local.yml up // 실행

  • docker-compose -f docker-compose-local.yml down // 중지 및 컨테이너 정리

  • 한글이 깨지는 경우 아래 코드를 넣은 .cnf 파일을 생성해서 적절한 위치에 넣어준다. 위치는 db마다 다르므로 찾아볼 것

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
skip-character-set-client-handshake

[mysqldump]
default-character-set=utf8mb4
  • Docker compose에서 환경 변수 정보 들을 분리하여 별도의 파일로 구성할
    때 간편한 방법은 Compose 파일이 위치한 경로에 .env 파일을 구성
    작성한 .env 파일은 별다른 설정 없이 Docker Compose에 바로 반영된다.
    추후 암호화를 통해 더 높은 보안을 제공하는 오픈소스 HashiCorp Vault 고려하자
$ docker-compose config // .env 파일 자동 반영
$ docker-compose up // 이미지 없을 때 이미지 빌드 후 컨테이너 실행(이미지 존재하는 경우 해당 이미지 사용) 
$ docker-compose up --build // 이미지가 있든 없든 재빌드 하여 컨테이너 실행
$ docker-compose stop // 현재 실행중인 컨테이너 종료
$ docker-compose down // dockerCompose에서 사용하는 컨테이너 삭제

따로 컨테이너 이름이나 아이디를 적지 않는 이유는 
현재폴더에 있는 docker-compose파일을 대상으로 하기 때문이다

주의해야 할 것은 .env 는 도커 컴포즈가 실행될 때 참조하는 파일이므로 application.yml은 따로 환경변수를 설정해야한다는 것이다.
클라우드로 배포할 때는 컨테이너로 띄우기 때문에 .env파일을 참조하지만 로컬에서 개발할때는 application.yml를 참조한다.

2-1 도커 컴포즈 주요 명령

-참고
패스트캠퍼스 10개 프로젝트로 완성하는 백엔드 웹개발(Java/Spring) 초격차 패키지 Online.

0개의 댓글