도커 이미지 생성하기

도커 이미지로 컨테이너를 만들며, 어떤 흐름으로 도커가 동작하는지 배워보자.

도커 컨테이너는 docker create [이미지 이름] 명령을 통해 만들 수 있다. 아래에서는 도커 이미지를 만드는 방법 먼저 배워보자. 예제 코드는 공식 홈페이지에 있는 것을 사용할 예정이다. [getting-started]

1. 도커 파일(Dokerfile) 만들기

도커 파일은 컨테이너 이미지를 만드는데 사용되는 단순한 텍스트 기반 지침 스크립트이다. Dockerfile이라는 이름의 파일을 만들자. 만약 vscode를 사용중이라면 docker extenstion을 설치하면 자동 완성 기능도 같이 사용할 수 있다.

# syntax=docker/dockerfile:1
FROM node:12-alpine
RUN apk add --no-cache python3 g++ make
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "src/index.js"]

각 명령어는 하나의 레이어를 생성한다.

  • FROM: 베이스 이미지이다. 간단하게 말해 OS라고 생각하면 되며, 참고로 Alpine은 매우 작은 Linux 배포판인 Alpine Linux를 기반으로 하는 기본 이미지이다. node:12-alpine의 의미는 노드 12에 설치된 알파인 기반 이미지를 의미하며, node:alpine 사용시 최신 버전의 알파인을 사용할 수 있다. (지금은 테스트이기 때문에 무거운 베이스 이미지 대신 알파인을 사용한 것이다.)

  • RUN: 도커 이미지가 생성되기 전에 수행할 쉘 명령어이다.

  • WORKDIR: WORKDIR 지시자는 도커 파일에서 리눅스 명령어의 cd와 유사하게 뒤에 오는 모든 지시자(RUN, CMD, COPY, ADD 등)에 대한 작업 디렉토리를 설정한다. 특히 원래 최상위 파일이나 폴더에 있던 이름과 COPY해오는 파일이나 폴더의 이름이 같은게 있다면, 기존에 파일을 덮어쓰게되어 문제가 생길 수 있으며, 최상위 폴더에 모두 있을 경우 가독성 또한 좋지 않다.

  • COPY: Docker클라이언트의 현재 디렉토리에서 파일을 추가한다. (COPY (source) (dist)). WORKDIR를 별도로 지정했다면 로컬에 있는 파일들이 도커 컨테이너로 복사될때 WORKDIR에 정의한 디렉토리로 복사된다.

  • CMD: 컨테이너 내에서 실행할 명령을 지정하며, 도커 파일 내에서 한 번만 사용할 수 있다.

이미지를 실행하고 컨테이너를 생성할 때 베이스 이미지(레이어) 위에 쓰기 가능한 새 레이어("컨테이너 레이어")를 추가한다.

왜 alpine을 베이스 이미지로 안쓰고 node에 있는 알파인을 쓸까?

알파인의 경우 가장 최소한의 경량화된 파일만 들어있기 때문에 npm을 사용하기 위한 파일이 들어있지 않아, npm install을 할 수가 없다.

2. docker build 명령을 사용하여 컨테이너 이미지를 빌드하기

아래 명령을 통해 도커파일을 사용하여 새 컨테이너 이미지를 빌드할 수 있다.

$ docker build -t getteing-started .
  • -t: 이 플래그는 이미지에 태그를 지정해준다. 사람이 읽을 수 있는 최종 이미지의 이름으로 생각하면 되고, 이미지 이름을 지정했기 때문에 컨테이너를 실행할 때 해당 이미지를 참조할 수 있다.

  • .: 현재 디렉터리에서 Dockerfile을 찾아야 한다고 알려준다.

위 명령을 실행하면 이미지가 빌드 된다.

참고) Error: Can't find Python executable "python", you can set the PYTHON env variable

위와 같은 에러가 발생했을 수도 있다. 일단 검색을 해본 결과 나와 같은 mac M1 프로세스 노트북에서 나타나는거 같다. 해결 방법은 내가 에러를 잡기 위해 노력한 시간보다는 차암 쉽다..

위의 Dockerfile 스크립트에서 python3 -> python2로 바꿔주자.

https://github.com/docker/getting-started/issues/222#issuecomment-979057033

3-1. docker run - 만든 이미지로 애플리케이션 실행하기(실패).

docker run getting-started 명령어를 실행했다면, Listening on port 3000라는 메시지가 콘솔에 출력되고 잘 동작하는 것처럼 보일 것이다. 하지만 해당 주소로 접속해 보면 사이트를 연결할 수 없다!

3-2. docker run - 만든 이미지로 애플리케이션 실행하기(성공).

아래 명령어를 통해 컨테이너를 시작한다.

$ docker run -dp 3000:3000 getting-started
$ docker ps
  • -dp: 이 플래그는 새 컨테이너를 분리된 모드(백그라운드)에서 실행하고 호스트의 포트 3000과 컨테이너의 포트 3000 간에 매핑을 생성하고 있다. 포트 매핑이 없으면 애플리케이션에 접근할 수 없다.

statusUp으로 잘 실행되고 있음을 알 수 있다. 이제 그럼 브라우저에서 http://localhost:3000을 열어 확인해 보자.

도커 대시보드에서도 잘 실행되고 있음을 한번 더 확인할 수 있다.


공식 문서에 있는 예제를 통해 기본 예제에 대한 실습을 해봤다. 이제 다음 글에서 좀 더 도커에 대해 알아보자.

Last updated