티스토리 뷰

728x90

기본 개념

볼륨(Volume)

  • 데이터를 컨테이너와 호스트 머신 혹은 컨테이너 사이에서 공유하기 위해 사용된다. 컨테이너 내부의 데이터는 컨테이너가 삭제될 경우 함께 삭제되는 데, 이를 방지하고 데이터를 영속적으로 저장, 관리할 수 있도록 합니다. 
  • 볼륨 마운트: 도커에서 관리하는 저장소를 사용. 
  • 바인드 마운트: 호스트 머신의 특정 디렉터리나 파일을 컨테이너에 직접 연결. 
  • 임시 메모리 마운트(TempFS): 주 메모리 영역에 마운트한다. 휘발성 메모리 기반 저장소. 

볼륨 관련 명령어 

// 볼륨 생성 
docker volume create [VOLUME_NAME]

// 볼륨 삭제
docker volume rm [VOLUME_NAME]

// 볼륨 상세 정보
docker volume inspect [VOLUME_NAME]

// 볼륨 목록
docker volume ls

// 마운트되지 않은 볼륨 모두 삭제
docker volume prune

// 컨테이너 실행 시 볼륨 마운트
docker run -d --name [CONTAINER_NAME] -v [VOLUME_NAME]:[CONTAINER_PATH] [IMAGE_NAME]

// 익명 볼륨 사용하여 컨테이너 실행
docker run -d --name [CONTAINER_NAME] -v /path/in/container [IMAGE_NAME]

// 볼륨 생성과 동시에 컨테이너 실행
docker run -d --name [CONTAINER_NAME] -v [HOST_PATH]:[CONTAINER_PATH] [IMAGE_NAME]

// 특정 볼륨 데이터 확인
docker run --rm -v [VOLUME_NAME]:[CONTAINER_PATH] [IMAGE_NAME] ls [CONTAINER_PATH]

 

 

네트워크(Network)

  • 컨테이너 사이 혹은 컨테이너와 외부 상이의 통신을 설정하고 관리합니다. 
  • 네트워크를 사용하는 주요 이유는 연결 문제 해결보안 강화, 환경 분리 및 네트워크 격리, 확장성과 유연성 입니다.
// 컨테이너에 네트워크 연결 
docker network connect [NETWORK_NAME] [CONTAINER_NAME]

// 네트워크 연결 해제 
docker network disconnect [NETWORK_NAME] [CONTAINER_NAME]

// 네트워크를 생성
docker network create [NETWORK_NAME]

// 네트워크 상세 정보 
docker network inspect [NETWORK_NAME]

// 네트워크 목록 확인 
docker network ls

// 아무 컨테이너도 접속하지 않은 네트워크 삭제
docker network prune

// 네트워크 삭제 
docker network rm [NETWORK_NAME]

 

 

컴포즈(Compose)

  • 여러 컨테이너를 하나의 설정 파일(YAML)로 관리할 수 있도록 하는 도구입니다. 컨테이너의 실행, 종료, 삭제 및 네트워크, 볼륨 등의 설정을 텍스트 파일 포맷으로 관리할 수 있습니다.  
// 컴포즈 실행 
docker-compose up 

// 옵션
// 컨테이너 실행 전 이미지를 빌드: --build
// 백그라운드에서 실행: -d

// 컴포즈 중지 
docker-compose down

// 옵션
// 볼륨도 같이 삭제: --volumes

// 이미지 빌드 
docker-compose build

// 실행 중인 컨테이너 확인 
docker-compose ps

// 로그 확인 
docker-compose logs

// 명령어 실행 
docker-compose exec <서비스명> <명령어>

 

ToDoList 코드

전체 코드

  • 아래 링크에서 실습 코드를 다운로드 할 수 있습니다. 
 

GitHub - JangBogwang/docker_todo: 도커 실습(todo list 만들기)을 위한 코드입니다.

도커 실습(todo list 만들기)을 위한 코드입니다. . Contribute to JangBogwang/docker_todo development by creating an account on GitHub.

github.com

 

 

Docker 실습

  • 본 실습은 모두 CLI 환경에서 진행합니다. 

도커 파일 작성 (백엔드)

  • 현재 디렉토리를 위에서 다운로드 받은 폴더 내부의 backend/todolist로 이동. 
  • 먼저 백엔드의 application.property를 수정한다. 데이터 베이스의 사용자 이름과 비밀번호 입력
  • 이때 db는 docker 네트워크 상에서만 연결하도록 하기 위하여 파일을 아래와 같이 분리한다. 
  • 이미지는 로컬에서 실행되어야만 빌드할 수 있으므로 로컬에서는 로컬 설정, docker container에서는 docker 전용 설정이 반영되도록 한다.  

application.properties 작성 

# 기본 설정 
spring.application.name=todolist
spring.profiles.active=local

application-local.properties 생성 

spring.datasource.url=jdbc:mysql://localhost:3306/todo_app?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=ssafy
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

application-docker.properties 생성 

spring.datasource.url=jdbc:mysql://db:3306/todo_app?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=ssafy
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect

 

  • 그 다음 jar 파일을 생성. 
mvnw clean package -DskipTests
  • 이후 루트 디렉토리에 Dockerfile을 작성. 
FROM openjdk:17-jdk-slim
COPY target/todolist-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

 

도커 파일 작성(FE)

  • 현재 디렉토리를 frontend로 이동 
  • 도커 파일 작성 
# Nginx의 최신 버전을 기반으로 하는 도커 이미지를 사용합니다.
FROM nginx:latest

# 현재 디렉토리의 index.html 파일을 Nginx의 기본 HTML 경로로 복사합니다.
# 즉, Nginx 서버에서 제공할 HTML 파일을 지정합니다.
COPY index.html /usr/share/nginx/html/index.html

# 도커 컨테이너가 외부와 통신할 수 있도록 80번 포트를 엽니다.
# Nginx는 기본적으로 80번 포트를 사용하여 HTTP 요청을 처리합니다.
EXPOSE 80

도커 파일 작성(DB)

  • 현재 디렉토리를 DB로 이동 
  • 도커 파일 작성 
# MySQL의 최신 버전을 사용합니다.
FROM mysql:latest

# 데이터베이스 초기화 스크립트를 복사합니다.
COPY ./init.sql /docker-entrypoint-initdb.d/

# MySQL 기본 포트 3306을 노출합니다.
EXPOSE 3306

Docker Compose 작성 및 실행

version: '3.8'  # Docker Compose 파일의 버전. 최신 기능을 사용하려면 3.8 이상 권장.

services:  # 각 서비스(컨테이너)를 정의하는 섹션.
  db:  # MySQL 데이터베이스 서비스.
    build:
        context: ./DB  # MySQL 설정을 포함한 디렉토리를 빌드 컨텍스트로 사용.
    container_name: db  # 컨테이너 이름을 'db'로 설정.
    environment:  # MySQL 환경 변수를 설정.
      MYSQL_ROOT_PASSWORD: 비밀번호  # MySQL 루트 사용자 비밀번호.
      MYSQL_DATABASE: todo_app  # 생성할 기본 데이터베이스 이름.
    volumes:
      - db-data:/var/lib/mysql  # MySQL 데이터를 로컬 볼륨(db-data)에 저장.
    networks:
      - internal-network  # 다른 컨테이너와 통신할 내부 네트워크에 연결.
    healthcheck:
      test: ["CMD-SHELL", "mysqladmin ping -h localhost"]
      interval: 10s
      timeout: 5s
      retries: 5


  be:  # 백엔드(Spring Boot) 서비스.
    build:
      context: ./backend/todolist  # Spring Boot 프로젝트 디렉토리를 빌드 컨텍스트로 사용.
    container_name: be  # 컨테이너 이름을 'be'로 설정.
    environment:  # 백엔드에서 사용할 환경 변수를 설정.
      - SPRING_PROFILES_ACTIVE=docker  # Spring Boot에서 'docker' 프로파일 활성화.
    depends_on:
      db:
        condition: service_healthy  # 이 서비스는 'db' 서비스가 실행된 후에 실행.
    networks:
      - internal-network  # 내부 네트워크에서만 통신 가능.

  fe:  # 프론트엔드 서비스.
    build:
      context: ./frontend  # 프론트엔드 프로젝트 디렉토리를 빌드 컨텍스트로 사용.
    container_name: fe  # 컨테이너 이름을 'fe'로 설정.
    ports:
      - "3000:3000"  # 외부에서 접근 가능하도록 3000 포트를 호스트와 연결.
    networks:
      - internal-network  # 내부 네트워크에서 백엔드와 통신.

networks:  # 네트워크 설정.
  internal-network:  # 서비스 간 통신을 위한 내부 네트워크 정의.
    driver: bridge  # 네트워크 드라이버를 'bridge'로 설정.

volumes:  # 데이터 지속성을 위한 볼륨 설정.
  db-data:  # MySQL 데이터가 저장될 볼륨.
  • 도커 컴포즈 실행 

 

728x90