도커 이미지 생성하기
도커 이미지로 컨테이너를 만들며, 어떤 흐름으로 도커가 동작하는지 배워보자.
도커 컨테이너는 docker create [이미지 이름]
명령을 통해 만들 수 있다. 아래에서는 도커 이미지를 만드는 방법 먼저 배워보자. 예제 코드는 공식 홈페이지에 있는 것을 사용할 예정이다. [getting-started]
1. 도커 파일(Dokerfile) 만들기
도커 파일은 컨테이너 이미지를 만드는데 사용되는 단순한 텍스트 기반 지침 스크립트이다. Dockerfile
이라는 이름의 파일을 만들자. 만약 vscode
를 사용중이라면 docker extenstion
을 설치하면 자동 완성 기능도 같이 사용할 수 있다.
각 명령어는 하나의 레이어를 생성한다.
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 명령을 사용하여 컨테이너 이미지를 빌드하기
아래 명령을 통해 도커파일을 사용하여 새 컨테이너 이미지를 빌드할 수 있다.
-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 - 만든 이미지로 애플리케이션 실행하기(성공).
아래 명령어를 통해 컨테이너를 시작한다.
-dp
: 이 플래그는 새 컨테이너를 분리된 모드(백그라운드)에서 실행하고 호스트의 포트3000
과 컨테이너의 포트3000
간에 매핑을 생성하고 있다. 포트 매핑이 없으면 애플리케이션에 접근할 수 없다.
status
가 Up
으로 잘 실행되고 있음을 알 수 있다. 이제 그럼 브라우저에서 http://localhost:3000
을 열어 확인해 보자.
도커 대시보드에서도 잘 실행되고 있음을 한번 더 확인할 수 있다.
공식 문서에 있는 예제를 통해 기본 예제에 대한 실습을 해봤다. 이제 다음 글에서 좀 더 도커에 대해 알아보자.
Last updated