[Docker] Commit & Dockerfile

2023. 2. 27. 02:01Tools/Docker

 

1. Dockerfile이란?

 

 

 

(Dockerfile은 사실 위에 영상 보면 뚝딱임)

 

Dockerfile은 Docker 이미지를 생성하는 데 사용되는 파일입니다.

 

Dockerfile을 사용하면 더 쉽게 Docker 이미지를 만들고 관리할 수 있다.

 

이미지를 만들 수 있다면 동일한 컨테이너를 무수히 많이 복제할 수 있게 된다.

 

 

원하는 컨테이너를 이미지로 만드는 방법은 간단하다.

 

docker commit test01 test02
#test1 컨테이너를 가지고서 test2라는 이미지를 새로 생성한다.

출처 : https://youtu.be/RMNOQXs-f68

 


2. Dockerfile 작성

 

 

Dockerfile reference

 

docs.docker.com

 

예를 들어서 대충 개발하는 Node.js 프로젝트가 있다고 치자.

 

Local에서 작업을 하다가 문뜩 Docker image로 만들고 싶은 충동에 휩싸여 그만 그렇게 하기로 했다.

 

docker commit을 사용하면 빠르게 이미지를 생성할 수 있다.

 

하지만 commit만 사용하면 불편한 점이 생긴다.

  1. 컨테이너가 아닌 로컬 환경에서 개발하던 작업물은 commit으론 이미지로 만들기 어렵다.
  2. commit은 컨테이너를 하나의 이미지 덩어리로 만든다. 이미지 안에 어떤 것들이 존재하는지, 또 그것들의 버전이 무엇인지 알기가 어렵다.

 

 

출처 : https://youtu.be/0kQC19w0gTI

 

고민되는가? 그러면 일단 프로젝트 디렉터리에 Dockerfile을 만든다.

 

Dockerfile에는 우리가 필요한 것들을 명시하면 된다.

 

(완전 Makefile 느낌 - https://ramen4598.tistory.com/109)

 

단계별로 필요한 것을 입력한다. 이 단계는 별로 Docker 이미지 레이어로 변환된다. (계층화)

 

Dockerfile애 사용할 수 있는 구성요소를 알아보자.

 

 

간단한 Dockerfile의 예시로 이해해 보자.

 

Node.js 애플리케이션을 위한 Docker 이미지를 생성하고자 한다.

# 베이스 이미지
FROM node:18.14.2-alpine

# 작업 디렉토리 설정
WORKDIR /app

# 호스트 파일 시스템에서 파일 복사
COPY package.json .

# 의존성 설치
RUN npm install -y
# npm ci의 사용을 추천한다. 지금 버전 그래로 설치. 이때 위에서 package-lock.json도 카피 해야함
# 그리고 여러 명령어를 사용하려면 && 사용하기
# install 할 경우 -y 옵션 사용하기

# 소스 코드 복사
COPY . .

# 포트 노출
EXPOSE 3000

# 실행할 명령어 설정
CMD [ "npm", "start" ]

CMD [ "npm", "start" ]CMD npm start와 같다.

 

전자를 shell form 후자를 exec form이라고 한다.

 

다른 명령어들도 두 가지 form을 지원한다.

 

지금부터 나오는 것들은 수정되는 빈도수가 적은 것부터 작성한다. (빌드 속도 때문에)

 

  • FROM node:18.14.2-alpine
  • 여기선 Node.js 18.14.2-alpine 버전의 이미지를 사용했다.
  • WORKDIR /app
  • 컨테이너 안 어디에서 Dockerfile에 담긴 명령을 실행할 것인가?
  • 리눅스 cd 명령어와 같은 느낌
  • 디렉터리가 없으면 새로 만든다.
  • 새로 만든 컨테이너의 /app 디렉터리에서 실행
  • COPY package.json .
  • package.json 파일을 호스트 파일 시스템에서 복사해 지금의 워크 디렉터리에 위치시킨다.

 

COPY [--chown=<user>:<group>] <src>... <dest>
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

 

The COPY instruction copies new files or directories from <src> and adds them to the filesystem of the container at the path <dest>.

 

  • RUN npm install -y
  • 의존성을 설치
  • npm ci의 사용을 추천한다. 지금 버전 그래로 설치.
  • 가끔 -y 옵션을 사용하지 않으면 오류가 발생할 수 있다.
  • COPY . .
  • Dockerfile와 같은 디렉터리에 위치한 파일들 모두를 복사해서 지금의 워크 디렉터리에 위치시킨다.
  • EXPOSE 3000
  • 3000 포트를 연다.
  • npm start
  • package.jsonscripts에 있는 start 명령어를 실행한다.
  • scripts 내에 start가 없다면 자동으로 node server.js가 실행된다.

 

//package.json
{
  "scripts": {
    "start": "node foo.js"
  }
}

 

RUN vs CMD vs ENTRYPOINT

 

 

컨테이너 실행 시 CMD 명령문은 …

 

파라미터 입력이 없을 경우 → 정의된 파라미터가 실행
파라미터를 추가 입력할 경우 → 입력 파라미터가 우선순위를 갖게 된다.

 

이게 무슨 소리냐

docker run --name test1 node pwd

 

이런 식으로 run할 때 마지막에 바로 이어서 실행할 명령어를 입력하는 경우가 있다.

 

이때 저 pwd와 같은 명령어는 우리가 작성한 Dockerfile의 CMD ~~~ 를 밀어내고 대신에 실행된다.

 

그렇기에 CMD에는 반드시 실행되어야 하는 명령어를 입력하면 안 된다.

 

하지만, ENTRYPOINT는 컨테이너가 실행 시 항상 일정하게 실행이 되기 때문에 디폴트 실행 명령어를 사용할 때 유용하다.

 


3. 빌드

 

Dockerfile을 작성하고 이미지를 빌드하려면 다음과 같은 명령어를 사용합니다.

# docker build -t <이미지 이름>:<태그> <Dockerfile 경로>

docker build -t help-me ./

docker images
  • -t : 이미지의 이름과 태그. 태그는 보통 이미지의 버전을 입력한다. 비우면latest가 기본값이다.
  • Dockerfile 경로 : Dockerfile 위치한 경로

 


출처 : ChatGPT :)

'Tools > Docker' 카테고리의 다른 글

[Docker] 가상화된 Docker host에 접근하기  (0) 2023.02.27
[Docker] 이미지 배포  (0) 2023.02.27
[Docker] mount  (0) 2023.02.27
[Docker] 컨테이너 안에서 터미널 쓰기!  (0) 2023.02.27
[Docker] 포트포워딩  (0) 2023.02.27