각각의 프로젝트는 Frontend, Backend, Database로 구성된다.
하나의 서버에서 하나의 서비스만 배포한다면 문제가 없지만, 여러 서비스를 동시에 배포하게 되면 서비스마다의 버전 불일치와 같은 문제가 생길 수 있다.
이를 해결하기 위해 가상환경을 이용해 분할하면서 효율성이 떨어지는 문제가 생긴다.
이러한 문제를 해결하는 방안이 Docker의 컨테이너이다.
컨테이너를 활용하면 가상환경이 아니라 컨테이너를 통해 분리되기 때문에 버전의 불일치로 인한 혼란을 막고, 가상환경으로 인한 효율성 저하도 막을 수 있다.
또, 배포 환경과 개발 환경의 불일치 문제 또한 컨테이너로 해결할 수 있다.
개발자는 각 컨테이너들이 어떻게 설계되고, 지정한 곳에 어떻게 설치가 되며 어떤 업무를 수행할지, 여러 컨테이너들이 어떻게 연결돼서 함께 서비스를 구성하며 동작할지 설계도(Dockerfile)에 명시해 둘 수 있다.
서버에서는 이 설계대로 컨테이너들을 설치해 동일하게 서비스를 실행할 수 있게 해준다.
docker --version
명령어를 통해 설치를 확인한다.docker run -it node
를 통해 컨테이너를 만들거나 실행하고 컨테이너 내에서 CLI를 실행할 수 있다.
docker images
를 통해 이미지를 확인할 수 있다.
docker exec -it '컨테이너명' bash
docker ps
-a
를 뒤에 덧붙이면 실행중이 아닌 전체 목록을 확인한다.Frontend Dockerfile(설계도)
RUN npm i -g http-server
RUN 명령어는 이미지 생성 과정에서 실행할 명령어WORKDIR /home/node/app
WORKDIR : 이미지 내에서 명령어를 실행할 디렉토리CMD ["http-server", "-p", "8080", "./public"]
CMD : 컨테이너 실행 시 실행할 명령어이미지 생성 명령어 ( Dockerfile과 같은 디렉토리에서)
docker build -t {이미지명}
컨테이너 생성 & 실행 명령어
docker run --name {컨테이너명} -v $(pwd):/home/node/app -p 8080:8080 {이미지명}
Database Dockerfile (설계도)
FROM mysql:5.7
# 이미지 환경변수 세팅
# 서버의 환경변수 등을 활용하세요
ENV MYSQL_USER '유저명'
ENV MYSQL_PASSWORD 'password'
ENV MYSQL_ROOT_PASSWORD 'root_password'
ENV MYSQL_DATABASE 'db명'
# 도커환경에서 컨테이너 생성시 스크립트를 실행하는 폴더로 미리 작성된 스크립트들을 이동
COPY ./scripts/ /docker-entrypoint-initdb.d/
# 이미지 빌드 명령어 (현 파일과 같은 디렉토리에서)
# docker build -t {이미지명}.
# 실행 명령어 (터미널에 로그 찍히는 것 보기)
# docker run --name {컨테이너명} -it -p 3306:3306 {이미지명}
# 실행 명령어 (데몬으로 실행)
# docker run --name {컨테이너명} -p 3306:3306 -d {이미지명}
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"
해당 파일이 있는 경로에서 docker -compose up
을 통해 통합실행.