[docker] Dockerfile

현서황·2024년 10월 27일

Docker

목록 보기
8/9

도커 이미지를 도커 허브에 있던 것 말고,
1. 직접 생성해서도 사용할 수 있고
2. 도커 허브에 올려서 공유할 수도 있다.


간단한 도커 이미지 복습

  1. 도커 이미지는 컨테이너를 만들기 위해 필요한 설정이나 종속성들을 갖고있는 소프트웨어 패키지이다.
  2. 지금까지 해왔듯이 도커 이미지는 Dockerhub에 이미 다른 사람들이 만들어놓은 것을 이용할 수도 있으며, 직접 도커 이미지를 만들어서 사용할 수도 있고 직접 만든 것을 Dockerhub에 업로드할 수도 있다.

도커 이미지를 이용해 도커 컨테이너 생성
docker create <이미지이름>


도커 이미지 생성 순서


Dockerfile 만드는 법

도커파일(Docker file)이란?
도커 이미지를 만들기 위한 설정 파일
컨테이너가 어떻게 행동해야하는지에 대한 설정들을 정의해주는 곳이다.

도커 이미지를 만들기 위한 설정 파일이므로, 도커 이미지가 필요한 것이 무엇인지를 생각해야한다. 도커 이미지는 시작 시 실행 될 명령어와 파일 스냅샷으로 구성되어있으므로, 이 두 가지를 만들어야 한다.

도커 파일 만드는 순서
1. 베이스 이미지 명시(파일 스냅샷에 해당)
2. 추가적으로 필요한 파일을 다운 받기 위한 몇 가지 명령어를 명시(파일 스냅샷에 해당)
3. 컨테이너 시작 시 실행 될 명령어를 명시해준다. (시작시 실행 될 명령어에 해당)

베이스 이미지는 무엇인가?

도커 이미지는 여러 개의 레이어들로 되어있다. 그 중에서 베이스 이미지는 이 이미지의 기반이 되는 부분이다.


실습 - Hello문구 출력

Dockerfile작성

  1. 도커 파일을 만들 폴더 하나 만들기 ex) dockerfile-folder
  2. 방금 생성한 도커 파일 폴더를 에디터를 이용해서 실행(Visual Studio Code 추천)
  3. 파일 하나를 생성, 이름은 dockerfile
  4. 그 안에 먼저 어떻게 진행해 나갈지 기본적 토대 명시

FROM RUN CMD 등은 도커 서버에게 무엇을 하라고 알려주는 것이다.

FROM
이미지 생성 시 기반이 되는 이미지 레이어
<이미지이름>:<태그> 형식으로 작성
태그를 안 붙이면 자동적으로 가장 최신 것으로 다운 받음
ex) ubuntu:14.04

RUN
도커 이미지가 생성되기 전에 수행할 쉘 명령어

CMD
컨테이너가 시작되었을 때
실행할 실행 파일 또는 셸 스크립트이다.
해당 명령어는 DockerFile 내 1회만 쓸 수 있다.

  1. 이제 베이스 이미지부터 실제 값으로 추가해주기.
  2. 베이스 이미지는 ubuntu를 써도 되고 centos등을 써도 되지만 hello를 출력하는 기능은 굳이 사이즈가 큰 베이스 이미지를 쓸 필요가 없기에 사이즈가 작은 alpine베이스 이미지를 사용한다.
  3. hello문자를 출력해주기 위해 echo를 사용해야하는데 이미 apline안에 echo를 사용하게 할 수 있는 파일이 있기에 RUN부분은 생략함.
  4. 마지막으로 컨테이너 시작 시 실행될 명령어 echo hello를 적어준다.

도커 클라이언트, 도커 서버, 이미지 생성

도커 파일에 입력된 것들이 도커 클라이언트에 전달되어서 도커 서버가 인식하게 해야한다.
그렇게 하기 위해서 docker build ./ 또는 docker build .

build명령어는

  • 해당 디렉토리 내에서 dockerfile이라는 파일을 찾아서 도커 클라이언트에 전달시켜준다.
  • docker build 뒤에 ./.는 둘 다 현재 디렉토리를 가리킨다.

그래서 docker build .을 해보면

build 과정 설명

이미지를 빌드할 때 Docker는 Dockerfile을 읽고 각 명령어에 따라 레이어(layer)를 쌓아 이미지를 생성한다.
위 사진의 빌드 로그에 나타난 주요 단계는 다음과 같다.
1. load build definition from Dockerfile
Docker가 현재 디렉터리에서 Dockerfile을 찾고, 이를 읽어서 빌드를 시작한다.
2. transferring Dockerfile
Dockerfile의 내용을 Docker데몬에 전송하여 빌드를 준비한다. 여기서 264B는 Dockerfile의 크기이다.
3. load metadata for docker.io/library/alpine
FROM alpine 명령에 따라, alpine이미지를 기반으로 사용한다. 여기서는 Docker가 최신 버전(apline:latest)의 메타데이터를 가져온다.
4. load .dockerignore
Docker는 .dockerignore 파일을 로드하여 빌드 과정에서 제외할 파일이나 폴더를 확인한다. .dockerignore파일에 지정된 내용은 빌드 시 제외된다.
5. transferring context
현재 디렉터리의 모든 내용을 Docker 데몬에 전송한다. 이때 전송된 데이터의 크기는 2B로 매우 작다. 컨텍스트(context)는 Docker가 빌드할 때 필요로하는 파일 및 폴더의 집합이다.
6. CACHED[1/1]FROM docker.io/library/alpine
캐시된 alpine이미지를 사용하여 빌드를 빠르게 처리한다. 캐시된 레이어가 있으면 이를 재사용하여 빌드 시간을 단축!
7. exporting to image
모든 명령을 처리한 후, 최종 이미지를 생성하여 저장
8. exporting layers / writing image
빌드가 완료된 이미지를 저장하고, 이미지의 해시 값을 출력한다. 이 해시값은 이미지의 고유ID이다.

결과적으로 이 빌드과정은 alpine기반 이미지 위에 CMD["echo","hello"]명령을 추가하여 최종 Docker이미지를 생성하는 과정을 나타낸다.


원래는 이런식으로 빌드 과정에서 각 레이어와 컨테이너 ID가 터미널에 표시되었었다. 그런데, 최근 Docker버전에서는 빌드 과정의 출력을 간소화하면서 세부적인 레이어 ID와 컨테이너 ID 대신 요약된 정보를 출력하도록 변경되었다.


ID를 확인하고싶다면, docker images 명령어를 통해서 확인할 수 있다.

결론적으로

  • 베이스 이미지에서 다른 종속성이나 새로운 커맨드를 추가할 때는 임시 컨테이너를 만든 후 그 컨테이너를 토대로 새로운 이미지를 만든다.
    그리고 그 임시 컨테이너는 지워준다.

만든 도커 이미지를 실행하려면, docker images 명령어를 통해 확인한 이미지ID를 이용해야 한다.
ex. docker run b7a652f17135
IP Address가 기억하기 힘들기에 Domain이름을 새로 만들어서 이용하는 것과 비슷하게 우리가 만드는 도커 이미지에 이름을 줄 수 있다.

이를 위해 도커 이미지에 이름을 주면, 그 이름으로 실행시킬 수 있다.

도커 이미지에 이름 주는 방법

도커 이미지를 사실 아무렇게나 주어도 상관없다.
그런데, 사람들이 통상적으로 사용하는 규칙이 아래의 주황색 박스로 표현되어있다.


실제로 명령어를 사용해 보았을 때, 로그의 마지막에 naming to~ 로 이름설정이 잘 적용되었음을 확인할 수 있다.


설정한 이름을 기반으로 실행한 화면이다.
의도했던 대로 hello가 잘 출력된 것을 확인할 수 있다.

profile
노는 게 제일 좋은 뽀로로

0개의 댓글