1. 컨테이너 패키징
- 이미지 생성
2. 패키징된 이미지 실행
- 컨테이너 전개
3. 컨테이너 종료
4. 종료된 컨테이너 보관
docker build
docker build -t 사용자이름/이미지이름:버전태그
ex)
docker build -t w10sim/ppp:1.0
- 도커파일(Dockerfile)을 통해, 컨테이너의 환경 구성 가능
Docker build 로 컨테이너 만들 경우
- 실행 경로에 Dockerfile이 있어야 함
Dockerfile이 다른 경로에 위치하면
docker build -f /경로/도커파일
- 도커 파일의 이름 및 위치 치정 가능
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/식별 이름> [새로운 태그]
- 실행 중에 변경된 사항이 저장됨
- 저장된 결과는 태그를 주어 새로운 이름 부여 가능
공통된 환경을 가지는 애플리케이션들을 위해 구성
- 다른 애플리케이션과 공유하거나 애플리케이션을 쉽게 배치하는데 활용
ex)
- 루피, 파이썬, 자바와 같은 런타임 환경
- 웹 애플리케이션 전개를 위한 런타임 환경
-> NGINX + Apache Tomcat 환경
볼륨
- Docker의 추가 가능한 디스크 개념
- 파일 시스템(혹은 일부)를 볼륨으로 컨테이너에 추가 가능
호스트 수준의 볼륨?
- 여러 컨테이너에서 공유 가능
- 컨테이너와 볼륨은 서로 별도의 라이프사이클을 가짐
개발용 환경과 프로덕션용 환경이 다를 때
- 개발용 환경: 소스 컴파일 등 개발을 위한 환경
- 프로덕션용 환경: 소프트웨어 결과물이 동작하기 위한 런타임 환경
컨테이너를 이용해 두 환경을 분리하여 개발/운영 가능
테스트를 위한 환경(TDD)
- 유닛 테스트
- 커버리지 테스트
- 통합 테스트
애플리케이션 빌드가 복잡할 때
- 애플리케이션 빌드 환경 의존성을 구성한 환경
- 빌드 컨테이너의 결과물을 컨테이너 종료시에도 사용 가능하도록 별도 볼륨을 사용
CI(지속적인 통합)를 위해 구성함
소프트웨어 설치 및 전개를 위한 컨테이너
- 설치과정이 복잡할 때 설치를 자동화하기 위한 환경 구성
서비스를 위한 컨테이너
- 서비스를 위한 소프트웨어를 넣어둔 컨테이너
-> 하나의 컨테이너에 모두 탑재하거나,
-> 여러 컨테이너가 협력하도록 할 수 있음(Docker compose를 활용)
서비스/시스템 운영을 위한 컨테이너
- 네트워크 프록시/캐시
- 로드밸런서
장점
- 빠른 부팅 시간
- 적은 메모리 용량
- 향상된 보안
- 세밀한 최적화
- 마이크로서비스 아키텍처와 잘 어울림
단점
- 수정 불가->소스코드를 통해서만 변경 가능
- 소스코드 변경 후 다시 빌드
기반 이미지를 저장
# FROM [이미지 이름] # FROM [이미지 이름:태그(버전)] # FROM [이미지 이름@다이제스트] FROM ubuntu:20.04
- 이미지 이름만 사용하면 latest 태그를 자동으로 적용
이미지의 제작자를 기록(옵션)
# MAINTAINER [이름] [<이메일>] MAINTAINER w10sim <w10sim@naver.com>
이미지의 환경 변수를 설정
- 컨테이너 전개시에 바로 적용
# ENV [환경변수1 이름] [값1] [환경변수2 이름] [값2] ... ENV APP_VERSION=x.y.z APP_NAME="foo bar"
실행 결과는 새로운 레이어로 구성
- 레이어는 파일시스템 및 환경 정보
- 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!"]
호스트의 파일시스템 혹은 원격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
- 호스트 파일이 원본인 경우 빌드 컨텍스트에서 상대 경로임
- 호스트 파일 원본이 압축인 경우, 압축을 해제해 디렉토리 형태로 처리됨
- 원본이 여러개일때 목적지는 디렉토리여야 하며, 끝에 '/'를 붙여주어야 함
- 목적지가 없다면 새로 생성됨(부모 경로 포함)
ADD 처럼, 원본을 컨테이너의 지정한 위치로 복사
ADD와 차이점
- 압축파일도 그대로 복사
- 원본이 다른 스테이지로부터 복사 가능
공감하며 읽었습니다. 좋은 글 감사드립니다.