docker container

Dong In Kim·2019년 7월 28일
1

daily-notes

목록 보기
3/11

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 :
    - ex) FROM ubuntu:16.04

    	- **MAINTAINER** : Dockerfile을 관리하는 사람의 이름 또는 이메일 정보
    		- 형식: MAINTAINER <name>
    		- ex) MAINTAINER noone@noone.com
    
    	- **COPY** : 파일이나 디렉토리를 이미지로 복사 -> 일반적으로는 소스를 복사하는데 사용 (target 디렉토리가 없다면 자동생성)
    		- 형식: COPY <src> <dest>
    		- ex) COPY ./my_script.sh /home/noone/my_script.sh
    
    	- **ADD** : COPY와 유사하나 src에 파일 대신 URL 입력 가능, 압축파일 입력 시 자동으로 압축 해제하면서 복사
    		- 형식: ADD <src> <dest>
    		- ex) ADD ./my_script.sh /home/noone/my_script.sh
    
    	- **RUN** : 명령어를 그대로 실행, 내부적으로 /bin/sh -c 뒤에 명령어를 실행하는 방식
    		- 형식: RUN <command>
    		- 형식: 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 <port> <port> ...
    		- ex) EXPOSE 4567
    
    	- **VOLUME** : 컨테이너 외부에 파일 시스템을 마운트할 때 사용 (반드시 지정하지 않아도 마운트할 수 있지만 기본적으로 지정하는 것이 좋음)
    		- 형식: VOLUME ["/data"]
    
    	- **ENV** : 컨테이너에서 사용할 환경변수 지정(컨테이너 실행 시 -e옵션 사용하면 기존 값을 오버라이딩)
    		- 형식1: ENV <key\> <value\>
    		- 형식2: ENV <key\>=<value\> ...
    		- ex) ENV DB_URL mysql
  • Docker build
    - docker build [OPTIONS] PATH | URL | -
    - ex) docker build -t app .(Dockerfile이 있는 디렉토리)


profile
좋아하다

2개의 댓글

comment-user-thumbnail
2019년 7월 28일

도커 정리글 감사합니다 :)
도커에 관심있던 참이라 도움이 될 것 같습니다!!
참고링크도 감사합니다 ㅎㅎ

1개의 답글