지난 포스트에서 Dockerfile과 Image, Container의 관계에 대해서 알아봤다.
이번 포스트에서는 실제로 Dockerfile을 이용하여 어떻게 Docker Image를 만들 수 있는지 알아보자.
Docker build Process
DockerImage가 생성되는 과정은 아래와 같다.
(하지만, 우리는 1번 2번 부분만 작업을 하면 docker가 나머지는 알아서 다 해준다.)
- Dockerfile을 작성한다.
- "docker build [경로]" 명령어를 입력한다. e.g) docker build .
- docker가 해당 경로에 있는 Dockerfile을 자동적으로 찾는다.
- Dockerfile에 있는 명령어를 실행시킨다.
- Docker Image가 완성된다.
Dockerfile 작성
이미지 생성을 위해, 가장 선행되어야 하는 작업은 Dockerfile을 작성하는 것이다.
그 구성은 크게 아래와 같다.
- Base Image를 선택한다.
- Image 생성을 위한 작업을 적어준다.(e.g. npm install, COPY code, etc.)
- 컨테이너 시작시 실행할 명령어를 입력한다.
아래 Dockerfile 예시를 읽어보며 자세히 알아보자.
Dockerfile이나 docker-compose.yml 파일을 작성할 때 꼭 먼저 알아야 하는 점은,
COPY, ADD, VOLUMES와 같이 local 위치와 container 내부의 위치를 적어야 하는 명령어에 있어서
항상 앞에 오는 위치가 local 위치, 뒤에 오는 위치가 container 내부의 위치를 의미한다.
예를 들어 COPY ./build .
라는 명령어는 현재 내 터미널이 위치한 위치의 build라는 directory를 컨테이너 내부의 workingdirectory로 COPY하라는 뜻이다.
Dockerfile Example
# Dockerfile
# 1. base-image 선택
FROM node:alpine
# 2. 필요 작업 실행
RUN cd /usr && mkdir app
WORKDIR '/usr/app'
# package.json을 먼저 COPY하고 npm install 함으로써 소스 코드 변경시 불필요하게 npm install 안하도록 설정
COPY package*.json ./
RUN npm install
# 소스코드 COPY
COPY ./ ./
# 3. 실행 커맨드 입력
CMD ["npm", "run", "start"]
- FROM
기본적으로 사용할 base-image를 선택한다. (docker hub에서 선택해도 되고, 기존에 가지고 있던 이미지도 가능하다.) - RUN
container 내부에서 실행할 명령어를 입력한다.
RUN cd /usr && mkdir app은, 컨테이너 내부에서 /usr폴더로 이동하여, app이라는 폴더를 만드는 명령어이다. - WORKDIR
working directory를 설정하는 커맨드이다.
** Dockerfile의 각 라인은 독립적이기에, WORKDIR을 통해 설정해주지 않으면 항상 root 경로에서 명령어가 실행되게 된다.
** working directory를 설정하게 되면 현재위치(.)가 라인이 바뀌어도 workingdir로 설정된다.
** 즉, 내가 cd를 통해 /usr 폴더로 이동 하였다고 하더라도,
그 다음 커맨드인 COPY package*.json은 / 에서 실행 되게 된다는 것이다.(not /usr) - COPY package*.josn ./
package.json 파일들을 working directory에 COPY한다. - RUN npm install
npm install 명령어를 실행한다. - COPY ./ ./
현재 위치의 모든 소스코드(local)를 컨테이너 내부의 working directory로 COPY한다. - CMD ["npm", "run", "start"]
CMD컨테이너를 띄우면서 npm run start 명령어를 실행한다.
Build Image
이제 우리가 만든 Dockerfile을 이용해 image를 생성해 보자.
Default Dockerfile
docker build ./
위 예시처럼 Dockerfile의 이름을 Dockerfile 이라고 지어줬다면, 해당 디렉토리에서 위 명령어를 치면 docker가 알아서 Dockerfile을 찾아서 이미지 빌드를 해준다.
특정 Dockerfile 지정(-f 옵션)
만약 Dockerfile이 아닌 다른 이름으로 Dockerfile을 만들었다면, (e.g. Dockefile_dev)
아래 명령어를 통해 직접 Dockerfile을 지정해줄수도 있다.
docker build -f Dockerfile_dev .
Image 이름 지정(-t 옵션)
아래 명령어(-t 옵션)를 통해 우리가 만들 docker image의 이름을 지정 할 수도 있다.
docker build -t test__image:latest -f Dockerfile_dev .
기타 옵션
그 이외에도 docker build 명령어에는 다양한 옵션이 있으므로 아래처럼 docker build --help 를 이용하여 알아보자.
Docker Image 확인
이제 제대로 이미지가 빌드가 되었는지 확인해보자.
docker images 라는 명령어로 가능하다.
지금 까지 어떻게 도커 파일을 작성하는지 알아봤다.
다음 포스트에서는 우리가 만든 image를 통해 container를 실행시키는 방법에 대해 정리해보겠다.
'Docker' 카테고리의 다른 글
[Solved] docker container에서 local db 접속하기 (host.docker.internal) (1) | 2022.10.29 |
---|---|
[Docker] Docker 설치하기 (특정 버전 docker 설치) (1) | 2022.10.07 |
[Docker - 2] Container, Image 란 (0) | 2022.09.24 |
[Docker - 1] Docker란, Docker 사용이유 (Docker vs VM) (0) | 2022.09.24 |
[solved]Cannot create container for service frontend: failed to copy files: failed to open target ... no space left on device (0) | 2022.08.26 |