2.4 Dockerfile
- 새로운 이미지를 생성하기 위해 사용하는 일련의 명령어를 실행할 수 있도록 해주는 파일
- 컨테이너에서 수행해야 할 작업을 명시하고 이미지를 생성한다.
2.4.2 Dockerfile 작성
- 샘플 파일을 생성한다.
- Dockerfile을 작성한다.
FROM은 생성할 이미지의 베이스가 될 이미지를 뜻한다. Dockerfile에 반드시 한 번 이상 입력해야한다.MAINTAINER은 이미지를 생성한 개발자의 정보를 나타낸다.LABEL은 이미지의 메타데이터를 뜻한다.RUN이미지를 만들기 위해 컨테이너 내부에서 명령어를 실행한다.RUN ["실행가능한 파일","명령줄 인자1","명령줄 인자 2, ... ]형태로 작성가능하다.ADD는 파일을 이미지에 추가한다. Dockerfile이 존재하는 위치에서 test.html을 가져와서 컨테이너에 있는 /var/www/html 경로에 마운트한다.WORKDIR는 명령어를 실행할 디렉터리 위치를 나타낸다. Bash Shell에서cd명령어를 입력하는것과 같은 효과가 있다.EXPOSE는 컨테이너에서 사용할 포트를 나타낸다. 호스트의 포트 80번과 바인딩 되는게 아님을 기억하자!!CMD는 컨테이너가 시작될 때마다 실행할 명령어를 설정한다. Dockerfile에서 한번만 사용할 수 있다. 만약 컨테이너를 생성할때 명령어를 입력한다면 Dockerfile에 작성한 CMD 명령어는 무시된다.
1# vi Dockerfile
2
3FROM ubuntu:14.04
4MAINTAINER soojong
5LABEL "purpose"="practice"
6RUN apt-get update
7RUN apt-get install apache2 -y
8ADD test.html /var/www/html
9WORKDIR /var/www/html
10RUN ["/bin/bash","-c","echo hello >> test2.html"]
11EXPOSE 80
12CMD apachectl -DFOREGROUND
2.4.3 Dockerfile 빌드
build명령어를 사용한다../경로에 있는 Dockerfile을 빌드한다../경로가 빌드 컨텍스트가 된다. ( Dockerfile이 위치한곳이 빌드 컨텍스트 )-t옵션을 통해서 이미지의 이름을 지정한다.
1sudo docker build -t mybuild:0.0 ./
- 이미지 빌드를 시작할때 가장먼저 빌드 컨텍스트에 있는 파일들을 읽는다.s
- 가능하면 빌드 컨텍스트에는 필요한 파일만 두는게 좋다.
- 아니면
.dockerignore파일을 컨텍스트 빌드에 작성하도록 한다.
- 각 Step은 Dockerfile에 작성된 명령어를 의미한다.
- 각 Step이 실행될때 마다 새로운 컨테이너가 하나씩 생성되며 다음 컨테이너 생성시 사용된다.
- 이미지의 빌드가 완료되면 임시로 생성된 컨테이너들은 모두 삭제된다.
캐시 동작 확인해보기
- Dockerfile2를 생성해서 아래와 같이 명령어를 작성한다.
1FROM ubuntu:14.04
2MAINTAINER soojong
3LABEL "purpose"="practice"
4RUN apt-get update
- -f 옵션을 사용해서 강제로 Dockerfile2를 빌드하도록 한다.
1sudo docker build -f Dockerfile2 -t mycache0.0 ./
- 로그에서
Using cache를 확인할 수 있다. - 이전에 빌드했던 Dockerfile에 가튼 내용이 있다면 build 명령어는 이를 새로 빌드하지 않고 같은 명령어 줄까지 이전에 사용한 이미지 레이어를 활용해서 이미지를 생성한다.
- 아래의 예시는 Step1에서 만들어진 임시 컨테이너를 Step4까지 모두 사용한다.
캐시가 불필요한 경우
- Dockerfile 빌드시 캐시 기능을 제외해야하는 경우가 있다.
- 대표적으로
RUN git clone같은 경우이다. RUN에 대한 이미지 레이어를 계속 캐시로 사용하기 때문에 저장소에 있는 새로운 소스를 불러오지 못하는 경우가 생긴다. - 따라서
--no-cache옵션을 통해서 빌드시에 캐시기능을 사용하지 않도록 한다.
1sudo docker build --no-cache -y mybuild:0.0 .
멀티 스테이지를 이용한 Dockerfile 빌드하기
- 샘플용 golang 앱을 만든다.
1package main
2import "fmt"
3func main(){
4 fmt.Println("hello World");
5}
- 위 소스코드를 실행하는 이미지를 빌드하기 위한 Dockerfile을 작성한다.
1FROM golang
2ADD main.go /root
3WORKDIR /root
4RUN go build -o /root/mainApp /root/main.go
5CMD ["./mainApp"]
- Dockerfile을 빌드한다.
1sudo docker build . -t go_helloworld
- golang 이미지의 사이즈가 크기때문에 전체 이미지가 960MB에 달한다.
- 멀티 스테이지가 적용된 Dockerfile을 통해서 컴파일된 app만 포함하는 이미지를 만들어본다.
- 첫번째 FROM 이미지에선 golang을 통해 소스코드 빌드까지만 수행한다.
- 두번째 FROM 이미지에선
COPY --from=0을 통해서 첫번째에서 빌드된 App을 2번째 이미지로 가져온다. - 두번째 FROM에서 내려받은 이미지로 최종 빌드하게 되므로 컴팩트한 이미지 생성이 가능해진다.
1FROM golang
2ADD main.go /root
3WORKDIR /root
4RUN go build -o /root/mainApp /root/main.go
5
6FROM alpine:latest
7WORKDIR /root
8COPY --from=0 /root/mainApp .
9CMD ["./mainApp"]
- 용량이 줄어든것을 확인할 수 있다.