2023. 2. 27. 02:01ㆍTools/Docker
1. Dockerfile이란?
(Dockerfile은 사실 위에 영상 보면 뚝딱임)
Dockerfile은 Docker 이미지를 생성하는 데 사용되는 파일입니다.
Dockerfile을 사용하면 더 쉽게 Docker 이미지를 만들고 관리할 수 있다.
이미지를 만들 수 있다면 동일한 컨테이너를 무수히 많이 복제할 수 있게 된다.
원하는 컨테이너를 이미지로 만드는 방법은 간단하다.
docker commit test01 test02
#test1 컨테이너를 가지고서 test2라는 이미지를 새로 생성한다.
출처 : https://youtu.be/RMNOQXs-f68
2. Dockerfile 작성
예를 들어서 대충 개발하는 Node.js 프로젝트가 있다고 치자.
Local에서 작업을 하다가 문뜩 Docker image로 만들고 싶은 충동에 휩싸여 그만 그렇게 하기로 했다.
docker commit
을 사용하면 빠르게 이미지를 생성할 수 있다.
하지만 commit
만 사용하면 불편한 점이 생긴다.
- 컨테이너가 아닌 로컬 환경에서 개발하던 작업물은
commit
으론 이미지로 만들기 어렵다. - 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.json
의scripts
에 있는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 |