도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문

ssu_hyun·2021년 10월 16일
0

Book

목록 보기
1/22
post-thumbnail

도커 컨테이너 배포

01. 컨테이너로 애플리케이션 실행하기


개념역할
도커 이미지- 도커 컨테이너를 구성하는 파일 시스템 + 실행할 애플리케이션 설정
- 컨테이너를 생성하는 템플릿 역할
도커 컨테이너- 도커 이미지를 기반으로 생성
- 파일 시스템과 애플리케이션이 구체화돼 실행되는 상태

명령어 모음

Docker 명령어 정리

  • docker image pull : 도커 이미지 받아오기
  • docker container run -d example/echo:latest : 백그라운드로 컨테이너 실행
  • docker container stop $(docker container ls --filter "ancestor=example/echo" -q)
    • docker container ls --filter 옵션으로 실행 중인 컨테이너 중 조건을 만족하는 것만을 출력
    • -q : 컨테이너 ID만 출력하게 하는 옵션
  • -p [호스트 포트]:[컨테이너 포트] : 포트 포워딩 지정(호스트 포트 생략가능)

    포트 포워딩
    호스트 머신의 포트를 컨테이너 포트와 연결해 컨테이너 밖에서 온 통신을 컨테이너 포트로 전달하는 역할을 담당하는 것. 이 기능 덕분에 컨테이너 포트를 컨테이너 외부에서도 이용할 수 있다.



02. 도커 "이미지" 다루기

도커 이미지

  • 도커 컨테이너를 만들기 위한 템플릿
  • 우분투 같은 운영 체제로 구성된 파일 시스템, 컨테이너 위에서 실행하기 위한 애플리케이션/의존 라이브러리, 도구에 어떤 프로세스를 실행할지 등의 실행 환경의 설정 정보까지 포함하는 아카이브
  • 도커 이미지를 빌드한다 = 컨테이너의 템플릿 역할을 하는 이미지를 만드는 과정

docker image build-이미지 빌드

  • docker image build -t 이미지명[:태그명] Dockerfile의_경로
    : 이미지명과 태그명 붙임(필수)
    (현재 작업 디렉터리에 있다면 -> docker image build -t example/echo:latest .)

  • docker image build -f Dockerfile-test -t example/echo:latest .
    : 특정 이름으로 된 Dockerfile을 사용할 경우
    (기본적으로는 Dockerfile이라는 이름의 Dockerfile을 찾음)

  • docker image build --pull=true -t example/echo:latest .
    : 매번 베이스 이미지를 강제로 새로 받아옴 (이미지 빌드시, 확실하게 최신 베이스 이미지를 사용하고 싶을 경우 사용)

    • 레지스트리에서 받아온 도커 이미지는 일부러 삭제하지 않는 한 호스트 운영 체제에 저장되므로 이미지를 빌드할 때 매번 베이스 이미지를 받아오지는 않음)
    • 로컬에 베이스 이미지 캐시가 있으면 도커는 (Dockerfile에) 변경된 부분만을 반영해 빌드 시도

docker search-이미지 검색

도커 허브에 등록된 repository 검색 : docker search [options] 검색_키워드

  • docker search --limit 5 mysql : 최대 검색 건수 제한

  • 공식 repository 이름의 네임스페이스 생략 가능, 일률적으로 library로 칭함


docker image pull-이미지 내려받기

  • docker image pull [options] 레포지토리명[:태그명]

docker image ls-보유한 도커 이미지 목록 보기

현재 호스트 운영 체제(도커 데몬이 동작하는 호스트 환경)에 저장된 도커 이미지의 목록 보여줌

  • docker image ls [options] [레포지토리[:태그]]
    *IMAGE ID=이미지 관리 및 식별, CONTAINER ID=컨테이너 관리 및 식별

docker image tag-이미지에 태그 붙이기

도커 이미지의 특정 버전에 태그를 붙일 때 사용

  • IMAGE ID : 도커 이미지의 버전 넘버 역할
    (도커 이미지는 빌드할 때마다 그 내용의 해시값을 IMAGE ID로 삼기 때문에 내용이 바뀌면 IMAGE ID도 새 값이 부여된다. )

  • latest태그 : 항상 최신 이미지를 가리키는 태그 (git의 master브랜치와 같은 의미)

  • docker image tag 기반이미지명[:태그] 새이미지명[:태그]


docker image push-이미지를 외부에 공개하기

docker image push [options] 레포지토리명[:태그]
현재 저장된 도커 이미지를 도커 허브 등의 레지스트리에 등록하기 위해 사용

  • 도커 허브는 자신 혹은 소속 기관이 소유한 레포지토리에만 이미지를 등록할 수 있음
    (ex. docker image tag example/echo:latest stormcattest/echo:latest)

  • docker image push stormcattest/echo:latest

    • 등록 완료될 경우 sha256 해시값 출력
    • 공개 레포지토리에 등록할 이미지/Dockerfile에는 패스워드나 API 키 값 같은 민감한 정보가 포함되지 않도록 주의



03. 도커 "컨테이너" 다루기

도커 컨테이너의 생애주기

  • 실행 중
    : run명령으로 Dockerfile에 포함된 CMD 및 ENTRYPOINT 인스트럭션에 정의된 애플리케이션이 실행될 때. HTTP 요청을 받는 서버 애플리케이션이면 오류로 인해 종료되지 않는 한 실행 중 상태가 지속되므로 실행 기간이 길지만, 이에 비해 명령이 바로 실행되고 끝나는 명령행 도구 등의 컨테이너는 실행 중 상태가 길게 유지되지 않는다.
  • 정지
    : 실행 중 상태에 있는 컨테이너를 사용자가 명시적으로 정지 OR 컨테이너에서 실행된 애플리케이션이 정상/오류 여부를 막론하고 종료된 경우(다시 실행 가능)
  • 파기
    : 완전히 삭제

docker container run - 컨테이너 생성 및 실행

docker container run [options] 이미지명[:태그] [명령] [명령인자...]
docker container [options] 이미지ID [명령] [명령인자...]

  • -it : CMD 인스트럭션 오버라이드 가능
  • docker container run --name [컨테이너명] [이미지명]:[태그]
    : 컨테이너에 이름 붙이기
  • -i : 컨테이너를 실행할 때 컨테이너 쪽 표준 입력과의 연결을 그대로 유지해 컨테이너 쪽 셸에 들어가 명령을 실행할 수 있다.
  • -t : 유사 터미널 기능 활성화
  • --rm : 컨테이너를 종료할 때 컨테이너를 파기하도록 하는 옵션
  • -v : 호스트와 컨테이너 간에 디렉터리나 파일을 공유하기 위해 사용하는 옵션

docker container ls - 도커 컨테이너 목록 보기

docker container ls [options]

항목내용
CONTAINER ID컨테이너를 식별하기 위한 유일 식별자
IMAGE컨테이너를 만드는 데 사용된 도커 이미지
COMMAND컨테이너에서 실행되는 애플리케이션 프로세스
CREATED컨테이너 생성 후 경과된 시간
STATUSUp(실행중), Exited(종료) 등 컨테이너의 실행 상태
PORTS호스트 포트와 컨테이너 포트의 연결 관계(포트 포워딩)
NAMES컨테이너의 이름
  • docker contaainer ls -q
    : 컨테이너 ID(축약형)만 추출

  • docker container ls --filter "필터명=값
    : 특정 조건을 만족하는 컨테이너의 목록 필터링

    • docker container ls --filter "name=echo1" : 이름 = 컨테이너명
    • docker container ls --filter "ancestor=example/echo" : 생성 이미지 기준
  • docker container ls -a : 종료된 컨테이너 포함한 컨테이너 목록


docker container stop - 컨테이너 정지하기

docker container stop 컨테이너ID_또는_컨테이너명


docker container restart - 컨테이너 재시작하기

docker container restart 컨테이너ID_또는_컨테이너명


docker container rm - 컨테이너 파기하기

  • docker container rm 컨테이너ID_또는_컨테이너명
  • docker connntainer rm -f ~ : 현재 실행 중인 컨테이너 삭제

docker container logs - 표준 출력 연결하기

docker container logs [options] 컨테이너ID_또는_컨테이너명


docker container exec - 실행 중인 컨테이너에서 명령 실행하기

dockdr container exec [options] 컨테이너ID_또는_컨테이너명 컨테이너에서_실행할_명령
: 컨테이너 내부의 상태를 확인하거나 디버깅하는 용도로 사용


docker container cp - 파일 복사하기

  • docker container cp [options] 컨테이너ID_또는_컨테이너명:원본파일 대상파일
  • docker container cp [options] 호스트_원본파일 컨테이너ID_또는_컨테이너명:대상파일

컨테이너와 호스트 간에 파일을 복사하기 위한 명령



04. 운영과 관리를 위한 명령

prune - 컨테이너 및 이미지 파기

  • docker container prune [options]
    : 정지된 모든 컨테이너 삭제

  • docker image prune [options]
    : 태그가 붙지 않은(dangling) 모든 이미지 삭제

  • docker system prune
    : 사용하지 않는 도커 이미지 및 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제하고 싶을 때



docker container stats - 사용 현황 확인하기

docker container [options][대상_컨테이너ID...]
: 시스템 리소스 사용 현황을 컨테이너 단위로 확인



05. 도커 컴포즈로 여러 컨테이너 실행하기

docker-compose 명령으로 컨테이너 실행하기

yaml 포맷으로 기술된 설정 파일로, 여러 컨테이너의 실행을 한 번에 관리할 수 있게 해준다.

  • docker-compose up -d
    : yml 파일의 정의에 따라 여러 컨테이너 한꺼번에 시작

  • docker-compose down
    : yml 파일에 정의된 모든 컨테이너가 정지 혹은 삭제됨

  • docker-compose up -d --build
    : 이미 이미지를 빌드한 적이 있는 컴포즈의 경우 빌드를 생략하고 컨테이너가 실행되지만, --build옵션을 사용할 경우 도커 이미지를 강제로 다시 빌드 (이미지가 자주 수정되는 경우 사용하는 것이 좋다)



06. 컴포즈로 여러 컨테이너 실행하기(feat. 젠킨스)

  • 마스터 컨테이너 생성 : docker-compose up
    (브라우저 확인 : http://localhost:[포트 포워딩한 호스트 포트번호])
  • 마스터의 SSH 공개키 생성
  • docker-compose.yml 파일 : 슬레이브 컨테이너 추가
  • 환경 변수 JENKINS_SLAVE_SSH_PUBKEY : 마스터의 SSH 공개키
  • links 요소 : 마스터 컨테이너가 슬레이브 컨테이너로 통신할 수 있게 설정
version: "3"
services:
  master:
    container_name: master
    image: jenkinsci/jenkins:2.142-slim
    ports:
      - 8080:8080
    volumes:
      - ./jenkins_home:/var/jenkins_home    # 호스트와 컨테이너 사이에 파일을 "공유"할 수 있는 메커니즘(복사X)
    links:   # SSH 접속 대상 설정
      - slave01

slave01:
  container_name: slave01
  image: jenkinsci/ssh-slave
  environment:  # SSH 접속 허용 설정
    -JENKINS_SLAVE_SSH_PUBKEY=ssh-rsa AAAAB3NzaC1...  # 마스터 SSH 공개키 
    # 호스트 파일 시스템의 ./jenkins_home/.ssh/id_rsa.pub 내용 복붙

0개의 댓글