본문 바로가기
프로젝트/사이드 프로젝트

Docker image & Docker container 만들기

by 행복한 기린님 2023. 4. 5.

개요

식당 데이터를 구축하는 방법과 데이터 스키마 및 어떻게 쌓을 것인지에 대한 논의를 하던 중 지속되는 작업 미룸으로 프로젝트가 급격하게 루즈해졌다.

데이터가 생겨야 추가적인 프론트 작업이 가능해지기도 했고 핵심기능부터 만들고 출시하기 위해선 식당데이터를 우선적으로 작업이 되어야한다. 

서버작업을 하시는 팀원에게 맡길게 아니라 나도 크롤링 및 지도 API를 통해 서버작업에 동참해야하는 것인지 고민이 된다.

다음 프로젝트에서는 내가 서버를 주도적으로 잡기로했는데 지금 서버작업을 같이 하게된다면 다음 프로젝트에서 팀원에게 영향을 받게될 거라 생각이 들어 최대한 프론트작업만 하는게 좋을거라 판단되지만, 이렇게까지 늦어지면 내가 하는게 출시를 위한 길이라 보여 고민을 하고 있다.

 

우선은 팀원에게 맡겨뒀으니 이번주 까지는 다른 작업을 하겠다고 생각을 했고 다음 주 회의에서 같이 작업을 할지 논의를 할 예정이다.

 

그래서 이번에는 프론트작업보다는 도커 공부를 진행했다.

 

Docker

docker engine을 통해 docker image를 만들고 docker image를 실행하여 docker container를 만든다.

container는 리눅스에 이미 있던 기능이었지만, 존재하던 기술을 아주 깔끔하고 필요한 부분만 잘 다듬어 만든 것이 Docker이다

https://www.docker.com/

 

Docker: Accelerated, Containerized Application Development

Docker is a platform designed to help developers build, share, and run modern applications. We handle the tedious setup, so you can focus on the code.

www.docker.com

 

 

이번주에는 dockerfile을 만들고 docker image 생성 후, docker container를 실행했다.

 

먼저, Dockerfile을 프로젝트내에 생성한다.

# Dockerfile
# build stage
FROM node:lts-alpine as build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# production stage
FROM nginx:stable-alpine as production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

 

이후 ubuntu 또는 로컬 실행환경 shell에서 도커 이미지를 생성한다.

docker build -t chu .

-t 는 태그를 뜻하는 옵션으로 도커 이미지의 이름을 지정한다.

. 은 현재 위치를 뜻한다.

도커 이미지 생성

위 이미지 생성 캡처에서는 이미 생성한 이미지를 다시 생성했기에 캐시를 활용해 엄청 빠른 속도로 생성이 됐다.

 

도커는 이미지는 여러 레이어로 구성이 되어 있다.

예를 들어, 위 도커 파일은 node 레이어 + nginx 레이어 + Chusik 레이어 등으로 나뉠 수 있고 

Chusik 코드가 변경됐을 때, Chusik 데이터만 바꾸면 되는데 처음부터 끝까지 새로 생성하게되면 굉장히 비효율적이고

다운 받아 배포하는 입장에서도 큰 프로젝트를 매번 새로 받을 수 없으니 레이어단위로 업데이트를 가능토록 하였다.

캐시는 이러한 레이어를 효율적으로 활용하고 있는 증거이다.

 

도커 이미지를 생성할 때, -qq옵션으로 로그를 출력하지 않는다거나,

--no-doc, --no-ri 옵션으로 필요없는 문서를 생성하지 않아 이미지 용량을 줄이고 빌도 속도도 빠르게 하는 등의 최적화 옵션을 추가할 수 있다.

명령어는 비슷한 것 끼리 묶어주는게 보기도 좋고 레이어 수를 줄일 수 있다 (make && make install 과 같은 상황에서)

 

마지막으로 docker image를 실행한다.

docker run -d -p 8080:80 --rm -it --name chusik chu

-d 는 컨테이너를 백그라운드에서 실행하고 화면에 나타낸다

-p 는 포트를 지정한다. 호스트:컨테이너 순서

--rm 는 프로세스를 종료하면 컨테이너도 종료된다.

자세한 사항은 docker run --help 를 통해 확인할 수 있다.

 

도커 컨테이너 로그

위와 같이 컨테이너가 실행되고 -it 명령어를 통해 인터렉트가 가능하다.

 

해당 포트를 접근하면 내 프로젝트를 개발하는 환경과 마찬가지로 접근이 가능하다.

 

 

위 예시의 dockerfile에서는 프로젝트를 빌드한 뒤 결과로 나온 파일을 nginx에서 보이는 형태로 구현이 됐지만

http server로 보여주는 방법

npm으로 보여주는 방법

node로 실행하는 방법 등등 다양하게 사용할 수 있다. 아래 사이트에서 docker 화 하는 방법을 참고하면 된다.

https://docs.docker.com/samples/react/

 

React samples

 

docs.docker.com

 

아래에서는 docker-compose 를 통해 구현하는 한다.

 

Dockerfile | docker-compose

도커 파일은 사용자가 이미지를 조립하기 위해 호출할 수 있는 명령을 포함하는 간단한 텍스트 파일인 반면 도커 컴포지트는 다중 컨테이너 도커 응용 프로그램을 정의하고 실행하기 위한 도구이다.

 

 

'프로젝트 > 사이드 프로젝트' 카테고리의 다른 글

추천 식당  (0) 2023.03.22

댓글