Spring-Java/Docker

예제로 알아보는 도커(Docker)

현대타운301 2024. 4. 29. 23:18

 

세 줄 요약

- 도커는 리눅스 가상환경 기반의 컨테이너를 통해 서버를 구성하는 요소들에 대한 실행환경을 독립적으로 구성한다.

- 도커 허브(클라우드)는 각 요소들을 리눅스 컴퓨터에 설치된 모습인 이미지의 형태로 제공한다.

- 도커파일과 compose 파일을 통해 서버환경을 보다 쉽게 개발환경과 동일하게 구성할 수 있다.

 


 

Doker?

 

Docker

도커는 리눅스(Linux) 가상환경 형태에서 돌아가는 '컨테이너(Container)'를 통해 개발의 편의성을 제공합니다.

서버를 구성하는 요소들(언어, DB, 웹서버 등)이 '도커 허브(Docker Hub)'에서 '이미지(Image)' 형태로 제공됩니다.

  → 여기서 이미지란 리눅스 컴퓨터의 특정 상태를 캡처해서 박제해둔 것을 의미합니다.

  → 예를 들어 node 이미지는 Node.js가 설치된 상태를 클라우드인 도커 허브에 올려둔 것입니다.

 

 

편의기능

도커가 제공하는 대표적인 편의기능은 다음과 같습니다.

 

1) 개발 환경과 서버 환경을 동일하게 구성해준다.

  → '도커파일(Dockerfile)'과 'docker-compose.yml' 파일의 설치만으로 서버 배포(deployment)가 가능함

 

 

2) OS단까지 내려오지 않기 때문에 컴퓨터의 물리적 자원을 효율적으로 사용할 수 있다.

  → VM을 통한 가상 컴퓨팅과는 달리 '도커 엔진(Docker Engine)'으로 각 요소의 실행환경만 독립적으로 구성

  → 컴퓨터의 물리적 자원을 공유함으로써 각각의 요소들을 보다 가볍고 빠르게 설치하고 운영할 수 있음

VM과 Docker의 차이점 (출처 : 얄팍한 코딩사전 Youtube)

 


 

Docker 사용 예시

 

도커를 통해 아래와 같이 구성된 웹 어플리케이션을 서버에 배포하는 과정을 간단하게 살펴보겠습니다.

예시에 관한 자세한 내용은 해당 영상에서 확인할 수 있습니다.

 

1) 개발을 마친 후 각 요소들에 대한 도커파일을 생성한다.

  → 도커파일은 나만의 이미지를 만들기 위한 설계도 역할을 수행

  → 요소마다 하나씩 필요

  

frontend

FROM node:12.18.4

# 이미지 생성 과정에서 실행할 명령어
RUN npm install -g http-server 

# 이미지 내에서 명령어를 실행할(현 위치로 잡을) 디렉토리 설정
WORKDIR /home/node/app

# 컨테이너 실행시 실행할 명령어
CMD ["http-server", "-p", "8080", "./public"]

# 이미지 생성 명령어 (현 파일과 같은 디렉토리에서)
# docker build -t {이미지명} .

# 컨테이너 생성 & 실행 명령어
# docker run --name {컨테이너명} -v $(pwd):/home/node/app -p 8080:8080 {이미지명}

 

backend

FROM python:3.8.5

# 이미지 생성 과정에서 실행할 명령어
RUN pip3 install flask flask-cors flask-mysql

# 이미지 내에서 명령어를 실행할(현 위치로 잡을) 디렉토리 설정
WORKDIR /usr/src/app

# 컨테이너 실행시 실행할 명령어
CMD ["python3", "backend.py"]

# 이미지 생성 명령어 (현 파일과 같은 디렉토리에서)
# docker build -t {이미지명} .

# 컨테이너 생성 & 실행 명령어
# docker run --name {컨테이너명} -v $(pwd):/usr/src/app -p 5000:5000 {이미지명}

 

database

FROM mysql:5.7

# 이미지 환경변수들 세팅
# 실전에서는 비밀번호 등을 이곳에 입력하지 말 것!
# 서버의 환경변수 등을 활용하세요.
ENV MYSQL_USER mysql_user
ENV MYSQL_PASSWORD mysql_password
ENV MYSQL_ROOT_PASSWORD mysql_root_password
ENV MYSQL_DATABASE visitlog

# 도커환경에서 컨테이너 생성시 스크립트를 실행하는 폴더로
# 미리 작성된 스크립트들을 이동
COPY ./scripts/ /docker-entrypoint-initdb.d/

# 이미지 빌드 명령어 (현 파일과 같은 디렉토리에서)
# docker build -t {이미지명} .

# 실행 명령어 (터미널에 로그 찍히는 것 보기)
# docker run --name {컨테이너명} -it -p 3306:3306 {이미지명}

# 실행 명령어 (데몬으로 실행)
# docker run --name {컨테이너명} -p 3306:3306 -d {이미지명}

 

2) 모든 요소들을 한 번에 설치하기 위해 'docker-compose.yml' 파일을 생성한다.

  → 각 요소들은 compose 파일 내 'services' 항목으로 구성됨

  → 'build' 를 통해 각 요소에 대한 설치 진행

 

docker-compose.yml

version: '3'
services:
  database:
    # Dockerfile이 있는 위치
    build: ./database
    # 내부에서 개방할 포트 : 외부에서 접근할 포트
    ports:
      - "3306:3306"
  backend:
    build: ./backend
    # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
    volumes:
      - ./backend:/usr/src/app
    ports:
      - "5000:5000"
    # 환경변수 설정
    environment: 
      - DBHOST=database
  frontend:
    build: ./frontend
    # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리
    volumes:
      - ./frontend:/home/node/app
    ports:
      - "8080:8080"

 

 

서버 배포

 

도커 엔진에 의해 컨테이너가 run(생성 및 실행)되면서 각각의 요소에 대한 리눅스 기반 실행환경이 독립적으로 구성됨

 

 

 

* refs

https://www.youtube.com/watch?v=hWPv9LMlme8

https://www.yalco.kr/36_docker/