[Docker] 도커 이미지 직접 만들어보기

develop.u·2023년 12월 11일
0

docker

목록 보기
6/7

도커 허브에 이미 있는 이미지들을 사용할 수도 있지만 직접 도커 이미지를 만들어 사용할 수도 있고 직접 만든 도커 이미지를 도커 허브에 올려 공유할 수도 있다.

도커 허브란?

  • Docker에서 운영하는 Docker 이미지 저장소 서비스

컨테이너는 도커 이미지로 생성된다. 그렇다면 도커 이미지는 어떻게 생성할까?

도커 이미지 생성하는 순서
Dockerfile 작성 → 도커 클라이언트 → 도커 서버 → 이미지 생성

Dockerfile에 입력된 것이 도커 클라이언트에 전달 되어야 하고, 도커 클라이언트에 전달된 모든 중요한 작업들은 도커 서버에서 한다.

Dockerfile이란?

  • 도커 이미지를 만들기 위한 설정 파일이다.
    (도커 이미지를 만들기 위해 필요한 기본 명령어들을 지정하기 위한 script)
  • 컨테이너가 어떻게 행동해야 하는지에 대한 설정들을 정의해준다.

[1. Dockerfile 만들기]

[도커 파일 형식]

# 베이스 이미지를 명시해준다. → 어떤 OS를 사용할 것인지 명시
FROM baseImage

# 추가적으로 필요한 파일들을 다운로드 받기 위한 몇 가지 명령어를 명시해준다.
RUN command

# 컨테이너 시작 시 실행될 명령어를 명시해준다.
CMD ["excecutable"]

베이스 이미지란?

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

레이어란?

  • 레이어는 중간 단계의 이미지이다.

[2. 실제로 만들어보기 - hello 문구 출력해보기]

  1. docker file을 만들 폴더 하나 생성
  2. 방금 생성한 폴더를 에디터를 이용해서 실행
  3. Dockerfile이라는 이름으로 파일을 하나 생성한다.
  4. Dockerfile에 필요한 내용을 작성해준다.
도커 파일에 작성할 내용

# ubuntu, centos 등을 사용해도 되지만 hello를 출력하는 기능은 큰 사이즈의 베이스 이미지가 필요하지 않다.
FROM alpine

# hello 문자를 출력하기 필요한 echo가 이미 alpine 안에 있기 때문에 RUN 부분은 생략해도 된다.
# echo : 도스, OS/2, 유닉스 및 유닉스 계열 운영 체제에서 문자열을 컴퓨터 터미널에 출력하는 명령어
# RUN command

# 컨테이너 시작 시 실행될 명령어 echo hello를 적어준다.
CMD ["echo", "hello"]

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

FROM

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

RUN

  • 도커 이미지가 생성되기 전에 수행할 쉘 명령어
  • 추가적으로 필요한 파일들을 다운 받는다.

CMD

  • 컨테이너가 시작되었을 때 실행할 실행 파일 또는 쉘 스크립트
  • 해당 명령어는 Dockerfile 내 1회만 사용 가능하다.

[3. 도커 파일로 도커 이미지 만들기]

도커 이미지를 만들기 위해선 도커 파일에 입력된 것들이 도커 클라이언트에 전달 되어서 도커 서버가 인식하게 해야 한다.
Dockerfile 작성 → 도커 클라이언트 → 도커 서버 → 이미지 생성
👉 그렇게 하기 위해서 docker build ./(도커 파일 위치) 또는 docker build .(도커 파일 위치)

build 명령어

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

결과

docker build ./
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM alpine
 ---> a24bb4013296
Step 2/2 : CMD ["echo", "hello"]
 ---> Running in 16c04fc73f76
Removing intermediate container 16c04fc73f76
 ---> 872457464cf6

Successfully built 872457464cf6

이 때, 임시 컨테이너를 생성하고 다시 지우는데 왜 그러는 걸까?

  1. alpine 이미지

  2. 임시 컨테이너 생성(16c04fc73f76)
    → 하드 디스크에 파일 시스템 스냅샷(베이스 이미지&다른 레이어들) 추가
    → 시작 시 실행할 명령어 아직 없음

  3. 임시 컨테이너에 시작 시 실행할 명령어 추가
    ------------------------임시컨테이너 완성------------------------
    → 이제 임시 컨테이너는 필요 없다. 임시 컨테이너를 토대로 새로운 이미지를 만들어준다.

  4. 이미지가 완성됐다. 이제 시작 시 실행 될 명령어가 생성 됐다.
    → 처음 alpine 이미지와는 다름(아이디도 달라짐)

  5. 임시컨테이너 삭제

결론

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

출처
인프런 [따라하며 배우는 도커와 CI환경]

0개의 댓글