2020-10-20

Posted by karais89 on October 20, 2020

인프런에서 결제한 도커 강의 학습 및 내용 정리 진행. 이전에 도커에 대해 몇개의 강의 및 책을 학습한 적은 있어 대략적인 방식만 알고 있는 상태에서, 실제 개발에 적용 가능한지 확인을 위해 학습 중.

생성한 이미지로 어플리케이션 실행 시 접근이 안 되는 이유

1
docker run <이미지이름>

결론

1
docker run -p 49160:8080 <이미지이름>
  • -p 49160:8080이 추가됨
  • 로컬 네트워크를 컨테이너 내부의 네트워크와 연결을 시켜줘야 함.
  • 로컬 네트워크의 49160 포트를 컨테이너의 8080 포트와 연결

포트 매핑을 시켜줘야 정상 작동함

Working Directory 명시해주기

WORKDIR이 필요한 이유

  • 이미지안에서 애플리케이션 소스 코드를 갖고 있을 디렉토리를 생성하는 것이다. 그리고 이 디렉토리가 애플리케이션에 working directory가 된다.
1
docker run -it node ls
  • node 이미지 안의 파일 시스템이 보임 (Root 디렉터리)
1
2
docker run -it karais89/nodejs sh
ls
  • 우리가 만든 모든 파일들이 Root 위치에는 소스 코드 전부 다 Root 디렉터리에 들어가게됨.

문제점

  • copy한 파일 시스템이 원래 시스템과 같다면 원래 원래 파일 시스템에 덮어 씌어버려서 문제 발생 가능
  • 지저분하다. (우리가 사용해야될 소스코드를 모아두고 싶다.)

WORK 디렉터리를 따로 설정해서 앱을 위한 소스코드를 따로 관리하자

1
2
3
4
5
6
7
8
9
FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

CMD ["node", "server.js"]

빌드 후 확인 (docker build)

1
2
3
ls # 우리가 만든 프로젝트 파일 목록들
cd / # 루트 이동
ls # 루트에 있는 파일 목록
  • work dir 설정시 work dir 부터 시작함

어플리케이션 소스 변경으로 다시 빌드하는 것에 대한 문제점

  • 지금까지는 소스 변경시 처음부터 이미지 빌드를 다시 해주어야 했다.

문제점

  • 바로 바로 확인이 불가능하다.

원래 방식

  1. 소스코드 변경
  2. docker build 실행
  3. docker run -d -p 5000:8080 karais89/nodejs
  4. docker stop <컨테이너 아이디="">
  5. 1~3번 과정 반복

비효율적인 방법을 해결할 수 있는 방법?

어플리케이션 소스 변경으로 재빌드 시 효율적으로 하는 법

애플리케이션 소스 변경으로 다시 빌드할때 좀 더 효율적으로 하는 방법

현재 방식은 소스 코드 수정후 npm install하면 무조건 다시 다운 받음 (캐싱 안됨)

이런 부분도 불필요한 부분이므로 변경해야 됨

변경

  1. package.json을 copy
  2. npm install 실행
  3. 모든 파일 복사
1
2
3
4
5
6
7
8
9
10
11
12
13
14
const express = require('express')

// Constants
const PORT = 8080;
const HOST = '0.0.0.0';

// App
const app = express();
app.get('/', (req, res) => {
    res.send('반가워요!!!!');
});

app.listen(PORT, HOST)
console.log(`Running on http://${HOST}:${PORT}`);

Docker Volume에 대하여

맥에서

  • v $(pwd):/usr/src/app

윈도우에서

  • v %cd%:/usr/src/app

문제

지금까지는 COPY를 이용했다. 파일들을 컨테이너에 넣어줄때 사용함.

문제점은 이미지를 다시 빌드해줘야 컨테이너에 복사해줄 수 있었음.

번거로운 문제 발생

COPY 대체로 Volume 사용

복사를 하는게 아닌 로컬에 있는 것들을 참조함 (매핑)

실행방법

1
docker run -p 5000:8080 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app <이미지 아이디>
  • -v /usr/src/app/node_modules
    • 호스트 디렉터리에 node_modules은 없기에 컨테이너에 맵핑을 하지 말라고 하는 것
  • -v $(pwd):/usr/src/app
    • pwd 경로에 있는 디렉터리 혹은 파일을 /usr/src/app 경로에 참조
    • 콜론 기호 (:) 확인

이렇게 설정하면 소스 변경시 빌드를 하지 않아도 반영이 된다. ( 도커 스탑 후 다시 런)

1
2
3
4
5
docker run -d -p 8080:8080 -v /usr/src/app/node_modules -v ${pwd}:/usr/src/app karais89/nodejs

# 소스 코드 수정 후 아래 과정 실행
docker stop <컨테이너 아이디>
docker run -d -p 8080:8080 -v /usr/src/app/node_modules -v ${pwd}:/usr/src/app karais89/nodejs
  • pwd 명령어는 윈도우는 파워셀에서 실행함. 해당 디렉터리가 있는 경로에서 실행해야 됨.