Dockerfile과 이미지 빌드

TAEWOO HA·2023년 7월 18일
0

Docker

목록 보기
2/7

도커 라이프사이클

  1. 컨테이너 패키징 è 이미지 생성
  2. 패키징된 이미지 실행 è 컨테이너 전개
  3. 컨테이너 종료
  4. 종료된 컨테이너 환경 보관

컨테이너 이미지 패키징

  • docker build

    컨테이너 이미지 패키징 (2)

    태그를 추가하여 이미지 구분하기
    docker build –t 사용자이름/이미지이름:버전태그
    docker build –t kookmin/oslab:1.0

컨테이너 이미지 패키징 (3)

이미지에 원하는 내용을 구성하려면?
도커파일(Dockerfile)을 통해, 컨테이너의 환경을 구성할 수 있다.
docker build로 실행하는 경우 실행하는 경로에 Dockerfile 이 있어야 한다

컨테이너 이미지 패키징 (4)

docker build -f /경로/도커파일
도커파일의 이름 및 위치를 지정할 수 있다.

컨테이너 이미지 패키징 (5)

이미지 이름도 정하고, Dockerfile 위치도 정한다면?
docker build -t 사용자이름/이미지이름 -f /경로/도커파일
docker build -t kookmin/oslab -f ./config/A.Dockerfile

컨테이너 전개

기본 명령어 형태
docker run [run 옵션] 이미지이름 [컨테이너 실행 옵션(혹은 명령어)]

컨테이너 전개 (2)

컨테이너 일시 중지
docker pause <컨테이너 ID/식별이름> (SIGSTOP)

중지된 컨테이너 시작
docker start <컨테이너 ID/식별이름>

컨테이너 전개 (3)

전개중인 컨테이너 확인 (실행, 중지 포함)
docker ps

중지된 모든 컨테이너 포함하려면
docker ps -a
삭제된 컨테이너는 나타나지 않는다.

컨테이너 종료

기본 명령어 형태
docker stop <컨테이너 ID/식별이름>
시그널 SIGTERM 을 컨테이너 내의 프로세스에 전달한다.

강제 중단
docker kill <컨테이너 ID/식별이름>

컨테이너 종료 (2)

종료된 컨테이너 환경을 이미지로 보관
docker commit <컨테이너 ID/식별이름> [새로운 태그]
실행 중에 변경된 사항이 저장된다
저장된 결과는 태그를 주어 새로운 이름으로 부여할 수 있다.

도커 패턴

기반 이미지 공유

¡ 공통된 환경을 가지는 애플리케이션들을 위해 구성
¡ 다른 애플리케이션과 공유하거나
애플리케이션을 쉽게 배치하는데 활용
¡ 예)
¡ 루비, 파이썬, 자바와 같은 런타임 환경
¡ 웹 애플리케이션 전개를 위한 런타임 환경
¡ Nginx + Apache Tomcat 등

공유 볼륨

¡ 볼륨
¡ Docker 의 추가 가능한 디스크 개념
¡ 파일시스템(혹은 일부)를 볼륨으로 컨테이너에 추가 가능
¡ 호스트 수준에서 볼륨은…
¡ 여러 컨테이너에서 공유 가능
¡ 컨테이너와 볼륨은 서로 별도의 라이프사이클을 가진다.

개발 도구 컨테이너

¡ 개발용 환경과 프로덕션용 환경이 다를 때.
¡ 개발용 환경 : 소스 컴파일 등 개발을 위한 환경
¡ 프로덕션용 환경 : 소프트웨어 결과물이 동작하기 위한 런타임 환경
¡ 컨테이너를 이용해 두 환경을 분리하여 개발/운영 가능

테스트 환경 컨테이너

¡ 테스트를 위한 환경 (TDD)
¡ 유닛 테스트
¡ 커버리지 테스트
¡ 통합 테스트

빌드 컨테이너

¡ 애플리케이션 빌드가 복잡할 때…
¡ 애플리케이션 빌드 환경 의존성을 구성한 환경
¡ 빌드 컨테이너의 결과물
è 볼륨에 사용
è 컨테이너 종료시에도 사용 가능하게!
¡ 보통 지속적인 통합(CI, Continuous Integration)을 위해 구성

설치 컨테이너

¡ 소프트웨어 설치 및 전개를 위한 컨테이너
¡ 설치가 복잡할 때,
¡ 설치를 자동화하기 위한 환경 구성

서비스 박스 컨테이너

¡ 서비스를 위한 컨테이너
¡ 서비스를 위한 소프트웨어를 넣어둔 컨테이너
¡ 하나의 컨테이너에 모두 넣을 수도 있고
¡ 여러 컨테이너가 협력하도록 할 수도 있다.
¡ 이런 경우 DOCKER-COMPOSE 를 많이 사용한다.

INFRASTRUCTURE 컨테이너

¡ 서비스/시스템 운영을 위한 컨테이너
¡ 네트워크 프록시 / 캐쉬
¡ 로드밸런서

DOCKERFILE 구문 기초

DOCKERFILE 로 작성하기

¡ FROM 구문
¡ 기반 이미지를 지정한다.
FROM 이미지이름
FROM ubuntu:20.04

MAINTAINER 구문

이미지의 제작자를 기록해 둔다. (옵션)
MAINTAINER 이름 이메일
MAINTAINER Daeyoung Heo dyheo@kookmin.ac.kr

ENV 구문

이 이미지의 환경 변수를 설정한다.
¡ 컨테이너 전개시에 바로 적용된다.
¡ 환경 변수는 향 후 수업에서 상세히 다룬다.

ENV 환경변수이름 값
ENV 환경변수이름1=값1 환경변수이름2="공백이 있는 값2"

ENV 구문 (2)

예제
ENV 환경변수이름 값
ENV 환경변수이름1=값1 환경변수이름2="공백이 있는 값2"
ENV DEBIAN_FRONTEND noninteractive
ENV APP_VERSION=x.y.z APP_NAME="foo bar"

RUN

¡ 실행 결과는 새로운 레이어로 구성
¡ 컨테이너 환경을 구성하기 위한 명령 실행
¡ 실행은 이전 레이어에서 실행한다.
¡ 구문의 순서가 중요하다

기본 구문(쉘 형식)
명령은 기본 쉘(/bin/sh -c <명령>)로 실행된다.
RUN 명령
RUN apt-get update
RUN apt-get install gcc g++

¡ EXEC 형식
RUN ["실행파일", "매개변수1", "매개변수2"]
RUN [ "/bin/bash", "-c", "echo True!" ]

여러 개의 명령을 적용하려면?
쉘에서 여러 개의 명령을 한 줄에 입력하는 방법과 같다.
RUN 명령1; 명령2; 명령3;
RUN apt-get update; install gcc g++

레이어 이미지

레이어 이미지
¡ 레이어는 파일시스템 및 환경 정보
¡ RUN 등의 구문 실행으로
컨테이너 파일시스템의 변경될 때,
새로운 레이어에 변경사항 기록

ADD 구문

호스트의 파일시스템 혹은 원격URL 에 있는 파일/디렉토리를 컨
테이너 이미지로 복사한다
소프트웨어융합대학 허대영 - DYHEO@KOOKMIN.AC.KR 2023. 7. 18.
ADD 원본 목적지디렉토리
ADD lab2-1.c /data

디렉토리를 복사할 수도 있다.
빈 디렉토리는 복사되지 않는다.
파일시스템 정보(메타데이터)도 복사된다.
ADD 원본디렉토리 목적지디렉토리
ADD ./sources /data

와일드카드를 사용할 수도 있다.
유닉스 쉘에서 는 와일드카드로 임의의 글자가 대응된다.
ADD 원본파일
목적지디렉토리
ADD lab2*.c /data

컨테이너에 복사된 파일/디렉토리는 소유주(UID/GID)는 0이다.
¡ 소스 파일이 원격URL 인 경우, 파일은 600 이다.
¡ 즉 소유자만 읽고 쓸 수 있다.
¡ 호스트 파일이 원본인 경우 빌드 컨텍스트에서 상대 경로이다.
¡ 빌드 컨텍스트 상위로 접근은 불가능하다
¡ 호스트 파일 원본이 압축(tar, zip)인 경우, 이를 풀어서 디렉토리 형태로 처리한다.
¡ 원본이 여러 개 일 때는 목적지는 디렉터리여야 하며, 끝에 /를 붙여야 한다.
¡ 목적지가 없다면, 새로 생성된다. (부모 경로도 모두 생성된다.)

COPY

¡ ADD 처럼, (호스트의) 원본을 컨테이너의 지정한 위치로 복사한다.
¡ ADD와 차이점
¡ 압축 파일(ZIP, TAR)도 그대로 복사한다.
¡ * 원본이 다른 스테이지로부터 복사할 수도 있다.
¡ 스테이지 개념은 나중에 다시 설명.

2개의 댓글

comment-user-thumbnail
2023년 7월 18일

유익한 글 잘 봤습니다, 감사합니다.

답글 달기
comment-user-thumbnail
2023년 7월 18일

아주 유익한 내용이네요!

답글 달기