MSA-2. Docker와 Docker 적용기

MSA-2. Docker와 Docker 적용기

도커(Docker)란 뭘까

Docker는 소프트웨어 개발과 배포를 도와주는 컨테이너(Container) 기술이다. 우리는 도커를 사용하여 애플리케이션을 빌드, 배포, 실행하는 과정을 쉽게 관리할 수 있다.

컨테이너(Container)?

컨테이너는 애플리케이션과 그 실행 환경을 함께 패키징하여 어디서든 동일하게 실행될 수 있도록 해주는 기술이다.

Docker 주요 개념 정리

  1. 이미지(Image): 실행 가능한 애플리케이션과 그 환경을 정의한 파일. 코드, 런타임, 라이브러리 등을 포함하며, 변경 불가능. 이미지는 Dockerfile로 만든다! 어느 순간을 포착한 사진처럼, 모든 실행환경을 이미지로 담아내는 것으로 연관지었더니 이해됐다.
  2. 컨테이너(Container): 그 이미지를 실행한 상태. 이미지의 인스턴스로서, 애플리케이션이 실제로 동작하는 환경을 제공한다.

그럼 이런 이점을 가진 Docker를 MSA 에서 사용한다면…

  1. 격리 및 독립성 보장
    • Docker는 각 마이크로서비스를 독립적인 컨테이너로 실행할 수 있게 한다. 이를 통해 각 서비스가 다른 서비스와 격리되어 독립적으로 배포, 확장 및 유지관리될 수 있다.
      • 의존성 관리: 각 서비스는 자체적인 라이브러리와 종속성을 가질 수 있고 다른 서비스와 충돌하지 않음
      • 안정성: 하나의 서비스가 실패하더라도 다른 서비스에 영향을 미치지 않음
  2. 일관된 환경 제공
    • Docker 컨테이너는 동일한 이미지를 기반으로 로컬 개발 환경, 테스트 환경, 스테이징 환경, 프로덕션 환경에서 일관된 동작을 보장한다. 이는 “Works on my machine”를 해결할 수 있다.
      • 환경 일관성: 모든 환경에서 동일한 이미지와 설정을 사용기 때문에 일관된 동작 보장
      • 환경 설정 자동화: Dockerfile과 Compose 파일을 사용하여 환경 설정을 코드로 관리할 수 있음
  3. 효율적인 리소스 사용
    • Docker는 가상 머신(VM)에 비해 더 적은 오버헤드로 컨테이너를 실행한다. 이는 동일한 하드웨어에서 더 많은 마이크로서비스를 실행할 수 있음을 말한다.
      • 빠른 시작 시간: 컨테이너는 VM보다 훨씬 빠르게 시작 및 중지
      • 적은 리소스 사용: 컨테이너는 VM에 비해 더 적은 CPU, 메모리 및 스토리지를 사용함
  4. 배포 및 확장 용이
    • Docker는 컨테이너를 쉽게 빌드, 배포 및 확장할 수 있는 도구와 워크플로우를 제공한다.
      • 자동화된 배포: CI/CD 파이프라인에서 Docker 이미지를 사용하여 자동화된 배포를 쉽게 구성할 수 있음
      • 확장성: Docker Swarm, Kubernetes와 같은 오케스트레이션 도구를 사용하여 컨테이너가 쉽게 확장됨
  5. 복구 및 롤백 용이
    • Docker 이미지를 사용하면 특정 버전의 애플리케이션을 쉽게 복구하거나 롤백할 수 있다.
      • 버전 관리: Docker 이미지는 버전 관리를 통해 특정 시점의 상태로 쉽게 되돌릴 수 있음
      • 복구 용이성: 문제가 발생했을 때 이전 버전의 이미지를 사용하여 빠르게 복구 가능
  6. 개발 및 테스트 환경 간소화
    • Docker는 로컬 개발 환경에서 프로덕션과 동일한 환경을 쉽게 구성할 수 있다.
      • 개발 환경 통합: 모든 개발자가 동일한 Docker 이미지를 사용해 일관된 개발 환경 유지
      • 테스트 자동화: 테스트 환경을 쉽게 구축하고 자동화할 수 있음

이러한 장점을 가지고 있는 Docker 이기에, 왜 안 쓰냐고!

Docker 사용하기

dockerfile은 아래와 같이 간단하게 설정하였다.

FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENV TZ=Asia/Seoul
ENTRYPOINT ["java", "-jar", "/app.jar"]

docker-compose.yml은 아래와 같이 설정했다.

version: "3"

services:
  db:
    image: mysql:8.0
    ports:
      - '3307:3307'
    volumes:
      - ./db/conf.d:/etc/mysql/conf.d
      - ./db/data:/var/lib/mysql
      - ./db/initdb.d:/docker-entrypoint-initdb.d
    env_file: .env
    environment:
      TZ: Asia/Seoul
    networks:
      - backend
    restart: always

networks:
  backend:
  • mySQL에 접속할 수 있는 환경변수는 .env 파일로 따로 설정하였음.
    • (개인정보의 유출 위험으로 인해 .env 파일로 설정 후 .gitignore에 따로 .env 파일을 push할 수 없게끔 설정)

Trouble-Shooting

Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3306 -> 0.0.0.0:0: listen tcp 0.0.0.0:3306: bind: Only one usage of each socket address (protocol/networ
k address/port) is normally permitted.
  • 처음 yml의 ports를 3306으로 설정했으나, 위와 같은 에러 메시지가 나타나며 build되지 않았다. 로컬에서 3306번 포트가 이미 사용 중이란 뜻이라 3307로 포트 넘버를 바꿔 주고 빌드에 성공하였다.
judy

About judy

junior BE

Comments

comments powered by Disqus