190422

  • 배포 테스트 환경(여러개 띄우고 초기 상태로 빨리 돌려야하는.. 그런 환경)으로 docker container가 편하더라..

Docker Container

1. Container

  • OS 가상화가 아닌 프로세스 격리 방법
  • 리눅스 컨테이너(LXC)를 기반으로 시작

2. Image

  • 컨테이너 실행에 필요한 파일과 설정값 등을 포함
  • 이미지는 상태값을 가지지 않고 변하지 않음(Immutable)
  • 컨테이너는 이미지를 실행한 상태로 추가/변경 값은 컨테이너에 저장
  • 같은 이미지로 다수 컨테이너 생성 가능

3. 특징

  • 레이어 저장 방식

    • Union File System을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용가능하게함
    • 이미지는 여러개 read-only 레이어로 구성 - 파일 추가/수정되면 새로운 레이어 생성
    • A + B + C 레이어로 만든 이미지를 기반으로 D 레이어를 추가해서 새로운 이미지를 만들면 A + B + C + D 레이어로 구성하며, D만 수정되었다면 이전 상태에서 D 레이어만 다운받아 적용 가능
    • 컨테이너 생성 시에도 기존 이미지 레이어 위에 RW(Read-Write) 레이어 추가해서 컨테이너 실행중에 생성하는 파일과 수정 내역은 RW레이어에 저장함
  • 이미지 경로

    • 이미지는 URL 방식으로 관리하며 태그를 붙일 수 있음
    • ex) public(docer hub) - docker.io/library/ubuntu:14.04, docker.io/library/ubuntu:trusty, ubuntu:14.04 <-- tag
    • ex) private(distribution) - my.private.image:5000/hello-app:123
  • Dockerfile

    • DSL(Domain-Specific Language) 이용하여 이미지 생성 과정 기술
  • Docker Hub

    • 공개 이미지 저장소(무료) - github와 유사

4. 설치

  • 주의: 도커 실행을 위한 kernel 버전은 3.10.x 이상! 배포판으로 따지면 ubuntu는 14.04, centos는 7 이상
  • 도커 설치 명령:
      - curl -fsSL https://get.docker.com/ | sudo sh
  • 도커는 기본적으로 root 권한이 필요함
    • <도커 그룹에 속한 유저(기본: root)가 컨테이너 실행 시 도커 호스트에서 root 권한을 가짐
      • 도커 그룹에 일반 유저 추가 방법
      • sudo usermod -aG docker $USER -> 현재 접속중인 사용자를 docker 그룹에 추가
      • sudo usermod -aG docker user1 -> user1을 docker 그룹에 추가
      • 명령 실행 후 다시 로그인 해야 적용됨!

  • CURL
    • -fsSL 옵션
      • f : fail silently on server error - 서버측 에러 (반환값 or 페이지 등)를 표시하지 않음
      • s : silent mode - 진행률이나 에러 메시지 표시하지 않음
      • S : -s랑 같이 사용하면 실패 시 에러 메시지 표시함
      • L : location - 요청한 페이지의 경로가 변경되었음을 서버에서 알리면 해당 경로로 다시 요청

5. 명령어

  • docker version : 설치되어있는 도커의 버전 정보 출력

  • docker run [OPTION] IMAGE[:TAG|@DIGEST] [COMMAND] [ARG...] : 도커 이미지 실행(컨테이너 생성)

    • options
      • -d: detached mode(백그라운드 모드)
      • -p: 호스트와 컨테이너의 포트를 연결(포워딩)
      • -v: 호스트와 컨테이너의 디렉토리를 연결(마운트) -> 연결 후엔 컨테이너 제거해도 데이터 유지
      • -e: 컨테이너 내에서 사용할 환경변수 설정
      • -name: 컨테이너 이름 설정
      • -rm: 프로세스 종료시 컨테이너 자동 제거
      • -it: -i와 -t를 동시에 사용한 것으로 터미널(키보드) 입력을 위한 옵션
      • -link: 컨테이너 연결[컨테이너명:별칭]
    • examples
      • docker run ubuntu:16.04
      • docker run -rm -it ubuntu:16.04 /bin/bash
      • docker run -d -p 1234:6379 redis
  • docker ps [OPTIONS] : 실행중인 컨테이너 목록 출력

    • -a, --all: 실행중이지 않은 컨테이너도 포함
    • docker stop [OPTIONS] CONTAINER [CONTAINER...] : 실행중인 컨테이너를 하나 또는 여러개(space로 구분) 중지
      • docker ps 명령어에서 확인할 수 있는 컨테이너 ID로 식별
  • docker rm [OPTIONS] CONTAINER [CONTAINER...] : 종료된 컨테이너를 하나 또는 여러개 제거(컨테이너 ID로 식별)

    • tip: docker rm -v $(docker ps -a -q -f status=exited) - 현재 중지 상태인 컨테이너 ID를 가져와서 한번에 제거
  • docker images [OPTIONS] [REPOSITORY[:TAG]] : 도커가 다운로드한 이미지 목록 출력

  • docker pull [OPTIONS] NAME[:TAG|@DIGEST] : 이미지를 다운로드

    • 이미 다운받았던 같은 태그의 이미지는 최신버전으로 다시 다운받음
  • docker rmi [OPTIONS] IMAGE [IMAGE...]

    • docker images 명령어로 확인할 수 있는 이미지 ID로 식별
  • docker logs [OPTIONS] CONTAINER

    • options
      • -f : 대상 컨테이너에 대한 실시간 로그 출력
      • --tail [number] : 대상 컨테이너에 대한 로그 중 최근 [number]개 출력

Docker Compose

Dockerfile

  • 이미지 빌드용 DSL(Domain-Specific Language) 파일

  • 일반적으로 소스와 함께 관리

  • 기본 명령어

    • FROM : 베이스 이미지 지정

      • 형식: FROM <image>:<tag>
      • ex) FROM ubuntu:16.04
    • MAINTAINER : Dockerfile을 관리하는 사람의 이름 또는 이메일 정보

    • COPY : 파일이나 디렉토리를 이미지로 복사 -> 일반적으로는 소스를 복사하는데 사용 (target 디렉토리가 없다면 자동생성)

      • 형식: COPY ...
      • ex) COPY . /usr/src/app
    • ADD : COPY와 유사하나 src에 파일 대신 URL 입력 가능, 압축파일 입력 시 자동으로 압축 해제하면서 복사

      • 형식: ADD ...
      • ex) ADD . /usr/src/app
    • RUN : 명령어를 그대로 실행, 내부적으로 /bin/sh -c 뒤에 명령어를 실행하는 방식

      • 형식: RUN
      • 형식: RUN ["executable", "param1", "param2"]
      • ex2) RUN bundle install
    • CMD : 도커 컨테이너가 실행되었을 때 실행할 명령어 정의

      • 형식: CMD ["executable", "param1", "param2"]
      • 형식: CMD command param1 param2
      • ex) CMD bundle exec ruby app.rb
      • 주의사항: 여러 개 CMD 존재하면 가장 마지막 CMD만 실행됨, 여러 개의 프로그램 실행을 원한다면 run.sh 파일을 작성하여 데몬으로 실행하거나 supervisord나 forego와 같은 여러 개의 프로그램을 실행하는 프로그램 사용
    • WORKDIR : RUN, CMD, ADD, COPY 등이 이루어질 기본 디렉토리 설정, 각 명령어의 현재 디렉토리는 한줄 한줄마다 초기화되기 때문에 RUN cd /path를 실행하더라도 다음 명령어에서는 다시 위치가 초기화됨. 같은 디렉토리에서 계속 작업하기 위해서 WORKDIR 사용

      • 형식: WORKDIR /path/to/workdir
    • EXPOSE : 도커 컨테이너 실행 후에 요청을 기다리고 있는(Listen) 포트 지정 (여러개 포트 지정 가능)

      • 형식: EXPOSE [...]
      • ex) EXPOSE 4567
    • VOLUME : 컨테이너 외부에 파일 시스템을 마운트할 때 사용 (반드시 지정하지 않아도 마운트할 수 있지만 기본적으로 지정하는 것이 좋음)

      • 형식: VOLUME ["/data"]
    • ENV : 컨테이너에서 사용할 환경변수 지정(컨테이너 실행 시 -e옵션 사용하면 기존 값을 오버라이딩)

      • 형식1: ENV
      • 형식2: ENV = ...
      • ex) ENV DB_URL mysql
  • Docker build

    • docker build [OPTIONS] PATH | URL | -
    • ex) docker build -t app .(Dockerfile이 있는 디렉토리)