많이는 들어봤는데 정확히 뭔지는 잘 몰랐다. 이번 기회에 알아보았다.
자바스크립트 엔진 ‘V8’ 위에서 동작하는 이벤트 처리 I/O 프레임워크다.
서버 환경에서 자바스크립트로 애플리케이션을 작성할 수 있게 돕는다.
자바스크립트를 컴파일 해주는 엔진으로 빌드 된 「자바스크립트가 구동중인 환경」
즉 브라우저가 아닌 내 컴퓨터에서 자바스크립트를 사용할 수 있게 해주는 것
만약 내 컴퓨터에 node.js가 깔려있고
자바스크립트로 돌아가는 http-server도 설치가 되어있다면
터미널에서 http-server -p 8080 ./public 명령어를 통해
웹서버를 실행할 수 있음 ( (내가 테스트한 프론트앤드 디렉토리에서) )
만약 node.js가 깔려있지 않으면 http-server 명령어는 당연하고 기본적인 자바스크립트 명령어조차 실행되지 않음
개발할 때 필요한 거의 모든 환경들을 ‘이미지’란 형태로 찾을 수 있음.
node도 공식 이미지가 올라와 있음
리눅스 컴퓨터의 특정 상태를 캡쳐해서 박제해 놓은 것
리눅스에 Node.js가 설치된 상태를 그대로 급속냉동해 클라우드에 올려놓은 것이다.
터미널에서 docker run -it node
를 하면 실행을 위해 도커가 컴퓨터에서 node이미지를 찾는다. 없으면 도커허브에서 이미지를 다운받는다.
만약 오류가 뜨면 도커가 실행이 안된걸 수도 있다. 확인해보자..^^
(걍 도커데스크탑 실행시킴 됨)
run
run 명령어는 컴퓨터에서 이미지를 찾고, 없으면 허브에서 다운받는다. 그리고 그 이미지를 내 컴퓨터에서 해동해서 컨테이너로 만든다.
이미지를 한 번 받으면 컨테이너는 몇 개든 만들어 낼 수 있다!
이미지는 컨테이너를 찍어내는 소모되지않는 틀/컨테이너 조립키트 라고 볼 수 있다.
-it
컨테이너를 연 다음 그 환경에서 CLI를 사용한단 뜻
그럼 자바스크립트 콘솔을 사용할 수 있게됨~!
(node 이미지는 깨어나자마자 바로 node명령어가 실행되도록 설계되어 있어서 바로 자바스크립트 콘솔 창이 뜬다)
도커-node로 자바스크립트에서 hello world 해봤다
나만의 이미지를 만들기 위한 설계도
공식 이미지를 개조, 튜닝해서 이미지를 만듦!
# 이 버전의 node 이미지에 덧붙입니다!
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 {이미지명}
이제 이미지 만들기!
docker build -t frontend-img .
frontend-img
: 이미지명
.
: Dockerfile로의 상대경로 (파일명이 Dockerfile이면 따로 명시할 필요가 없다)
docker images
로 잘 생성됐는지 확인해볼 수 있다!
docker run --name frontend-con -v $(pwd):/home/node/app -p 8080:8080 frontend-img
—name frontend-con
생성될 컨테이너의 이름 지정
-v
volumn의 약자. 도커에서 볼륨이란 컨테이너와 특정 폴더를 공유하는 걸 의미함.
$(pwd):/home/node/app
지금 위치한 이 폴더(pwd) 안의 내용들이 app 폴더에 들어간단 뜻이다. (그래서 Dockerfile의 WORKDIR을 app으로 설정한 후 CMD로 명령어 실행이 가능했던 것. 연결해놨으니까!!
8080:8080
집의 내선번호를 컨테이너 것과 연결
같은 컨테이너가 여러개라면 당연히 집 포트를 다르게 해줘야함
frontend-img
컨테이너로 실행할 이미지를 지정
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 {이미지명}
COPY와 volume의 차이
COPY
RUN처럼 「이미지를 생성하는 과정」에서 해당 이미지 안에 특정 파일을 넣어두는 것
volume
CMD처럼 「컨테이너가 생성되어 실행될 때」 그 내부의 폴더를 외부의 것과 연결하는 것💡 사용되는 스크립트들은 컨테이너 초기화 과정에 필요한 것!
그러니까 COPY로 미리 넣어두는 것!
docker stop $(docker ps -aq)
docker rm $(docker pas -aq)
docker image prune -a
daemon의 줄임말. 백그라운드에서 알아서 컨테이너를 깔고 돌아간다.
docker ps
docker logs -f 컨테이너명
문제점
🔌 요소들을 연결해서 서비스를 간편하게 실행해야 함!
🔔 거시적 설계도인 docker-compose 사용
docker-compose.ymi 파일의 내용
version: '3' services: database: # Dockerfile이 있는 위치 build: ./database # 내부에서 개방할 포트 : 외부에서 접근할 포트 ports: - "3306:3306" backend: build: ./backend # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리 volumes: - ./backend:/usr/src/app ports: - "5000:5000" # 환경변수 설정 # flask에서 이 호스트명을 이용해 db컨테이너의 MySQL에 접속함 environment: - DBHOST=database frontend: build: ./frontend # 연결할 외부 디렉토리 : 컨테이너 내 디렉토리 volumes: - ./frontend:/home/node/app ports: - "8080:8080"
실행
docker-compose.ymi파일이 있는 위치에서
docker-compose up
명령어를 실행한다.
리눅스에서는 Docker와 Docker compose 모두 설치해 줘야 함!