본문 바로가기

IT 기본

도커 정리

가상머신과 도커 컨테이너 차이

  • 가상머신: 성능 손실이 발생. 이미지 크기 큼(커널, 라이브러리 등 전부 포함)
  • 도커 컨테이너: 성능 손실이 거의 없음. 가상머신대비 이미지 크기가 작음(커널 등을 호스트와 공유해 사용)

 

도커의 장점

  • 컨테이너는 호스트 OS와 격리된 공간이기 때문에 여러 소프트웨어를 설치해도 호스트 OS에는 영향이 없어서 독립된 개발 환경 보장이 가능
  • 커널 등을 포함하지 않아 이미지 크기가 커서 어플리케이션 배포에 용이

 

윈도우 도커 설치 2가지 방법

  1. Docker Desktop for Windows 설치
  2. 윈도우에서 WSL에 설치 방법: https://kimyk85.tistory.com/entry/WSL2%EC%97%90%EC%84%9C-docker-%EC%84%A4%EC%B9%98

 

기본적인 도커 생성과 실행 예시 2가지

  1. docker run -i -t ubuntu:14.04
    • run 명령어는 컨테이너를 생성하고 실행
    • -i -t 옵션은 셸을 실행하여 컨테이너의 입출력을 가능하게 함
    • docker pull + docker create + docker start + docker attach(-i -t 옵션 쓴 경우)
  2. 별도 실행
    • docker create -i -t –name mycentos centos:7
      • run 명령어와 다르게 컨테이너 내부로 들어가지 않음
    • docker start mycentos : 컨테이너 시작
    • docker attach mycentos : 컨테이너 내부로 들어가기

 

컨테이너 접속

  • docker exec -it  컨테이너이름또는ID /bin/bash

 

컨테이너 빠져나오기

  • exit, Ctrl+D : 컨테이너를 빠져나오면서 정지시킴
  • Ctrl+P, Q: 컨테이너 셸에서만 빠져나옴. 컨테이너 정지 시키지 않음

 

docker 명령어

  • docker run
    • 컨테이너 실행
    • 옵션
      • -d: detached 모드로 컨테이너 실행. 입출력이 없는 상태로 컨테이너를 실행함. 포그라운드 프로그램이 기본적으로 실행되지 않으면 컨테이너는 종료.
        • mysql 같은 컨테이너를 시작할 때 사용. mysql 이미지는 컨테이너 시작시에 mysqld를 동작시키기 때문에 -i -t 옵션을 주면 mysqld 로그가 출력
      • -e: 컨테이너 내부의 환경변수 설정
      • –link: 다른 컨테이너 접근시 alias 지정
        • 컨테이너는 시작시 IP가 순차적으로 할당되어 변경되기 때문에 link 옵션을 사용하면 편하게 접근 가능
        • –link testserver:myct : myct라는 이름으로 testserver 컨테이너 접근 가능
      • -p: 호스트의 IP와 포트에 바인딩. "-p 호스트의 포트:컨테이너의 포트" 형태로 작성
        • 만약 "-p 포트"만 작성하면 호스트의 연결가능한 랜덤 포트랑 컨테이너 포트를 연결
      • -P: 이미지에 설정된 EXPOSE의 모든 포트를 호스트와 연결
      • -v: 볼륨 지정. 컨테이너 삭제시 컨테이너 내부 파일을 보존하기 위해 호스트에 저장하기 위한 방법
        • -v 호스트의 공유디렉토리:컨테이너의 공유디렉터리 로 지정
          • 예시) docker run -i -t –name myct -v /home/mydir:/home/testdir_2 aaa/volume_test
      • –volumes-from: 생성된 볼륨을 컨테이너에 마운트. 볼륨을 여러 컨테이너에서 사용하기 위해 활용
        • 예시) docker run -i -t –name myct –volumes-from volumetest ubuntu:14.04
      • --log-driver: 지정하지 않으면 컨테이너 내부에 json으로 저장. fluentd 등을 명시하여 컨테이너 로그를 처리할 수 있음. fluentd로 지정하면 동일한 호스트에 fluentd 데몬이 실행되고 있어야 함
  • docker ps
    • 실행중인 컨테이너 목록 
    • 옵션
      • -a: 정지된 컨테이너를 포함한 모든 목록
  • docker rm
    • 중지된 컨테이너 삭제
    • 옵션
      • -f: 실행중인 컨테이너 포함 삭제
  • docker volume create –name 볼륨명
    • 도커엔진에서 관리하는 볼륨을 생성
    • 옵션
      • --name 볼륨명: 볼륨명 지정
  • docker volume prune
    • 미사용 볼륨 삭제
  • docker network ls
    • 네트워크 목록 확인
  • docker network inspect 네트워크이름
    • 네트워크 상세 확인
    • 네트워크 종류
      • eth0: 호스트의 네트워크 인터페이스
      • veth: 컨테이너를 시작할 때 생성된 인터페이스
      • docker0: 브릿지로 veth와 eth0 인터페이스를 연결. 컨테이너에 아무런 설정하지 않으면 기본으로 사용
  • docker network disconnect/connect 네트워크이름 컨테이너 이름
    • 컨테이너에 네트워크 연결/해제
  • docker network create –driver 종류 [--옵션] 네트워크 이름
    • 네트워크 생성
    • 예시) docker network create –driver=bridge –subnet=172.10.0.0/16 –ip-range=172.10.0.0/24 –gateway=172.10.0.1 myct
  • docker logs [옵션] 컨테이너 이름
    • 컨테이너 로그 출력
    • 옵션
      • –since: 유닉스 시간을 입력해 해당 시간 이후 로그 확인
      • -t: 타임스탬프 시간을 입력해 해당 시간 이후 로그 확인
      • -f: 로그를 스트림으로 확인
  • docker commit [옵션] 컨테이너이름 이미지이름:태그
    • 컨테이너를 이미지로 생성. 컨테이너는 레이어로 구성되어 있기 때문에 처음 만든 이미지에서 변경 사항만 저장 
    • 예시) docker commit -a “aaa” -m “msg” committestcont comt:first
    • 옵션
      • -a: 작성자
      • -m: 커밋 메세지
  • docker rmi 이미지이름: 태그
    • 도커 이미지 삭제
    • 만약 이미지를 다른 곳에서 추가적으로 커밋해서 쓰고 있다면 레이어 이름만 삭제되고 실제 이미지 파일은 삭제 되지 않음
  • docker build [옵션] -t 생성될이미지이름:태그 ./
    • ./ 위치의 dockerfile을 이용해 이미지를 생성
    • 옵션
      • -t: 생성될 이미지 이름 지정
      • --file: dockerfile 명 지정
      • --no-cache: git clone 등이 포함되어 있으면 캐시 기능으로 인해 신규 코드를 받지 못하기 때문에 이런 경우 사용

 

Dockerfile

  • 이미지를 만들어주는 파일. 컨테이너에 설치해야 하는 패키지, 소스코드, 명령어 등을 기록하면 파일을 읽어서 컨테이너에서 작업을 수행한 뒤 이미지로 생성
  • 구문
    • FROM: 생성할 이미지의 베이스
    • LABEL: 이미지에 메타데이터 추가. 키:값 형태로 저장
    • RUN: 이미지를 만들기 위해 컨테이너 내부에서 명령어 실행
    • ADD: 파일을 이미지에 추가. 추가될 파일은 Dockerfile이 위치한 디렉터리에서 가져옴. 만약 root 디렉토리 등으로 지정하면 불 필요하게 빌드가 느려지거나 메모리 사용량이 증가. dockerignore 파일을 활용하면 컨텍스트에서 제외 가능
    • COPY: ADD와 유사하지만 로컬의 파일만 이미지에 추가할 수 있음
    • WORKDIR: 명령어를 실행할 디렉터리
    • EXPOSE: Dockerfile의 빌드로 생성된 이미지에서 노출할 포트 설정. 호스트의 포트와 바인딩하는 작업은 추가로 필요
    • CMD: 컨테이너가 시작될 때 실행할 명령어로 Dockerfile에서 한 번만 사용 가능
    • ENV: Dockerfile에서 사용될 환경 변수 지정
    • VOLUME: 빌드된 이미지로 컨테이너를 생성했을 때 호스트와 공유할 컨테이너 내부의 디렉터리 설정
    • HEALTHCHECK: 애플리케이션 상태 체크 설정. docker ps 등에 상태를 나타낼 수 있고, docker inspect로 로그 확인이 가능

 

도커 데몬 모니터링

  • dockerd -D: 디버그 모드로 데몬 실행
  • docker stats: 컨테이너 사용량을 스트림으로 출력
  • docker system df: 이미지, 컨테이너 등의 공간 관련 출력

 

도커 컴포즈

  • 여러개의 컨테이너를 하나의 서비스로 정의해 관리할 수 있는 서비스
  • YAML 파일로 정의. 일반적으로 docker-compose.yml 파일명 사용
  • docker-compose up -d 명령어로 컨테이너 생성
    • -d는 detached 모드로 백그라운드로 데몬 실행
  • 구문
    • version: YAML 파일 포맷 버전. 최신 버전을 사용하는 것이 좋음
    • service: 생성될 컨테이너들의 서비스
    • 서비스명: 생성될 서비스의 이름. 컨테이너의 이름은 [프로젝트이름]_[서비스 이름]_[서내스 내 컨테이너 번호]로 지정. 프로젝트 이름은 docker-compose.yml 파일이 위치한 디렉토리의 이름
    • image: 컨테이너 생성시 사용할 이미지
    • environment: docker run 명령어의 –env 옵션과 동일. 환경 변수 지정
    • command: 컨테이너가 실행될 때 수행할 명령어
    • depends_on: 특정 컨테이너 의존 관계를 나타냄. 이 항목에 명시된 컨테이너가 먼저 실행
    • build: dockerfile을 이용해 이미지 빌드해서 컨테이너 생성시 사용
  • docker-compose scale 명령어로 2,3 등의 추가 컨테이너 생성 가능
  • docker-compose down : 프로젝트 삭제. 컨테이너가 모두 정지되고 삭제
  • docker-compose config: 현재 디렉토리에 있는 docker-compose.yml 파일 검증
  • docker-compose stop: docker-compose.yml에 정의된 모든 컨테이너 중지
  • docker-compose rm:  docker-compose.yml에 정의된 모든 컨테이너 삭제
  • 참고
    • docker-compose 의 내용을 수정 후 다시 컨테이너를 실행하는 경우
      • docker-compose stop
      • docker-compose rm
      • docker-compose up -d