Chapter 3 - Make Docker Image

권대규·2021년 8월 1일
1

docker-study

목록 보기
3/4

본 포스트는 Inflearn '따라하며 배우는 도커와 CI환경' 강의를 기반으로 작성되었습니다.

맨 처음 왜 도커를 사용하는지에 대해 배웠을 때, 가장 큰 이유는 어떠한 프로그램을 실행할 때 그 프로그램을 실행하기 위한 환경에 대한 정보를 그대로 담아주기 위해서였다. 그리고 이러한 정보를 이미지라는 형식으로 담아서 사용한다고 하는데 지금까지는 도커 허브에 존재하는 이미지만 다운받아서 컨테이너를 생성했다. 이번 시간에는 이러한 도커 이미지를 직접 만드는 방법을 배워보려고 한다.

연구실에서는 특별한 프로그램을 실행하기 위한 환경이라기 보다는 내가 자주 쓰는 모델에 따라 파이썬 라이브러리들 버전을 잘 조율해야 했다. 그래서 매번 기본 우분투만 받아서 거기다가 라이브러리를 깔아주는 과정을 무한 반복했는데 마침 선택한 우분투가 vim도 안 깔려 있는 우분투라 좀 고생이 많았다. 이번에 해당 방법을 잘 배워서 빨리 써먹어봐야겠다.

도커 이미지 생성 순서

도커 이미지를 생성하는 순서는 위와 같다고 한다.

Dockerfile 작성

What is Dockerfile?

도커파일이란 도커 이미지를 만들기 위해 필요한 설정 파일로, 컨테이너가 어떤 행동을 취해야 하는지 등에 대한 설정을 정의해주는 파일

How to make dockerfile?

  1. 베이스 이미지 명시(파일 스냅샷)
  2. 추가적으로 필요한 파일을 다운 받기 위한 명령어 명시(파일 스냅샷)
  3. 컨테이너 시작 시 자동으로 실행될 명령어 명시(명령어)

ex) 카카오톡을 실행하는 이미지의 도커파일을 만든다면
1. 카카오톡을 실행할 OS (Ubuntu)
2. 카카오톡 실행을 위한 파일 다운 명령어
3. run kakaotalk과 같은 카카오톡 실행 명령어

What is base image?

이미지의 기반이 되는 레이어로 os정도로 이해하면 된다.

Do it

목표: hello world 출력하는 dockerfile 생성

  1. 원하는 directory에 dockerfile이라는 파일을 생성한다.
  2. 베이스 이미지를 아래와 같이 명시해준다.
    From baseImage
    <이미지 이름>:<태그> 형식으로 작성하며, 태그를 안 붙이면 가장 최신 이미지를 선택하게 됩니다.
    ex) ubuntu:16.04
  1. 추가적으로 필요한 파일들을 다운로드 받는다.
    Run command
    도커 이미지가 생성되기 전에 수행될 쉘 명령어를 입력해주면 됩니다.
  1. 컨테이너 시작 시 실행될 명령어를 명시해준다.
    CMD ["executable"]
    말 그대로 컨테이너가 시작되었을 때 실행할 실행 파일 혹은 쉘 스크립트를 작성해주면 됩니다.
    해당 명령어는 dockerfile내에서 1회만 쓸 수 있습니다.

실제 우리가 원하는 목표대로 위 항목을 적어주면 아래와 같습니다.
baseImage로는 지난 시간에도 썼던 가벼운 이미지인 alpine을 사용하겠습니다. "echo hello world"를 위해서 따로 필요한 쉘 명령어는 없으므로 Run은 생략하고
CMD에 ["echo","hello world"]를 적어주겠습니다. 그러면 다음과 같은 내용으로 도커파일을 작성할 수 있습니다.

to Docker server

이렇게 작성한 도커 파일은 도커 클라이언트에 전달되어서 도커 서버가 이를 인식하게 됩니다. 이를 실행하기 위한 명령어는 아래와 같습니다.

docker build ./
docker build .

위를 실행하면 아래와 같은 결과가 나오는 것을 확인할 수 있습니다.

간략하게 보면 alpine 이미지를 다운받아 image를 생성해준 후 해당 이미지의 키 값을 알려줌을 확인할 수 있습니다.

Make Container

이렇게 이미지를 도커 허브에 올렸으면 기존에 배웠던 docker run 명령어로 실행해볼 수 있습니다.

위에서 얻은 키 앞의 일부분을 입력해서 제대로 실행됨을 확인할 수 있습니다.
하지만 기존의 이미지들은 허브로부터 다운받을 때 위와 같은 복잡한 키 형식이 아니라 간단한 이름 형식이었습니다. 해당 방식의 경우는 dockerfile build 시에 정해줄 수 있습니다.
다만, 이 과정에서 이름을 마구잡이로 정하기보다는 사람들이 사용하는 양식을 지키는 것이 좋습니다. 양식은 다음과 같습니다.
-t dockerId/storage or project:verson
ex) -t mer9ury/docker-tutorial:1

이 방식으로 한번 빌드해보겠습니다.

좀 더 간편하게 빌드되는 것을 확인할 수 있습니다.

profile
글많은 개발자

0개의 댓글