[Docker] 바톤 팀 인프라 구조로 알아보는 도커
0. 들어가기 전에
우테코 프로젝트를 하면서 아래와 같은 그림(by 헤나)을 만나게 되었습니다.
???
아직 확정된 그림은 아니지만, 모르는게 너무 많았습니다.
도커는 단순히 환경 분리를 위한 목적? 으로만 알고 있었는데 개념이 잘 잡혀있지 않으니 어떻게해서 저런 그림이 나온지 1도 몰랐습니다.. Docker Hub는 뭐고 돌고래는 왜 고래 위에 타 있지? 아무튼 이 글을 통해 도커의 개념을 이용해서 위 그림을 해석해 보는 시간을 가져보겠습니다.
1. 도커란?
애플리케이션 개발, 배포 및 실행을 하기 위한 개방형 오픈 플랫폼
위에 있는 그림을 이해하려면 먼저 도커에 대한 이해가 필요합니다.
도커 공식 문서에 따르면, 도커를 사용하면 애플리케이션과 인프라를 쉽게 나눌 수 있으며, 애플리케이션을 다루는 것처럼 인프라를 다룰 수 있다고 나와 있습니다.
그렇다면 도커를 이용해서 무엇을 할 수 있을까요? 공식 문서에서는 살펴봅시다.
- 애플리케이션의 빠르고 일관적인 배포
- 도커는 컨테이너를 통해 개발자가 표준화된 환경에서 작업을 할 수 있도록 돕습니다.
- 배포 및 확장이 자유로움.
- 도커는 컨테이너 기반 플랫폼이어서 어떤 컴퓨터에서든 실행할 수 있기 때문에, 배포 및 확장이 자유롭습니다.
- 같은 하드웨어에서 더 많은 작업을 처리할 수 있음.
- 도커는 가볍고 빠르기 때문에 리소스를 적게 차지합니다.
여기서 공통으로 컨테이너라는 말이 등장합니다. 도커의 구조를 보면서 좀 더 자세히 알아보겠습니다.
2. 도커의 구조
도커는 크게 Daemon
, Client
, Registries
로 나뉩니다.
Docker Daemon(dockerd)
은 Docker API의 요청을 받아들이며 이미지, 컨테이너, 볼륨과 같은 것들을 관리합니다.
Docker Client(docker)
는 도커 사용자들이 주요하게 도커와 상호작용하는 방법입니다. 예를 들어 docker run
이라는 명령어는 dockerd
에게 요청을 보내는 명령어입니다.
Docker Registries
는 Docker Image들을 저장합니다. 그중 Docker Hub는 누구나 사용할 수 있는 public registry이고 보통 Docker Hub를 기본으로 사용합니다. docker run
이나 docker push
를 사용하면 Docker Hub에서 이미지를 가지고 오거나 저장합니다.
이제 그림에 나와 있는 image
와 container
에 대해 알아보겠습니다.
image
는 도커의 컨테이너를 생성할 때 사용하는 읽기 전용 템플릿입니다. Docker Hub에서 pull을 받아 사용할 수도 있고 Dockerfile
을 형성해서 직접 만들 수도 있습니다.
container
는 도커 이미지의 실행 가능한 인스턴스입니다. 이미지를 통해 생성됩니다. 기본적으로 호스트 머신 안에서 다른 컨테이너와 분리되어 있습니다.
그렇다면 컨테이너는 VM과 비슷한 역할을 하는 것 같은데 어떤 차이가 날까요?
2.1 Container vs VM
컨테이너와 VM의 차이를 보여주는 유명한 그림입니다. 왼쪽은 VM이고 오른쪽은 컨테이너로 이루어진 도커입니다.
둘은 모두 APP이 격리가 되어있다는 점에서 공통점이 있습니다. 차이점은 OS가 공통이냐 독립적이냐의 차이인데요. 이러한 차이 때문에 컨테이너가 VM보다 가볍다는 장점이 있습니다. 참고로 컨테이너는 OS가 독립되어 있기 때문에 Host OS의 커널을 통해서 자원을 공유받습니다.
3. Docker Compose
YAML 파일로 여러 개의 컨테이너를 구축 및 실행 순서를 자동으로 관리하는 기능
마지막으로 Docker Compose에 대해서 알아보겠습니다.
만약에 여러분이 도커로 mysql을 띄운다면 어떻게 할까요? 단순히 이미지를 받고 컨테이너를 만들면 쉽게 할 수 있을 겁니다. 하지만 도커로 mysql를 열고 spring 서버를 추가하고 간단하게 vue로 화면을 만든다면 어떻게 할까요? 이것도 앞처럼 각각 하면 됩니다. 하지만 이 작업을 10대의 컴퓨터에서 하려면??
이 때 사용하는게 Docker Compose 입니다.
아래는 Docker Compose로 MySQL DB를 설정하는 파일의 예시입니다.
version: '3' # compose 파일 버전
services:
db: # service
image: mysql:8.0 # 사용할 이미지
container_name: mysql # 컨테이너 이름
ports: # 포트 설정
- "3306:3306" # (컨테이너 외부 : 컨테이너 내부)
environment: # 환경변수 설정
MYSQL_ROOT_PASSWORD: passowrd
TZ: Asia/Seoul
command: # 명령어 설정
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes: # volume 설정 (컨테이너 내부의 정보와 host의 정보를 매핑)
- ./db/conf.d:/etc/mysql/conf.d
- ./db/data:/var/lib/mysql
- ./db/initdb.d:/docker-entrypoint-initdb.d
4. 결론
다시 위 그림을 살펴봅시다. 조금은 이해가 되나요? 왼쪽은 Github Actions로 빌드된 파일을 이미지로 만들어 Docker Hub에 저장하는 것을 의미합니다. 빌드된 파일을 Registry인 Docker Hub에 올려서 누구나 다운받을 수 있도록 하는 것이죠. 그리고 오른쪽은 EC2 내부에 있는 Github Self Host Runner가 Github Repo에 push가 일어나면 Docker Hub에서 이미지 pull하고 Spring Boot를 실행시킨다는 그림이 되겠습니다. 이렇게 되면 Spring Boot도 Docker 안에서 실행될 것 같은데 이건 해보고 그림을 변경하든지 다시 이해하든지 해야겠습니다.
※ 참고
'개발 > [우테코]' 카테고리의 다른 글
바톤의 DB Replication (0) | 2023.10.14 |
---|---|
build 할 때 Rest Docs 파일이 생성이 안되는 문제 트러블 슈팅 (0) | 2023.08.20 |
[Nginx] 하나의 EC2 안에서 React와 Spring 통신하기 (2) | 2023.08.06 |
[Docker] 도커 컨테이너 간 통신 트러블 슈팅 (0) | 2023.07.30 |
바톤 팀이 Java17를 사용하는 이유 (2) | 2023.07.16 |