일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 클라우드 엔지니어
- Jenkins
- k8s
- EKS
- 공부 방법
- Python
- Terraform
- VPA
- kubernetes
- docker
- eks endpoint access
- storageclass
- aews vault
- HPA
- CAS
- 클라우드 국비지원교육
- volume
- 외부 모듈
- 클라우드 국비지원교육 후기
- 도커
- observability
- keda
- 합격 후기
- AWS
- 국비지원교육
- POD
- 단기 합격
- aews
- aews ci/cd
- karpenter
- Today
- Total
모험가
도커를 이용한 간단한 Node.js 어플 만들기 본문
이 글은 따라하며 배우는 도커와 CI환경을 보며 정리한 글입니다.
강의순으로 정리되어 있어서 한번에 만들어지는게 아닌 TroubleShooting 과정이 포함!
한번에 만들고 싶으면 쭉 내용을 훑은 뒤 한번에 적용하면 됨.
package.json 만들기
터미널을 이용해 만듬
dependencies 추가
server.js 파일 생성
Dokcerfile 생성
설명 : apline에는 npm이 없어서 설치가 불가능
그래서 node이미지에 npm이 있어서 쓰는 것
그리고 CMD에서 node, server는 node 명령어를 먼저 써야하므로 넣는 것.
하지만 에러 : package.json이 없다.
Package.json이 없다고 나오는 이유
- 도커파일을 Build를 할 때 Node 베이스 이미지로 임시컨테이너를 생성함
- 임시 컨테이너로 이미지를 만듬. 하지만 그 임시 컨테이너에는 package.json이 Node 이미지 파일 스냅샷에 포함되어 있지 않음.
- 그래서 package.json은 컨테이너 밖에 있는 상황이 됨.
So!! COPY를 이용해서 컨테이너 안으로 넣어줘야 함
COPY <복사할 파일 경로> <컨테이너내에서 파일이 복사될 경로)
ex) COPY package.json ./
빌드 생성
빌드 실행
-> 똑같이 COPY를 이용!!
대신 ./ ./ 를 이용해서 현재 파일내에 있는 디렉터리를 모두 포함 시킴!
앞으로 컨테이너를 실행하기 위해 사용 할 명령어
<포트 매핑으로 브라우저의 포트와 컨테이너 안의 포트를 매핑하는 것>
ex) 브라우저의 포트 : 49160의 경우
docker run -p 49160:8080 <이미지 이름>
컨테이너 포트와 로컬 호스트의 포트를 매핑해서 컨테이너의 8080에 들어가는 개념으로 이해!
하지만 나는 server is running 이지만 localhost에 접속은 실패.. 2시간동안 찾아봤지만 해결 못해서 넘어가기루..
Dockerfile로 돌아와서
WORKDIR
- 이미지안에서 어플리케이션 소스 코드를 가지고 있을 디렉토리를 생성하는 것
그리고 이 디렉토리가 어플리케이션에 working directory가 됨.
이때 왜 따로 working 디렉토리가 있어야 하나??
because Node이미지의 Root 디렉토리에는 파일들이 있음 그러면
WORKDIR 없이 COPY하게 될 경우
1. 원래 파일시스템과 이름이 같아버리면 원래 있었던 파일을 덮어 씀.
그러면 원래 있던 파일이 있어야하는데 없어짐.
2. 모든 파일이 한 디렉토리에 들어가 버리니 너무 정리 정돈이 안됨.
==> So 모든 어플리케이션을 위한 소스들은 WORK 디렉토리를 따로 만들어서 보관한다.
다시 빌드 !
docker run -it <이미지 이름> sh
로 쉘 환경에 접근하여 잘 만들어졌는지 확인
이런식으로 /usr/src/app에 Dockerfile 등 앱에 필요한 파일들이 workdirectory로 있는 것을 확인 가능
cd / 로 원래있던 파일 시스템도 확인이 가능함
--- 여태까지 소스 파일을 변경할 때 처음부터 빌드해서 도커 이미지를 만듬 -> 컨테이너 생성
생각 해보면 build부터 다시 시작하는 것은 매우 비효율적임!
(소스뿐만 아니라 종속성 파일들도 다시 다운 받기에 너무 지연됨.)
그러면 어떻게 효율적으로 소스 변경시 효율적으로 재빌드 하느냐?
COPY package.json ./ 을 추가 해줌. (순서도 중요!)
이렇게 하면 package.json이 바뀐게 아니므로 npm install이 가동이 안됨.
-> 종속성 파일들은 그대로 두고 copy ./ ./ 으로 소스파일만 변경시켜줌.
이러면 package.json step은 캐시를 이용해서 스킵이 됨!!!
*필자는 npm install오류가 떴는데 해결이 안됨..
매번 실습마다 왜 이리 험난한지 모르겠음..
Docker Volume
- COPY 처럼 로컬에서 컨테이너로 복사하는 것이 아닌
도커 컨테이너에서 로컬에 있는 것들을 Mapping(참조)를 해서 가져오는것!! (방향이 반대임)
Volume 사용해서 어플리케이션 실행하는 법
=> docker run -p 5000:8080 -v /usr/src/app/node_modules -v %cd%:/usr/src/app <이미지 아이디>
설명
-v /usr/src/app/node_modules
- 호스트 디렉토리에 node_module은 없기에 컨테이너에 맵핑을 하지 말라고 하는 것
-v %cd%:/usr/src/app
- pwd 경로에 있는 디렉토리 혹은 파일을 /usr/src/app 경로에서 참조
'도커' 카테고리의 다른 글
도커 (컨테이너와 로컬 컴퓨터 통신에러 해결) localhost 에러 (0) | 2022.06.09 |
---|---|
Docker Compose (0) | 2022.06.01 |
도커 이미지 만들어 보기. (0) | 2022.05.26 |
도커(이미지, 간단한 명령어들) (0) | 2022.05.24 |
C group vs namespace (0) | 2022.05.24 |