728x90
반응형

1. 이미지 vs 컨테이너

 컨테이너는 애플리케이션, 웹사이트, 노드 서버, 애플리케이션을 실행하는 전체 환경 등 무엇이든 포함하는 유닛 패키지다.

이미지는 쉽게 말해 컨테이너의 블루프린트가 되는 것인데, 실제로 코드와 코드를 실행하는데 필요한 도구를 포함한다.

예를 들어 NodeJS 환경이 깔린 이미지가 있으면 도장처럼 찍어서 여러개의 nodeJS 환경이 구성된 컨테이너를 만들어낼 수 있다.

 

2. 외부 (사전 빌드된) 이미지의 사용 및 실행

 도커 허브 사이트에 가보면 매우 일반적인 ( 우분투나 node 같은 ) 이미지를 받을 수 있다.  아래 명령어를 입력해보자.

$ docker run node

 그 다음 아래 명령어를 입력하면 컨테이너가 생성되어 실행되는 것을 확인할 수 있다.

 

$ docker ps -a

 

도커 프로그램을 켜봐도 알 수 있다.

 

보통은 이렇게 일반적인 이미지로 컨테이너를 만들고 자신의 환경에 맞게 코딩한 다음 나만의 이미지로 만들어서 사용한다.

 

3. 나만의 node 이미지 만들기

1. 먼저 파일을 다운로드 받고 VSCode 에서 폴더를 연다.

nodejs-app-starting-setup.zip
0.00MB

 

2. 설치된 npm 패키지들을 받기 위해 아래 명령어를 입력한다.

$npm install

 

 

3. Docker 확장 프로그램을 설치하고 다운로드 받았던 프로젝트 안에 Dockerfile 을 만들어준다.

 

 

/Dockerfile

# 위에서 도커 허브 node 이미지를 기반으로 로컬로 다운로드 및 캐싱 되었기 때문에 이미지를 가져올 수 있다.
FROM node 

# 만약 컨테이너 안의 이미지의 경로가 /app 이런식으로 되어있다면 작업할 div 경로를 설정할 수도 있다.
# 설정해주면 COPY 의 두번째 경로를 ./ 이것으로 했을 때 자동으로 /app 경로가 된다.
WORKDIR /app

# 어떤 파일이 이미지에 들어가야 하는지 
# 첫 번째 .은 이 프로젝트의 모든 폴더 및 파일들 (Dockerfile을 제외한)
# 두 번째 .은 파일을 저장할 컨테이너 내부 경로 (ex /app)
COPY . /app

# 이미지를 받으면 npm install을 자동으로 해줌
RUN npm install

# 도커에게 우리가 서버를 실행할 포트를 말해준다.
EXPOSE 80

# 이미지가 생성될 때 실행되지 않고 컨테이너가 실행될 때 수행하는 명령어
CMD ["node", "server.js"]

 

4. 터미널에서 아래 명령어를 입력해보자

$docker build .

위에 생성된 image ID 를 복사해서 docker run을 해보면,

이렇게 컨테이너가 실행된 것을 확인할 수 있다.

 

이제 이미지로 만들었고 컨테이너 실행도 했겠다 80번 포트에 열린 사이트를 확인해 보자.

??? 화면이 뜨질 않는다 이 이유는 아래에 나온다.

 

 

5. docker ps 명령어를 입력하면 현재 실행중인 프로세스를 확인할 수 있다.

컨테이너 실행도 잘 되었다. 하지만 우리는 문서상으로만 포트 80번을 expose 한다고 명시하였고, 실제로 컨테이너안의 포트를 로컬 포트에 할당시켜주질 않았다. 이는 run 명령어를 실행할 때 쓰면 된다. 일단 컨테이너를 중지시키고 포트를 할당해준 뒤 다시 시작해보자.

 

$ docker stop '위에서 확인한 컨테이너의 이름'

 

 

포트를 할당해주고 다시 실행한다. (위에서 만들었던 컨테이너의 id 를 씁니다.)

$ docker run -p 3000:80 sha256:5ed67ec470b78df4b721d82a9ae3924059e432e58d710782d2f73a6efd6dbb75

 

그 다음 웹을 켜보면

로컬 3000번 포트에 컨테이너의 80번 포트가 할당되어 잘 나타나는 것을 볼 수 있다.

 

이미지는 읽기 전용이기 때문에 이 방법으로는 만약 변경사항이 생겨 적용하고 싶으면 이미지를 다시 빌드해야 한다.

 

 

또한 Dockerfile 이미지 레이어에는 캐시를 사용하는데, 빌드했었던 이미지를 다시 빌드할 때 변경사항이 없으면 매우 빠르게 빌드된다. 

이것을 이용해서 다음과 같이 npm package에 대한 변경사항이 없을 때 npm install 을 빠르게 넘어갈 수도 있다

 

/Dockerfile

# 위에서 도커 허브 node 이미지를 기반으로 로컬로 다운로드 및 캐싱 되었기 때문에 이미지를 가져올 수 있다.
FROM node 

# 만약 컨테이너 안의 이미지의 경로가 /app 이런식으로 되어있다면 작업할 div 경로를 설정할 수도 있다.
# 설정해주면 COPY 의 두번째 경로를 ./ 이것으로 했을 때 자동으로 /app 경로가 된다.
WORKDIR /app

# package.json 파일을 복사한다. 만약 다시 빌드할 때 변경사항이 없을 경우 npm install까지 그냥 넘어간다.
COPY package.json /app

# 이미지를 받으면 npm install을 자동으로 해줌
RUN npm install

# 어떤 파일이 이미지에 들어가야 하는지 
# 첫 번째 .은 이 프로젝트의 모든 폴더 및 파일들 (Dockerfile을 제외한)
# 두 번째 .은 파일을 저장할 컨테이너 내부 경로 (ex /app)
COPY . /app

# 도케에게 우리가 서버를 실행할 포트를 말해준다.
EXPOSE 80

# 이미지가 생성될 때 실행되지 않고 컨테이너가 실행될 때 수행하는 명령어
CMD ["node", "server.js"]

 

 

728x90
반응형

+ Recent posts