MSA-2. Docker와 Docker 적용기
도커(Docker)란 뭘까
Docker는 소프트웨어 개발과 배포를 도와주는 컨테이너(Container) 기술이다. 우리는 도커를 사용하여 애플리케이션을 빌드, 배포, 실행하는 과정을 쉽게 관리할 수 있다.
컨테이너(Container)?
컨테이너는 애플리케이션과 그 실행 환경을 함께 패키징하여 어디서든 동일하게 실행될 수 있도록 해주는 기술이다.
Docker 주요 개념 정리
- 이미지(Image): 실행 가능한 애플리케이션과 그 환경을 정의한 파일. 코드, 런타임, 라이브러리 등을 포함하며, 변경 불가능. 이미지는 Dockerfile로 만든다! 어느 순간을 포착한 사진처럼, 모든 실행환경을 이미지로 담아내는 것으로 연관지었더니 이해됐다.
- 컨테이너(Container): 그 이미지를 실행한 상태. 이미지의 인스턴스로서, 애플리케이션이 실제로 동작하는 환경을 제공한다.
그럼 이런 이점을 가진 Docker를 MSA 에서 사용한다면…
- 격리 및 독립성 보장
- Docker는 각 마이크로서비스를 독립적인 컨테이너로 실행할 수 있게 한다. 이를 통해 각 서비스가 다른 서비스와 격리되어 독립적으로 배포, 확장 및 유지관리될 수 있다.
- 의존성 관리: 각 서비스는 자체적인 라이브러리와 종속성을 가질 수 있고 다른 서비스와 충돌하지 않음
- 안정성: 하나의 서비스가 실패하더라도 다른 서비스에 영향을 미치지 않음
- Docker는 각 마이크로서비스를 독립적인 컨테이너로 실행할 수 있게 한다. 이를 통해 각 서비스가 다른 서비스와 격리되어 독립적으로 배포, 확장 및 유지관리될 수 있다.
- 일관된 환경 제공
- Docker 컨테이너는 동일한 이미지를 기반으로 로컬 개발 환경, 테스트 환경, 스테이징 환경, 프로덕션 환경에서 일관된 동작을 보장한다. 이는 “Works on my machine”를 해결할 수 있다.
- 환경 일관성: 모든 환경에서 동일한 이미지와 설정을 사용기 때문에 일관된 동작 보장
- 환경 설정 자동화: Dockerfile과 Compose 파일을 사용하여 환경 설정을 코드로 관리할 수 있음
- Docker 컨테이너는 동일한 이미지를 기반으로 로컬 개발 환경, 테스트 환경, 스테이징 환경, 프로덕션 환경에서 일관된 동작을 보장한다. 이는 “Works on my machine”를 해결할 수 있다.
- 효율적인 리소스 사용
- Docker는 가상 머신(VM)에 비해 더 적은 오버헤드로 컨테이너를 실행한다. 이는 동일한 하드웨어에서 더 많은 마이크로서비스를 실행할 수 있음을 말한다.
- 빠른 시작 시간: 컨테이너는 VM보다 훨씬 빠르게 시작 및 중지
- 적은 리소스 사용: 컨테이너는 VM에 비해 더 적은 CPU, 메모리 및 스토리지를 사용함
- Docker는 가상 머신(VM)에 비해 더 적은 오버헤드로 컨테이너를 실행한다. 이는 동일한 하드웨어에서 더 많은 마이크로서비스를 실행할 수 있음을 말한다.
- 배포 및 확장 용이
- Docker는 컨테이너를 쉽게 빌드, 배포 및 확장할 수 있는 도구와 워크플로우를 제공한다.
- 자동화된 배포: CI/CD 파이프라인에서 Docker 이미지를 사용하여 자동화된 배포를 쉽게 구성할 수 있음
- 확장성: Docker Swarm, Kubernetes와 같은 오케스트레이션 도구를 사용하여 컨테이너가 쉽게 확장됨
- Docker는 컨테이너를 쉽게 빌드, 배포 및 확장할 수 있는 도구와 워크플로우를 제공한다.
- 복구 및 롤백 용이
- Docker 이미지를 사용하면 특정 버전의 애플리케이션을 쉽게 복구하거나 롤백할 수 있다.
- 버전 관리: Docker 이미지는 버전 관리를 통해 특정 시점의 상태로 쉽게 되돌릴 수 있음
- 복구 용이성: 문제가 발생했을 때 이전 버전의 이미지를 사용하여 빠르게 복구 가능
- Docker 이미지를 사용하면 특정 버전의 애플리케이션을 쉽게 복구하거나 롤백할 수 있다.
- 개발 및 테스트 환경 간소화
- Docker는 로컬 개발 환경에서 프로덕션과 동일한 환경을 쉽게 구성할 수 있다.
- 개발 환경 통합: 모든 개발자가 동일한 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로 포트 넘버를 바꿔 주고 빌드에 성공하였다.
Comments