땃쥐네

[Docker] 도커 이미지를 빌드하는 기본적인 방법 본문

DevOps/Docker

[Docker] 도커 이미지를 빌드하는 기본적인 방법

ttasjwi 2022. 12. 4. 17:35

이전 글까지의 내용을 통해 기본 이미지를 사용하는 것까지 할 수 있게 됐다.

여기서 더 나아가, 개발자 스스로 새로운 도커 이미지를 빌드하는 방법을 다뤄볼 것이다.

 

여기서는 간단한 예시를 통해 확인해보자.


1. docker commit을 통해 이미지 빌드하기

 

첫번째 방법은 이미 있는 이미지를 기반으로 컨테이너를 실행하고, 컨테이너의 상태를 변경하여 이를 기반으로 이미지를 만드는 것이다. 

 

1.1 도커 컨네이너 실행

docker run -i -t ubuntu:22.04 /bin/bash

ubuntu 22.04에서 컨테이너를 실행하고, 터미널 입력 모드로 진입한다.

  • -i : 대화식 명령
  • -t : TTY(단말 디바이스) 할당
  • /bin/bash 명령을 호출한다.
  • 결과적으로 도커 컨테이너를 실행하고, 터미널 입력 모드로 진입하여 입력, 출력을 동시에 확인할 수 있다.
  • 컨테이너 자체는 읽기/쓰기가 가능하므로 터미널 내에서 원하는 모든 작업을 수행하여 컨테이너의 상태를 변경할 수 있다.

1.2 Git 설치

apt-get update
apt-get install -y git

Git 툴킷을 설치한다.

  • apt-get update : 설치된 패키지들의 새로운 버전이 있는 지 확인한다.
  • apt-get install ~ : ~ 패키지를 다운로드한다.
    • -y : 무조건 yes

1.3 Git 툴킷 설치 확인

which git
/usr/bin/git

git이 어디에 설치되어 있는 지 확인한다.

1.4 컨테이너에서 나오기

exit

컨테이너에서 나오기 위해서, exit를 호출해 터미널을 종료한다.

1.5 docker diff : 기존 이미지와 변경점 확인

docker ps -al
docker diff bb7b4f4b96d6 

컨테이너의 id를 확인한 후, 이미지와 비교해 무엇이 변경됐는 지 확인한다.

1.6 이미지 커밋

docker commit bb7b4f4b96d6 ubuntu_with_git
  • 컨테이너를 이미지로 커밋한다.
  • ubuntu_with_git 이라는 새로운 이미지 이름을 부여한다.

1.7 이미지 확인

docker images
REPOSITORY        TAG       IMAGE ID       CREATED         SIZE
ubuntu_with_git   latest    118747bb9ae4   6 seconds ago   193MB
ubuntu            22.04     a8780b506fa4   3 weeks ago     77.8MB
  • 로컬 저장소에 ubuntu_with_git 이름으로, 방금 만든 도커 이미지가 추가된 것을 확인할 수 있다

1.8 새로 만든 이미지로 컨테이너 실행

docker run -i -t ubuntu_with_git /bin/bash
root@d2e540e347a3:/# which git

## /usr/bin/git 가 출력창에 뜬다.

root@d2e540e347a3:/# exit
  • 우리가 만든 새로운 이미지로 컨테이너를 실행해보면, 이전에 git을 추가한 상태가 저장된 것을 확인할 수 있다.

1.9 이미지에 새로운 애플리케이션 이미지 추가

docker run -i -t ubuntu_with_git /bin/bash
root@ca0dd5ef499b:/# apt-get install -y openjdk-17-jdk
...

root@ca0dd5ef499b:/# exit
docker commit 24c7b75b0a0f ubuntu_with_git_and_jdk

이와 같은 방식으로, 기존 이미지의 컨테이너 위에 새로운 애플리케이션을 추가적으로 설치하는 등, 상태를 변경시키고
새로운 이미지로 상태를 저장할 수 있다.


2) Dockerfile을 통해 이미지 빌드하기

2.1 ubuntu 위에 python3를 설치한 이미지를 만드는 Dockerfile

FROM ubuntu:22.04
RUN apt-get update && \
    apt-get install -y python3
  • 아무 경로에서, 위 내용으로 Dockerfile을 만든다.
    • 참고로, 파이썬 인터프리터가 포함된 이미지는 이미 도커 허브에서 제공되고 있다. 실무에서는 python 이미지를 가져와서 사용하면 된다.

2.2 Dockerfile로 이미지 빌드하기

docker build -t ubuntu_with_python3 .
  • -t : '이미지명:태그'를 사용하는 경우다. 태그를 지정하지 않으면 latest가 된다.
  • . : 현재 경로의 Dockerfile을 읽어서 이미지를 빌드하겠다는 것이다.

2.3 빌드한 이미지 확인하기

docker images

생성된 이미지를 확인한다.


3) 자주 사용하는 Dockerfile 명령어

  • FROM : 새로운 이미지가 추가될 베이스 이미지를 정의한다.
    • 예) FROM ubuntu:22.04
  • RUN : 컨테이너에서 실행할 명령어를 지정한다.
    • 예) RUN apt-get update && \
  • COPY/ADD : 파일이나 디렉터리를 이미지의 파일 시스템으로 복사한다.
  • ENTRYPOINT : 컨테이너를 생성할 떄 항상 실행할 애플리케이션을 정의한다.
  • ENV : 환경변수 지정
  • VOLUME : 볼륨(이후 다룰 예정)을 이미지 빌드에 미리 설정하는 경우 작성
  • WORKDIR : 컨테이너 상에서 작업할 경로 전환
  • 그 외 Dockerfile 명령어 : https://docs.docker.com/engine/reference/builder/

4) 도커 애플리케이션 완성하기

여기서는 간단한 hello wolrd 파이썬 파일을 컨테이너에서 실행해보도록 한다.

 

4.1 hello.py 작성

print('Hello World from Python!')
  • 단순히 stdout으로 Hello World를 출력하는 파이썬 애플리케이션을 작성한다.

4.2 Dockerfile 수정

FROM ubuntu:22.04
RUN apt-get update && \
    apt-get install -y python3
COPY hello.py .
ENTRYPOINT [ "python3", "hello.py" ]
  • COPY : 경로 상의 hello.py를 이미지의 파일 시스템으로 복사한다.
  • ENTRYPOINT : 컨테이너 실행 후, python3을 통해 hello.py를 실행하도록 ENTRYPOINT 명령어를 지정한다.

4.3 이미지 빌드하기

docker build -t hello_world_python .
  • Dockerfile을 기반으로 이미지를 빌드한다

4.4 실행

docker run hello_world_python
Hello World from Python!
  • 생성한 이미지를 기반으로 컨테이너를 실행한다.
  • hello.py 의 코드가 실행되는 것을 확인할 수 있다.

5) 환경 변수 정의하기

여기서는 환경변수로 NAME=tttasjwi 으로 정의하고

hello wolrd 파이썬 파일에서 환경변수를 읽어와 실행해보도록 한다.

 

5.1 hello.py에서 시스템 환경변수를 참조해 사용하도록 수정

import os

print(f'Hello World from {os.environ["NAME"]} !')
  • 시스템 환경변수 'NAME'을 불러와서 사용하도록 hello.py의 코드를 변경했다.
    • 참고로 f 문자열은 python3에서 제공하는 기능 중 하나로, 문자열 안에 표현식을 {}를 통해 삽입할 수 있다.

5.2 환경변수를 전달하여 컨테이너 실행하는 방법

docker build -t hello_world_python_name .
docker run -e NAME=ttasjwi hello_world_python_name
Hello World from ttasjwi !
  • 도커 이미지를 빌드하고, 실행 시점에 -e 옵션을 통해, 환경변수를 정의한다.
  • -e, --env : 컨테이너에 환경 변수를 정의한다.
  • 실행하면 해당 hello.py, NAME 환경변수를 참조하여 출력문을 실행한다.

5.3 Dockerfile에 환경변수를 전달하여 이미지를 빌드 후, 컨테이너

FROM ubuntu:22.04
RUN apt-get update && \
    apt-get install -y python3

COPY hello.py .
ENV NAME ttasjwi

ENTRYPOINT ["python3", "hello.py"]
docker build -t hello_world_python_name_default .
docker run hello_world_python_name_default
Hello World from ttasjwi !
  • Dockerfile 에서 ENV를 통해 환경변수를 지정할 수 있다.
  • 이미 컨테이너 이미지 차원에서 환경변수 정보를 가지고 있으므로 더 이상 run 명령어를 통해 환경변수를 전달할 필요가 없어진다.
    -e 옵션을 사용하지 않고 컨테이너를 실행하면 아까와 같은 결과를 얻을 수 있다.
    • 참고로, 도커 파일과 명령어에 모두 환경변수가 지정됐다면, 명령어에 지정된 값이 우선 적용된다.

이상으로 도커 이미지를 사용자가 정의하는 방법을 확인했다.

 

여기서 몇 번의 응용을 더 거치면 java, node.js로 작성된 코드를 기반으로 웹 서버 이미지 파일을 만들어 배포할 수 있을 것 같다. 화이팅!


Comments