- 컨테이너 패키징 è 이미지 생성
- 패키징된 이미지 실행 è 컨테이너 전개
- 컨테이너 종료
- 종료된 컨테이너 환경 보관
태그를 추가하여 이미지 구분하기
docker build –t 사용자이름/이미지이름:버전태그
docker build –t kookmin/oslab:1.0
이미지에 원하는 내용을 구성하려면?
도커파일(Dockerfile)을 통해, 컨테이너의 환경을 구성할 수 있다.
docker build로 실행하는 경우 실행하는 경로에 Dockerfile 이 있어야 한다
docker build -f /경로/도커파일
도커파일의 이름 및 위치를 지정할 수 있다.
이미지 이름도 정하고, Dockerfile 위치도 정한다면?
docker build -t 사용자이름/이미지이름 -f /경로/도커파일
docker build -t kookmin/oslab -f ./config/A.Dockerfile
기본 명령어 형태
docker run [run 옵션] 이미지이름 [컨테이너 실행 옵션(혹은 명령어)]
컨테이너 일시 중지
docker pause <컨테이너 ID/식별이름> (SIGSTOP)
중지된 컨테이너 시작
docker start <컨테이너 ID/식별이름>
전개중인 컨테이너 확인 (실행, 중지 포함)
docker ps
중지된 모든 컨테이너 포함하려면
docker ps -a
삭제된 컨테이너는 나타나지 않는다.
기본 명령어 형태
docker stop <컨테이너 ID/식별이름>
시그널 SIGTERM 을 컨테이너 내의 프로세스에 전달한다.
강제 중단
docker kill <컨테이너 ID/식별이름>
종료된 컨테이너 환경을 이미지로 보관
docker commit <컨테이너 ID/식별이름> [새로운 태그]
실행 중에 변경된 사항이 저장된다
저장된 결과는 태그를 주어 새로운 이름으로 부여할 수 있다.
¡ 공통된 환경을 가지는 애플리케이션들을 위해 구성
¡ 다른 애플리케이션과 공유하거나
애플리케이션을 쉽게 배치하는데 활용
¡ 예)
¡ 루비, 파이썬, 자바와 같은 런타임 환경
¡ 웹 애플리케이션 전개를 위한 런타임 환경
¡ Nginx + Apache Tomcat 등
¡ 볼륨
¡ Docker 의 추가 가능한 디스크 개념
¡ 파일시스템(혹은 일부)를 볼륨으로 컨테이너에 추가 가능
¡ 호스트 수준에서 볼륨은…
¡ 여러 컨테이너에서 공유 가능
¡ 컨테이너와 볼륨은 서로 별도의 라이프사이클을 가진다.
¡ 개발용 환경과 프로덕션용 환경이 다를 때.
¡ 개발용 환경 : 소스 컴파일 등 개발을 위한 환경
¡ 프로덕션용 환경 : 소프트웨어 결과물이 동작하기 위한 런타임 환경
¡ 컨테이너를 이용해 두 환경을 분리하여 개발/운영 가능
¡ 테스트를 위한 환경 (TDD)
¡ 유닛 테스트
¡ 커버리지 테스트
¡ 통합 테스트
¡ 애플리케이션 빌드가 복잡할 때…
¡ 애플리케이션 빌드 환경 의존성을 구성한 환경
¡ 빌드 컨테이너의 결과물
è 볼륨에 사용
è 컨테이너 종료시에도 사용 가능하게!
¡ 보통 지속적인 통합(CI, Continuous Integration)을 위해 구성
¡ 소프트웨어 설치 및 전개를 위한 컨테이너
¡ 설치가 복잡할 때,
¡ 설치를 자동화하기 위한 환경 구성
¡ 서비스를 위한 컨테이너
¡ 서비스를 위한 소프트웨어를 넣어둔 컨테이너
¡ 하나의 컨테이너에 모두 넣을 수도 있고
¡ 여러 컨테이너가 협력하도록 할 수도 있다.
¡ 이런 경우 DOCKER-COMPOSE 를 많이 사용한다.
¡ 서비스/시스템 운영을 위한 컨테이너
¡ 네트워크 프록시 / 캐쉬
¡ 로드밸런서
¡ FROM 구문
¡ 기반 이미지를 지정한다.
FROM 이미지이름
FROM ubuntu:20.04
이미지의 제작자를 기록해 둔다. (옵션)
MAINTAINER 이름 이메일
MAINTAINER Daeyoung Heo dyheo@kookmin.ac.kr
이 이미지의 환경 변수를 설정한다.
¡ 컨테이너 전개시에 바로 적용된다.
¡ 환경 변수는 향 후 수업에서 상세히 다룬다.ENV 환경변수이름 값
ENV 환경변수이름1=값1 환경변수이름2="공백이 있는 값2"
예제
ENV 환경변수이름 값
ENV 환경변수이름1=값1 환경변수이름2="공백이 있는 값2"
ENV DEBIAN_FRONTEND noninteractive
ENV APP_VERSION=x.y.z APP_NAME="foo bar"
¡ 실행 결과는 새로운 레이어로 구성
¡ 컨테이너 환경을 구성하기 위한 명령 실행
¡ 실행은 이전 레이어에서 실행한다.
¡ 구문의 순서가 중요하다
기본 구문(쉘 형식)
명령은 기본 쉘(/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 등의 구문 실행으로
컨테이너 파일시스템의 변경될 때,
새로운 레이어에 변경사항 기록
호스트의 파일시스템 혹은 원격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)인 경우, 이를 풀어서 디렉토리 형태로 처리한다.
¡ 원본이 여러 개 일 때는 목적지는 디렉터리여야 하며, 끝에 /를 붙여야 한다.
¡ 목적지가 없다면, 새로 생성된다. (부모 경로도 모두 생성된다.)
¡ ADD 처럼, (호스트의) 원본을 컨테이너의 지정한 위치로 복사한다.
¡ ADD와 차이점
¡ 압축 파일(ZIP, TAR)도 그대로 복사한다.
¡ * 원본이 다른 스테이지로부터 복사할 수도 있다.
¡ 스테이지 개념은 나중에 다시 설명.
유익한 글 잘 봤습니다, 감사합니다.