부팅 등 운영체제의 핵심 기능(커널)은 공유하는 가상머신 => 운영체제를 새로 설치하지 않아도 됨!
node와 mysql등 프로그램이 이미 설치된 도커도 만들 수 있음
도커는 개발 환경 요소들이 설치된 모습을 이미지로 저장한다.
저장한 이미지를 클라우드에 올린다.
이미지들이 서로 연결되서 동작하는 설정을 문서(Dockerfile)로 저장한다.
새 컴퓨터에 가서 복사한 문서의 내용대로 이미지를 다운받아 설치한다.가상 머신과 비슷하다고 볼 수 있다.
하지만 가상머신보다 훨씬 빠르고, 자원을 효율적으로 사용한다. 왼쪽이 가상머신, 오른쪽이 도커로, 도커에는 불필요한 추가적인 운영체제 설치가 필요 없다.
도커 허브에서는 npm 다운 받는 것처럼 다른 사람들이 올려놓은 이미지를 다운로드 할 수도 있다. 또한, 한 컴퓨터에서 다른 환경의 여러 서비스를 실행해야 하는 경우, 컨테이너로 분리되어 있기 때문에 서로 독립되어 실행 될 수 있다.
이것들을 모두 간단한 명령어로 실행 할 수 있다.
우리가 서버를 돌리기 위해서는 먼저 환경이 갖춰져야 한다.
새로 컴퓨터를 샀다거나 또는 새로 직원이 들어왔다고 생각해자!
그럼 컴퓨터에 우리가 개발한 환경과 똑같이 만들어야한다.이를위해 Node.js와 같은 언어 그리고 언어의 버전, 데이터베이스, 수 많은 node_modules를 버전을 맞춰서 설치해줘야 한다. 한두가지가 아님!
그래서 예전 회사에서는 환경을 구축하는 과정을 하나씩 캡쳐하고, 기록해서 방법을 정리해두기도 한다.
가이드 문서가 있다고 한들 매번 이렇게 구축하는 것은 매우 번거로운 일이다. 이를 간편하게 해주는 것이 바로 도커!!!
https://www.docker.com/ 도커 홈페이지에 접속한 뒤, Get Started!
✅ Docker-compose의 이해
여러가지 컨테이너를 다룰 때 좀더 복잡한 설정이 필요하게 된다. 이럴 때 Docker-compose를 사용한다.
docker-compose.yml
파일을 미리 만들어서 설정을 어떻게 할지 적어둔다. 그리고docker-compose up
명령어를 입력해서 컨테이너를 실행한다.
- docker-compose.yml
version: "3.3" services: class_build: build: context: . dockerfile: Dockerfile ports: - 3000:3000
[Dockerfile만들기 실습]
// 1. 운영체제 및 프로그램 설치 // FROM ubuntu:22.04 // RUN sudo apt install nodejs // RUN sudo npm install -g yarn // 1. 운영체제 및 프로그램 설치(이미 리눅스, node, yarn까지 모두 깔려있는 컴퓨터를 다운로드함) FROM node:14 // 2. 내 컴퓨터에 있는 폴더나 파일을 도커 컴퓨터 안으로 복사하기 // RUN mkdir myfolder -> 아래에서 카피할때 없으면 자동생성해줌 굳이 필요없디! COPY . /myfolder/ WORKDIR /myfolder/ // RUN cd /myfolder/ RUN yarn install RUN yarn build // ================= 여기까지 미리 가능한 부분 // 3. 도커안에서 next.js실행시키기 CMD yarn start // 실행할고 싶다면 실행!RUN -> CMD(1번밖에 못씀)
빌드 최적화하여 미리 다 실행해서 이미지 만들어놓기
만들어진 이미지 실행하기실무에서는 컴퓨터가 한대만 있는 것이 아니므로
도커파일 최적화하기만약 인덱스내용을 수정하면
도커컴퓨터에는 기존에는 기존내용이 있음
점은 모든 문자열을 의미하므로 바뀌었다면 기존것을 못가지고오고 새로시작
임시저장공간에 꺼내오는 데 yarn install함.도커내부에서는 한번했던 걸 임시저장해놓고 꺼내오는 게 맞는데
한번이라도 캐시가 깨진다면 그 아래는 강제로 다 꺠트린다.
따라서 yarn install이 새롭게 될 수 잇게끔 한다.
이 다음 yarn install중간에 package.json이나 yarn.lock이 깨지지 않는 이상
아래는 깨지지 않음.
yarn build는 깨지는게 맞음
속도 줄어듬
환경 변수 설정
Dockerfile 안에서 환경 변수를 설정하고 싶은 때는 ENV 명령어로 설정한다.
ENV [key] [value] ENV [key]=[value]