Learning/Docker

[Docker]이미지, 컨테이너 만들기 : Dockerfile, build, commit

eHYU- 2023. 12. 26. 17:42

Docker 구성 : 이미지, 컨테이너 만들기

이전글 [Docker & Kubernetes] - [Docker] 도커에 대해 알아보자


도커(Docker) 구성

그림 [1-1] 도커 구성도

그림 [1-1] 출처 : 패스트 캠퍼스 Kubernetes와 Docker로 한번에 끝내는 컨테이너 기반 MSA

구성 요소 설명 특징
도커 엔진(Docker Engine) 핵심 컴포넌트로, 컨테이너를 빌드하고 수행하는 역할을 수행 ⦁ 클라이언트-서버 아키텍처로 구성되어 있고, 클라이언트는 도커 명령어를 입력하여 서버에 요청을 보내고, 서버는 해당 명령을 실행
도커 이미지(Docker Image) 애플리케이션을 실행하기 위한 파일, 라이브러리, 환경설정 등을 포함하는 가상 이미지 ⦁ 이미지는 읽기 전용이고, 여러 개의 계층으로 구성되어있어, 이미지에 변경 사항이 발생하면 새로운 계층이 생성되어 이전 계층을 덮어쓰지 않고 쌓이게 된다.(레이어)
도커 컨테이너(Docker Container) 도커 이미지를 기반으로 실행되는 가상 환경 ⦁ 격리된 프로세스 그룹으로, 파일 시스템, 네트워크, 프로세스 공간등을 공유하지 않고 독립적으로 실행된다.
도커 레지스트리(Docker Registry) 도커 이미지를 저장하고 공유하는 저장소 ⦁ 대표적으로 Docker Hub가 있고, 사용자는 이미지를 Docker Hub에 업로드하거나 다운로드하여 사용할 수 있다.

표 [1-1] 도커 구성요소 설명과 특징

이미지 구성

도커 이미지 이름은 단순한 문자열이지만, 도커 레지스트리에서 내부적으로는 파싱되어 사용된다.

  • 도커 이미지 이름 형식
<namespace>/<image_name>:<tag>
# eun98com/eun98:0.0.1

그림[1-2] 도커 이름 형식

이미지 만들기, 컨테이너 시작

도커 이미지를 만드는 방법에는 크게 두가지가 있습니다DockerFile을 build 명령어로 이미지 만들기

  1. DockerFile을 build 명령어로 이미지 만들기
  2. 컨테이너를 commit 명령어로 이미지로 만들기

이때 build는 Dockerfile을 통해 이미지를 구체적으로 시간의 순서에 따라 기록하고 생성하고, commit은 백업과 비슷하게 생각하면 편하다.

그림[1-3] 도커 명령어를 통해 이미지 만들기

Dockerfile

Dockerfile이란?

  • 도커파일(Dockerfile)은 도커 이미지를 빌드하기 위한 설정 파일로, 도커 이미지를 어떻게 구성할지에 대한 정보들이 포함 되어있다.
  • 도커는 도커파일에 나열된 명령문을 차례대로 수행하여 이미지(Image)를 생성한다.

Dockerfile 기본 구조

# 도커파일의 베이스 이미지를 지정
FROM base_image

# 작업 디렉토리를 설정
WORKDIR /app

# 필요한 파일을 복사
COPY source destination

# 명령어를 실행하여 소프트웨어 설치 또는 설정
RUN command

# 컨테이너가 시작될 때 실행될 명령어를 지정
CMD ["executable", "param1", "param2"]

Dockerfile예제

도커파일로 간단한 Ubuntu 기반 이미지를 build하고 컨테이너를 생성해보는 예제 입니다.

  • 간단한 script파일 작성
# /home/docker-test/script.sh
#!/bin/bash

echo "Hello, Docker-World!"
  • 도커파일 작성
# /docker-test/Dockerfile
# 베이스 이미지 Ubuntu 20.04로 지정
FROM ubuntu:20.04

# 작업 디렉토리 설정
WORKDIR /usr/src/app

# 로컬 script.sh 파일 컨테이너 현재 디렉토리로 복사
COPY script.sh .

# script.sh 실행 권한 부여
RUN chmod +x script.sh

# 컨테이너가 시작될 때 실행할 명령어
CMD ["./script.sh"]
  • 도커파일 build → 이미지 생성

buildDockerfile명을 가진 파일을 기준으로 이미지가 생성된다.

$ docker build docker-test .
# docker build <image_name> .

  • 생성된 image 조회

docker-test 이미지가 생성된 것을 확인할 수 있다.

$ docker images

  • 컨테이너 생성

Dockerfile로 생성한 docker-test 이미지를 컨테이너로 생성한다.

$ docker run docker-test:latest
# docker run <image_name>:<tag>

앞선 로컬에서 작성한 script.sh 파일이 실행되는 것을 확인할 수 있다.

Docker commit

  • 컨테이너명 docker-test 생성

앞선 Dockerfile을 통해 만든 이미지를 기반으로 컨테이너 명을 docker-test로 생성한다.

$ docker run --name docker-test docker-test:latest
# docker run --name <container_name> <images_name>:<tag>
  • 생성한 컨테이너 조회

따로 커맨드를 주지않았기에 컨테이너가 실행되고 종료되기에 -a 옵션을 추가해서 전체 컨테이너를 조회한다.

컨테이너 NAMES가 docker-test 확인

$ docker ps -a

$ docker commit <container_name> <image_name>
# docker commit <container_name> <image_name>
  • commit을 통해 컨테이너기반 이미지 생성

docker-test1 이미지가 추가로 생성된 것을 확인할 수 있다.

$ docker commit docker-test docker-test1
# docker commit <container_name> <image_name>