DevOps/Docker

[Docker] 기초 시리즈 (6) 도커 이미지 다루기 - 이미지 직접 생성

유자맛바나나 2022. 4. 30. 14:50

 

[도커 기초 시리즈 포스팅]

[Docker] 기초 시리즈 (1) 도커의 개념과 사용이유

[Docker] 기초 시리즈 (2) Ubuntu에 도커 엔진 설치

[Docker] 기초 시리즈 (3) 이미지와 컨테이너 관계, 도커 아키텍처

[Docker] 기초 시리즈 (4) 도커 이미지의 구조

[Docker] 기초 시리즈 (5) 도커 이미지 다루기 - Docker Hub(Registry)

[Docker] 기초 시리즈 (6) 도커 이미지 다루기 - 이미지 직접 생성 (Now)

[Docker] 기초 시리즈 (7) 자주 사용하는 Dockerfile 명령어

[Docker] 기초 시리즈 (8) 자주 사용하는 도커 명령어 모음

[Docker] 기초 시리즈 (9) 도커 컨테이너 - 개념, 기본 사용법

[Docker] 기초 시리즈 (10) 도커 컨테이너 - Volume 관리

 

❑ 도커 이미지 다루기 - 이미지 직접 생성

유저가 생성하는 도커 이미지는 1) 미지 생성 단계를 정의한 Dockerfile 파일을 만들어 빌드하는 방법과  2)이미 생성된 컨테이너의 변경점을 반영해 이미지를 생성하는 방법이 있다.  

두 가지 방법 모두 일반적으로 도커 허브에서 제공하는 Official 이미지를 내려받아 유저의 목적에 맞게 변경한 후 새로운 이미지로 생성하게 된다. 

 

[참고] 도커 이미지 이름 구성

더보기
{저장소 이름}/{이미지 이름}:{이미지 태그}

예시: citronbanana/nginx:1.41
예시: citronbanana/nginx:latest
  • 도커 이미지 Pull / Push 시 저장소 이름을 생략하면 기본 저장소인 도커 허브로 인식한다

 

 

1) Dockerfile ★

1-1) Dockerfile의 개념

출처:jfrog.com

  • Dockerfile이라고 불리는 텍스트 파일과 docker build 명령어를 통해 이미지를 생성하는 방법이다.
  • Dockerfile에 도커 이미지를 생성하기 위한 FROM, ENV, RUN 등의 Dockerfile 문법 명령어를 작성한다.
  • 호스트 시스템으로부터 이미지에 복사하고 싶은 파일을 명시하고, 컨테이너에 어떤 의존성을 설치해야 하는지, 환경변수 설정은 어떻게 할지, 컨테이너로 만들었을 때 어떻게 구동해야하는지 등을 설정하는 파일이다.
  • Dockerfile 방식은 실제 업무환경(엔터프라이즈 환경)에서 적용하기에 적합한 방법이다.
  • 도커 이미지를 체계적(systematic)이고, 유연하게(flexible) 구축할 수 있고, 안정적(reliable)이고 안전한 컨테이너를 구축할 수 있는 방법이다.
  • 장점
    1. 깨끗하고 컴팩트하며 반복 가능한 레시피 기반(recipe-based) 이미지다.
    2. 라이프 사이클 관리가 편하다
    3. CI, CD 프로세스와 통합이 용이하다
  • 단점
    1. 도커 파일 자체 문법이 따로 있기 때문에 초보자에게 배우는 시간이 필요하다 
  • Dockerfile Official Reference | https://docs.docker.com/engine/reference/builder/

 

1-2) Dockerfile 작성

예제) 우분투(Ubuntu) 이미지에 Nginx 설치 후 새로운 이미지로 만들기

 

Step1. Dockerfile 작성

# 1) 도커 허브에서 우분투 이미지 다운로드
FROM ubuntu:20.04 

# 2) nginx 설치
RUN apt-get update && \
    apt-get update- y && \
    apt-get install -y nginx curl
  • Dockerfile은 지시어(FROM, RUN, ....)와 인자(ubuntu:20.04)의 나열로 구성된다.

 

Step2. docker build 명령어로 이미지 생성

$ docker build -t webserver_nginx:0.0.1 .
*문법: docker build -t {이미지 명}:{태그} -f {도커파일 위치} {빌드 컨텍스트} 
  • 도커 호스트에서 docker build 명령어를 이용해 이미지를 생성한다.
    • -t : tag의 약자. 위 예시에선 이미지 이름이 my_app 이고, 태그가 v1 인 이미지를 생성하는 것
    • -f : 생략 가능한 옵션이다. 빌드 컨텍스트로 사용한 디렉토리에 있는 Dockerfile을 사용하지 않고 다른 위치의 Dockerfile을 사용할 경우 지정
  • nginx:0.0.1 뒤의 . 은 빌드 컨텍스트를 나타낸다. 빌드 컨텍스트는 docker build 명령어 수행시 필요한 파일들이 위치한 도커 호스트의 디렉토리를 의미한다. 아래 [참고] Build Context에서 더 확인해보자
  • 위와 같이 입력하면 빌드 컨텍스트로 지정된 현재 위치에서 'Dockerfile' 이란 이름을 가진 파일을 찾아 webserver_nginx라는 이름의 이미지를 생성해준다 

 

Step3. 생성된 이미지 확인

$ docker images

 

[참고] docker build -f 옵션

더보기

예시1) -f 옵션 미사용. 빌드 컨텍스트에서 'Dockerfile'을 찾음

$ docker build -t webserver_nginx:0.0.1 .

 

예시2) -f 옵션 사용. -f 옵션의 위치에서 'MyDockerfile'을 찾음

$ docker build -t webserver_nginx:0.0.1 -f example/MyDockerfile  .

 

[참고] Build Context (빌드 컨텍스트)

더보기
  • Dockerfile로 docker build 명령어 수행 시 필요한 정보(파일 등)를 docker daemon에게 전달하기 위해 도커 호스트의 디렉토리를 지정해주는 것. 지정된 디렉토리를 빌드 컨텍스트라 함
  • 빌드 컨텍스트로 지정된 디렉토리의 모든 정보는 docker daemon에게 전달된다.
  • 기본적으로는 Dockerfile의 위치를 알려주기 위해 사용하지만, 호스트 OS에 있는 특정 파일들을 복사하기 위해 그 위치를 알려주는 용도 역시 주 목적이다.

 

[참고] .dockerignore

더보기
  • 빌드 컨텍스트로 지정된 디렉토리에 너무 많은 정보가 있을 경우 빌드하는데 시간이 오래 소요될 수 있으므로 불필요한 정보는 .dockerignore로 설정한다
  • .gitignore와 문법이 동일하다

example

*/temp*
*/*/temp*
temp?
*.md

 

 

2) 컨테이너로 이미지 생성 (interactive)

  • docker commit 명령어를 사용해 컨테이너를 이미지로 만드는 방법이다.
  • 도커 컨테이너 생성 후 변경 사항(파일 생성, 변경 등..)을 반영한 이미지로 새롭게 빌드(생성)하고 싶을 때 사용한다.
  • 장점
    1. 도커 이미지를 만드는 가장 빠르고 간단한 방법
    2. testing, trouble shooting, 종속성 결정(determining dependencies), 프로세스 검증(validating processes)에 적합하다
  • 단점
    1. 라이프 사이클 관리가 어렵다
    2. 오류가 발생하기 쉬운 실시간 대화형 프로세스(live interactive processes)를 직접 재구성해야한다
    3. 레이어 최적화된 이미지를 구성하는게 어렵다

 

 

예제) 우분투(Ubuntu) 이미지에 Nginx 설치 후 새로운 이미지로 만들기

Step1. 도커 허브에서 우분투 이미지 다운로드

docker pull ubuntu:20.04

 

Step2. 우분투 이미지로 컨테이너 실행

docker run -it ubuntu:20.04 --name nginx_contatiner

 

Step3. 생성한 컨테이너(webserver_nginx)에 nginx 설치

 # apt-get update && apt-get install -y nginx

 

Step4. 도커 컨테이너 내부 쉘에서 빠져나오기

Ctrl + P, Q

 

Step5. 도커 컨테이너로 새로운 이미지 생성하기

$ docker commit nginx_contatiner webserver_nginx:0.0.1

*문법: docker commit [컨테이너 명] [생성할 이미지 명]:[태그]
  • docker commit 옵션
    • -a : author의 약자. 커밋한 사람 정보
    • -m : commit message

 

Step6. 생성된 이미지 확인

$ docker images

 

 REFERENCE

https://jfrog.com/knowledge-base/a-beginners-guide-to-understanding-and-building-docker-images/