본문 바로가기

Development/Web

Docker 이미지 만드는 방법과 DockerFile 기초 내용

들어가며

지난번 내용(Docker 포트포워딩과 드라이브 연결)에 이어서 이번에는 도커 이미지를 만들고, 이를 commit, pull 하는 내용에 대해서 정리하였다.

image의 순환 과정

자세한 내용을 살펴보기 전에 먼저 이전에 다룬 내용을 떠올려보자. 아래는 도커 이미지의 순환 과정을 도식화한 그림이다.

그림을 보면, docker hub를 통해 이미지를 다운로드(pull)받고, 이는 각각의 컨테이너에서 실행(run)된다. 각각의 컨테이너는 다시 또 다른 이미지로 재탄생(commit)할 수 있으며, 자신이 재탄생시킨 이미지를 docker hub에 업로드(push)하여 공유할 수 있다. 예를 들어, 서로 다른 ubuntu 컨테이너에 각각 Node.js, Python가 설치된 이미지를 생성하는 과정은 아래 그림과 같이 나타낼 수 있다.

새로운 image 만들기

위의 내용과 같이 새로운 이미지를 commit하는 실습을 해보자.

1) git이 설치된 ubuntu 이미지 생성

👉 ubuntu 이미지 다운로드

아래 명령어를 입력하여 ubuntu 이미지를 다운로드 받는다.

$ docker pull ubuntu

이미지 목록을 확인하여 다운로드가 잘 되었는지 확인한다.

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    54c9d81cbb44   2 weeks ago   72.8MB

👉 컨테이너 실행

다운로드 받은 ubuntu 이미지를 my-ubuntu라는 이름으로 실행하고, bash를 통해 해당 컨테이너를 직접 제어해보자.

$ docker run --name my-ubuntu -it ubuntu bash

👉 git 설치

지난 글에서도 언급하였듯이 이번에도 다운로드 받은 이미지에는 ubuntu 외엔 불필요한 소프트웨어가 설치되어 있지 않다. git을 설치하기 전에 ubuntu에서 주로 사용하는 apt를 업데이트하고, git을 설치한다.

root@1f2ab53a6200:/# apt update -y && install git -y

git이 설치되었으면 해당 컨테이너의 bash를 빠져나오자.

root@1f2ab53a6200:/# exit

👉 새로운 image로 생성

컨테이너를 새로운 이미지로 만드는 명령어의 구조를 살펴보면 아래와 같다.

$ docker commit {CONTAINER_NAME} {REPOSITORY:NEW_IMAGE_NAME}

위에서 작업한 컨테이너를 새로운 이미지로 commit 해보자.

$ docker commit my-ubuntu choewy:ubuntu-git

한 번 확인해보면 아래와 같이 새로운 이미지가 목록에 추가된 것을 볼 수 있다.

$ docker images
REPOSITORY   TAG          IMAGE ID       CREATED          SIZE
choewy       ubuntu-git   e0578d96b299   13 seconds ago   208MB
ubuntu       latest       54c9d81cbb44   2 weeks ago      72.8MB

2) nodejs가 설치된 ubuntu-git 이미지 생성

👉 컨테이너 실행

$ docker run -it --name ubuntu-nodejs choewy:ubuntu-git

👉 nodejs 설치

root@ca69aa762fc6:/# apt update && apt install -y nodejs 

👉 새로운 image로 생성

$ docker commit ubuntu-nodejs choewy:ubuntu-nodejs

3) Python이 설치된 ubuntu-git 이미지 생성

👉 컨테이너 실행

$ docker run -it --name ubuntu-python3 choewy:ubuntu-git

👉 python3.9 설치

root@131156f736ba:/# apt update && apt install -y python3.9 

👉 새로운 image로 생성

$ docker commit ubuntu-python3 choewy:ubuntu-python3

DockerFile

위에서는 도커 컨테이너 내부에 직접 접속하여 각각 node.js와 python3가 설치된 새로운 이미지로 변환하는 과정에 대해서 다루어보았다. 이러한 방법도 좋은 방법이지만, 위에서 만든 각각의 이미지는 단지 이미지의 이름을 통해서만 해당 이미지의 내용을 유추할 수 있을 뿐, 정확한 내용을 확인할 수 없다는 문제점이 있다. DockerFile로 이미지를 생성하면, 위의 문제점을 해결하는 동시에 더욱 편리하게 이미지를 생성할 수 있다. 예를 들어, ubuntu에 git과 node.js가 설치된 이미지를 생성하는 DockerFile의 코드는 아래와 같다.

FROM ubuntu
RUN apt update 
RUN apt install -y git
RUN apt install -y nodejs

이어서 DockerFile을 실행하여 이미지로 빌드할 수 있는데, 명령어의 구조를 먼저 살펴보면 아래와 같다.

$ docker build [OPTIONS] {REPOSITORY:NEW_IMAGE_NAME} {DOCKERFILE_PATH}

현재 DockerFile이 있는 디렉토리에서 빌드하는 명령어는 아래와 같다. 이때, -t는 이미지 이름을 지정하는 옵션이며, 마지막에 .는 현재 명령어가 실행되는 경로(실행할 DockerFile의 경로)를 의미한다.

$ docker build -t choewy:ubuntu-git-nodejs .

마치며

여기까지 도커 이미지를 생성하는 방법과 DockerFile을 다루는 기초 내용에 대해서 정리해보았다. 다음에는 DockerFile에 대한 자세한 내용에 대해서 공부하고, 정리하도록 하겠다.