[Docker]이미지, 컨테이너 만들기 : Dockerfile, build, commit
Docker 구성 : 이미지, 컨테이너 만들기
이전글 [Docker & Kubernetes] - [Docker] 도커에 대해 알아보자
도커(Docker) 구성
그림 [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
이미지 만들기, 컨테이너 시작
도커 이미지를 만드는 방법에는 크게 두가지가 있습니다DockerFile을 build 명령어로 이미지 만들기
- DockerFile을
build
명령어로 이미지 만들기 - 컨테이너를
commit
명령어로 이미지로 만들기
이때 build
는 Dockerfile을 통해 이미지를 구체적으로 시간의 순서에 따라 기록하고 생성하고, commit
은 백업과 비슷하게 생각하면 편하다.
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
→ 이미지 생성
build
시 Dockerfile
명을 가진 파일을 기준으로 이미지가 생성된다.
$ 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>