본문 바로가기

Docker

[Docker] Docker 기본

Docker 구성 요소

  • docker daemon을 docker engine이라고 부른다.
  • Docker Image와 Docker Container는 1 : N 관계이다.
  • Docker Image
    • Docker에서 사용하는 가장 기본적인 단위
    • 컨테이너를 생성할 때 필요한 요소로, 컨테이너의 목적에 맞는 바이너리와 의존성이 설치되어 있다.
    • 여러 개의 계층으로 된 바이너리 파일로 존재한다.
    • 저장소 이름/이미지 이름:이미지 태그로 구성된다.
    • Pull/Push 시에 저장소 이름을 생략하면 기본 저장소인 도커 허브로 인식한다.
    • 도커 이미지 태그를 생략하면 최신 리버전을 뜻하는 lastest로 인식한다.

  • Docker Container
    • Docker에서 사용하는 가장 기본적인 단위
    • 호스트와 다른 컨테이너로부터 격리된 시스템 자원과 네트워크를 사용하는 프로세스
    • 이미지는 읽기 전용으로 사용하여 변경 사항은 컨테이너 계층에 저장한다.
    • 컨테이너에서 무엇을 하든 이미지는 영향을 받지 않는다.

* Docker File -> Build -> Docker Image -> Run -> Docker Container

  • Image Repository
    • 도커 이미지를 관리하고 공유하기 위한 서버 애플리케이션
    • public -> dockerhub, QUAY...
    • private -> AWS ECR, Docker Registry...

Docker Container Life Cycle

  • Running
    • create 명령어 -> start 명령어 통한 실행
    • run 명령어를 통한 실행

  • Paused
    • pause 명령어를 통한 일시정지 상태
    • unpause 명령어를 통한 실행 상태로 변경

  • Stopped
    • stop 명령어를 통한 중지 상태
    • start 명령어를 통한 실행 상태로 변경

  • Deleted
    • Stopped 상태에서  rm 명령어를 통한 제거
    • create 명령어로 생성된 상태에서 rm 명령어를 통한 제거

  • docker create/run 명령어 모두 이미지가 없을 경우 자동으로 pull을 수행하여 이미지를 다운받는다.

Docker 명령어

  • docker run [옵션] [이미지] [컨테이너 내에서 실행할 명령어] 
    • 컨테이너 시작 명령어
    • 옵션
      1. -i: 호스트의 표준 입력을 컨테이너와 연결
      2. -t: TTY 할당
      3. --rm: 컨테이너 실행 종료 후 자동 삭제
      4. -d: 백그라운드 모드로 실행
      5. --name: 컨테이너 이름 지정
      6. -p: 호스트 - 컨테이너 간의 포트 바인딩
      7. -v: 호스트 - 컨테이너 간 볼륨 바인딩
  • docker ps [옵션]
    • 실행 중인 컨테이너 상태 확인 명령어
    • 옵션
      1. -a: 전체 컨테이너 상태 확인
  • docker inspect [container]
    • 컨테이너 상세 정보 확인
       
  • docker pause [container]
    • 컨테이너 일시중지 명령어

  • docker unpause [container]
    • 컨테이너 일시중지 해제 명령어

  • docker stop [container]
    • 컨테이너 종료 명령어 (SIGTERM 시그널 전달)
    • 안전하게 컨테이너 종료

  • docker kill [container]
    • 컨테이너 강제 종료 명령어 (SIGKILL 시그널 전달)
    • 강제 컨테이너 종료

  • docker stop $(docker ps -aq)
    • 모든 컨테이너 종료 명령어

  • docker rm [옵션] [container]
    • 컨테이너 삭제 명령어
    • 옵션
      1. -f: 컨테이너 강제 종료 후 삭제
  •  docker container prune
    • 중지된 모든 컨테이너 삭제

  • docker exec [container] [command]
    • 실행 중인 컨테이너에 명령어를 실행한다.

Entrypoint / Command

  • Entrypoint
    • 도커 컨테이너가 실행할 때 고정적으로 실행되는 스크립트 혹은 명령어
    • 생략할 수 있으며, 생략될 경우 Command에 지정된 명령어로 수행된다.

  • Command
    • 도커 컨테이너가 실행할 때 수행할 명령어
    • Entrypoint에 지정된 명령어에 대한 인자 값

  • 둘 다 지정할 경우
    • [Entrypoint] [Command] 형태로 명령어가 실행된다.
    • docker run --entrypoint echo ubuntu hello world
      1. echo: Entrypoint
      2. hello world: Command
      3. 최종 실행: echo hello world => hello world 출력

Docker 환경변수

  • docker container를 실행할 때 container 내로 필요한 변수, 파일을 주입할 수 있는 방법
  • -e: 환경 변수 넘기기
    • docker run -i -t -e MY_VAR=test ubuntu bash
    • echo $MY_VAR: test 출력

  • --env-file: 파일 넘기기
    • test.env 파일 내에 환경변수 지정(MY_VAR=test)
    • docker run -i -t - -env-file ./test.env ubuntu bash
    • echo $MY_VAR: test 출력

  • 환경 변수 설정을 통해 config 설정을 변경할 수 있도록 공식 이미지 문서에 나와 있다. 

Docker Network

  • container를 실행할 때 network를 설정하지 않으면 기본적으로 docker0을 사용한다.
    • docker0: 도커 엔진에 의해 기본 생성되는 브릿지 네트워크, veth와 eth 간의 다리 역할을 한다.

  • 컨테이너 포트 노출
    • 컨테이너의 포트를 호스트의 IP:PORT와 연결하여 서비스를 노출한다.
    • docker run -p [HOST IP:PORT] : [CONTAINER PORT] [container]
    • HOST IP를 생략하면 0.0.0.0:PORT로 연결된다.

  • Expose / Publish
    • Expose 옵션은 그저 문서화 용도이다. 실제로 바인딩되지 않는다.
    • Publish 옵션은 실제 포트를 바인딩한다.

  • Docker Network Driver
    • docker network ls 명령어를 통해 container가 사용 중인 driver를 확인할 수 있다.
    • driver 종류
      1. bridge
        docker network create --driver=bridge [network name]으로 생성해서 사용할 수 있다.
        docker run --network=[network name] --net-alias=[domain name] 명령어를 사용해서 지정할 수 있다.
        --net-alias 옵션은 내부 도메인을 생성한다.

      2. host: docker가 제공하는 network를 사용하는 것이 아닌 host network에 붙어서 사용한다. 포트 연결 없이 바로 사용이 가능한다.
      3. none: network 기능이 필요 없을 때 사용하거나 커스텀 network를 사용해야 할 때 사용한다.
      4. overlay

    • --net [driver] 명령어로 driver를 설정할 수 있다.

Docker Volume

  • 볼륨을 설정하지 않고 Container 내에서 파일 작업을 진행하면, Container 삭제 시 해당 파일은 사라진다.
  • 호스트 볼륨
    • 호스트의 디렉토리를 컨테이너의 특정 경로에 마운트 한다.
    • 호스트 디렉토리 내의 파일이 지정된 컨테이너의 디렉토리로 덮어 씌워진다.
    • docker run -v [host 경로]:[container 경로]

  • 볼륨 컨테이너
    • 특정 컨테이너의 볼륨 마운트를 공유할 수 있다.
    • 연결된 컨테이너의 마운트 정보를 사용할 수 있다.
    • docker run --volumes-from [container]

  • 도커 볼륨
    • 도커가 제공하는 볼륨 관리 기능을 활용하여 데이터를 보존한다.
    • 기본적으로 /var/lib/docker/volumes/${volume-name}/_data에 데이터가 저장된다.
    • docker volume create --name [volume name]
    • docker run -v [volume name]:/var/lib/mysql

  • 읽기 전용 볼륨 연결
    • 볼륨 연결 설정에 :ro 옵션을 통해 읽기 전용 마운트 옵션을 설정할 수 있다.
    • docker run -v [volume name]:/usr/share/nginx/html:ro

Docker Log

  • Log 출력의 표준: STDOUT / STDERR
  • 출력된 로그 쌓아서 Logging Driver를 사용하여 처리할 수 있다.
  • Logging Driver 종류
    • none
    • local
    • json-file
    • syslog
    • awslogs

  • 명령어
    • docker logs [container]: 전체 로그 확인
    • docker logs --tail 10 [container]: 마지막 로그 10줄 확인
    • docker logs -f [container]: 실시간 로그 스트림 확인
    • docker logs -f -t [container]: 로그마다 타임스탬프 표시

  • 호스트 운영체제의 로그 저장 경로
    • logging driver를 json-file로 설정했을 경우
      1. cat /var/lib/docker/containers/${CONTAINER_ID} 경로에서 ${CONTAINER_ID}-json.log 파일로 확인할 수 있다.

  • 로그 용량 제한하기
    • 로그 용량은 기본적으로 설정되어 있지 않기 때문에 반드시 설정해야 하는 옵션 중 하나이다.
    • 컨테이너 단위로 로그 용량을 제한할 수 있지만, 도커 엔진에서 기본 설정을 진행할 수 있다.
    • docker run --log-driver=[logging driver] --log-opt max-size=3m --log-opt max-file=5


Docker Demon 디버깅

  • docker system info
    • docker 시스템 정보 출력

  • docker events 
    • streaming 형식으로 docker에서 발생하는 Event를 확인할 수 있다.

  • docker system df
    • docker의 디스크 사용량을 확인할 수 있다.

  • docker system prune
    • 중지된 컨테이너, 사용 중이지 않은 네트워크 등을 제거해서 저장 공간을 확보할 수 있다.

  • docker stats
    • 각각의 컨테이너 별로 사용 중인 CPU, Memory 등의 정보를 확인할 수 있다.

'Docker' 카테고리의 다른 글

[Docker] docker-compose  (0) 2022.11.14
[Docker] Dockerfile  (0) 2022.11.11
[Docker] 도커란?  (0) 2022.09.17