리눅스데브코스 [16주차 - 2]<리눅스 컨테이너와 Docker (4)>

심우열·2023년 7월 25일
0

1. Docker 라이프 사이클

1. 컨테이너 패키징

  • 이미지 생성

2. 패키징된 이미지 실행

  • 컨테이너 전개

3. 컨테이너 종료

4. 종료된 컨테이너 보관

1. 컨테이너 이미지 패키징

1. 기본 명령어

docker build

2. 태그를 추가해 이미지 구분

docker build -t 사용자이름/이미지이름:버전태그

ex)

docker build -t w10sim/ppp:1.0

3. 이미지에 원하는 내용 구성

  • 도커파일(Dockerfile)을 통해, 컨테이너의 환경 구성 가능

Docker build 로 컨테이너 만들 경우

  • 실행 경로에 Dockerfile이 있어야 함

Dockerfile이 다른 경로에 위치하면

docker build -f /경로/도커파일
  • 도커 파일의 이름 및 위치 치정 가능

2. 컨테이너 전개

1. 기본 명령어

docker run [run 옵션] 이미지 이름 [컨테이너 실행 옵션(명령어)]

2. 컨테이너 일시 중지

docker pause <컨테이너 ID/식별 이름>
  • 시그널 SIGSTOP 을 통해 처리됨

3. 중지된 컨테이너 시작

docker start <컨테이너 ID/식별 이름>

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

docker ps

중지된 모든 컨테이너 포함

docker ps -a
  • 삭제된 컨테이너는 안나옴

3. 컨테이너 종료

1. 기본 명령어

docker stop <컨테이너 ID/식별 이름>
  • 시그널 SIGTERM 통해 종료됨

2. 강제 종료

docker kill <컨테이너 ID/식별 이름>

4. 종료된 컨테이너 환경을 이미지로 보관

docker commit <컨테이너 ID/식별 이름> [새로운 태그]
  • 실행 중에 변경된 사항이 저장됨
  • 저장된 결과는 태그를 주어 새로운 이름 부여 가능

2. 도커 패턴

1. 기반 이미지 공유

공통된 환경을 가지는 애플리케이션들을 위해 구성

  • 다른 애플리케이션과 공유하거나 애플리케이션을 쉽게 배치하는데 활용

ex)

  • 루피, 파이썬, 자바와 같은 런타임 환경
  • 웹 애플리케이션 전개를 위한 런타임 환경
    -> NGINX + Apache Tomcat 환경

2. 공유 볼륨

볼륨

  • Docker의 추가 가능한 디스크 개념
  • 파일 시스템(혹은 일부)를 볼륨으로 컨테이너에 추가 가능

호스트 수준의 볼륨?

  • 여러 컨테이너에서 공유 가능
  • 컨테이너와 볼륨은 서로 별도의 라이프사이클을 가짐

3. 개발 도구 컨테이너

개발용 환경과 프로덕션용 환경이 다를 때

  • 개발용 환경: 소스 컴파일 등 개발을 위한 환경
  • 프로덕션용 환경: 소프트웨어 결과물이 동작하기 위한 런타임 환경

컨테이너를 이용해 두 환경을 분리하여 개발/운영 가능

4. 테스트 환경 컨테이너

테스트를 위한 환경(TDD)

  • 유닛 테스트
  • 커버리지 테스트
  • 통합 테스트

5. 빌드 컨테이너

애플리케이션 빌드가 복잡할 때

  • 애플리케이션 빌드 환경 의존성을 구성한 환경
  • 빌드 컨테이너의 결과물을 컨테이너 종료시에도 사용 가능하도록 별도 볼륨을 사용

CI(지속적인 통합)를 위해 구성함

6. 설치 컨테이너

소프트웨어 설치 및 전개를 위한 컨테이너

  • 설치과정이 복잡할 때 설치를 자동화하기 위한 환경 구성

7. 서비스 박스 컨테이너

서비스를 위한 컨테이너

  • 서비스를 위한 소프트웨어를 넣어둔 컨테이너
    -> 하나의 컨테이너에 모두 탑재하거나,
    -> 여러 컨테이너가 협력하도록 할 수 있음(Docker compose를 활용)

8. Infrastructure 컨테이너

서비스/시스템 운영을 위한 컨테이너

  • 네트워크 프록시/캐시
  • 로드밸런서

9. 유니커널(UNIKERNEL)

장점

  • 빠른 부팅 시간
  • 적은 메모리 용량
  • 향상된 보안
  • 세밀한 최적화
  • 마이크로서비스 아키텍처와 잘 어울림

단점

  • 수정 불가->소스코드를 통해서만 변경 가능
  • 소스코드 변경 후 다시 빌드

3. Dockerfile 구문

1. FROM 구문

기반 이미지를 저장

# FROM [이미지 이름]
# FROM [이미지 이름:태그(버전)]
# FROM [이미지 이름@다이제스트]
FROM ubuntu:20.04
  • 이미지 이름만 사용하면 latest 태그를 자동으로 적용

2. MAINTAINER 구문

이미지의 제작자를 기록(옵션)

# MAINTAINER [이름] [<이메일>]
MAINTAINER w10sim <w10sim@naver.com>

3. ENV 구문

이미지의 환경 변수를 설정

  • 컨테이너 전개시에 바로 적용
# ENV [환경변수1 이름] [값1] [환경변수2 이름] [값2] ...
ENV APP_VERSION=x.y.z APP_NAME="foo bar"

4. RUN 구문

실행 결과는 새로운 레이어로 구성

  • 레이어는 파일시스템 및 환경 정보
  • RUN 등의 구문 실행으로 컨테이너 파일시스템의 변경이 록될 때, 새로운 레이어에 변경사항 등록
  • 레이어가 많으면 다운속도 느리고 데이터 압축에도 오랜시간 걸림
  • 레이어는 무한대가 아님

컨테이너 환경을 구성하기 위한 명령 실행

  • 실행은 이전 레이어에서 실행
  • 구문의 순서가 중요함

기본 구문(SHELL 형식)

# RUN [명령]
RUN apt-get update
RUN apt-get install gcc g++
  • 명령은 기본 쉘(/bin/sh -[명령])로 실행 됨

여러개의 명령 적용

# RUN [명령1]; [명령2]; ...
RUN apt-get update; install gcc g++

EXEC 형식 구문

# RUN ["실행파일", "매개변수1", "매개변수2" ..]
RUN [ "/bin/bash", "-c", "echo True!"]

5. ADD 구문

호스트의 파일시스템 혹은 원격URL에 있는 파일/디렉토리를 컨테이너 이미지로 복사

# ADD [원본] [목적지 디렉토리]
ADD xyz.c /data

여러개의 파일 복사

# ADD [원본파일1] [원본파일2] ... [목적지 디렉토리]
ADD abc.c def.c xyz.c /data

디렉토리 복사

# ADD [원본 디렉토리] [목적지 디렉토리]
ADD ./xyz /data
  • 빈 디렉토리는 복사 안됨
  • 파일시스템 정보(메타데이터)도 함께 복사됨

와일드 카드(*)

# ADD [원본파일*] [목적지 디렉토리]
ADD xyz*.c /data

특징

  • 컨테이너에 복사된 파일/디렉토리의 소유주는 0
  • 소스 파일이 원격URL인 경우, 파일 권한은 600
  • 호스트 파일이 원본인 경우 빌드 컨텍스트에서 상대 경로임
  • 호스트 파일 원본이 압축인 경우, 압축을 해제해 디렉토리 형태로 처리됨
  • 원본이 여러개일때 목적지는 디렉토리여야 하며, 끝에 '/'를 붙여주어야 함
  • 목적지가 없다면 새로 생성됨(부모 경로 포함)

6. COPY 구문

ADD 처럼, 원본을 컨테이너의 지정한 위치로 복사

ADD와 차이점

  • 압축파일도 그대로 복사
  • 원본이 다른 스테이지로부터 복사 가능
profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

1개의 댓글

comment-user-thumbnail
2023년 7월 25일

공감하며 읽었습니다. 좋은 글 감사드립니다.

답글 달기