[Docker] Docker 심화 (1)

SJ.CHO·2024년 11월 14일
0
post-thumbnail

Docker 관련 설정 및 정보

참고링크

컨테이너의 상태 및 생애주기

  • 컨테이너 상태
  • 생애주기(LifeCycle)

docker CLI 명령어

컨테이너 생성

$ docker create -it --name [컨테이너_이름] [이미지_이름]:[태그]
  • 해당 이미지에 대한 컨테이너를 생성 하고 실행하지는 않는다.
$ docker run -it --name [컨테이너_이름] [이미지_이름]:[태그]
  • 해당 이미지에 대한 컨테이너를 생성 하고 실행 한다.

run 시 자주 사용하는 명령어

  • -p: 호스트와 컨테이너의 포트를 연결(포워딩)
  • -v: 호스트와 컨테이너의 디렉토리를 연결(마운트)
  • -e: 컨테이너 내에서 사용할 환경변수 설정
  • -name: 컨테이너 이름 설정
  • -rm: 프로세스 종료 시 컨테이너 자동 삭제
  • -ti: -i 와 -t 를 동시에 사용한 것으로 터미널 입력을 위한 옵션

컨테이너 정보

$ docker inspect [컨테이너_이름]

컨테이너 종료 코드

  • Docker 종료 코드(Exit Code)는 Docker 컨테이너가 종료될 때의 상태를 나타내며, 각 코드에 따른 의미는 다음과 같다.

  • 0: Docker 프로세스가 모든 명령을 정상적으로 수행하고 종료됨을 의미한다.

  • 255: Docker 이미지에 정의된 ENTRYPOINT 또는 CMD가 완료될 경우 발생한다.

  • 125: docker run 명령이 실패하여 컨테이너가 시작되지 않았음을 나타낸다.

  • 126: 컨테이너 내부에서 명령을 실행하지 못할 경우 발생한다.

  • 127: 컨테이너 내부에서 명령을 찾지 못할 때 발생한다.

  • 137: kill -9 명령으로 인해 컨테이너가 강제로 종료됨을 나타낸다.

  • 141: 잘못된 메모리 참조로 인해 종료됨을 의미한다.

  • 143: Linux Signal(SIGTERM)로 정상 종료될 경우 발생한다.

  • 147: 터미널에서 정지 시그널을 수신하여 종료될 경우 발생한다.

  • 149: 자식 프로세스가 종료되어 컨테이너가 종료됨을 나타낸다.

docker 정리

$ docker container prune
  • 실행중 컨테이너를 제외한 모든 컨테이너 삭제한다.
$ docker image prune
  • 실행중 컨테이너 및 태그가 붙은 이미지를 제외한 모든 이미지 삭제한다.
$ docker system prune
  • 사용하지 않는 도커 이미지, 컨테이너, 볼륨, 네트워크 등 모든 도커 리소스를 일괄적으로 삭제한다.

Docker file

  • Docker image 를 만들기 위해서 사용하는 스크립트 파일이다.

  • Docker file 을 통해 image를 만들게되면 앱환경(라이브러리 및 종속성) 및 앱을 만드는 과정(빌드 및 배포)을 자동화가 가능하며 어느 환경에서든 동일한 결과물을 얻을 수 있다.

  • docker file 예제

# Dockerfile
FROM ubuntu:latest
MAINTAINER Your Name <your-email@example.com>
RUN apt-get update && apt-get install -y nginx
COPY index.html /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
  • Ubuntu 최신 버전을 기반으로 Nginx를 설치하고, index.html 파일을 Nginx의 HTML 디렉토리에 복사하는 예시 이다.
  • FROM: 베이스 이미지를 선택
  • MAINTAINER: 이미지를 만든 사람의 정보를 입력
  • LABEL: 이미지에 메타데이터를 추가
  • RUN: 이미지에 명령을 실행하여 파일을 추가하거나 삭제
  • COPY: 파일을 이미지에 복사
  • EXPOSE: 컨테이너가 노출할 포트를 설정
  • CMD: 컨테이너가 실행될 때 실행할 명령을 설정
  • ENTRYPOINT: 컨테이너 시작할 때, 실행할 명령어를 입력, 추가명령어 존재여부 상관없이 무조건 실행
  • ENV: 환경 변수를 설정
  • WORKDIR: 작업 디렉터리를 지정
  • USER: 사용자를 설정, 기본사용자는 root

docker file 생성

$ docker buildx build -t my-nginx:latest .
$ docker build -t my-nginx:latest . # 위 명령이 실행되지 않는 경우 실행
  • 현재 디렉토리에서 Dockerfile을 기반으로 my-nginx:latest라는 이름의 Docker 이미지를 생성 한다.
  • 생성된 Docker 이미지는 Docker 레지스트리를 사용하여 다른 사용자와 공유할 수 있어요. Docker 레지스트리를 사용하면 Docker 이미지를 저장하고 공유할 수 있고, 다른 사용자가 이미지를 다운로드하여 사용할 수 있다.

Docker Compose

  • 실행 환경차이에 대한 라이브러리, 종속성 문제 해결 및 배포환경 동일화가 가능하다.
  • 설정파일이 존재한다면, 알아서 컨테이너를 만들고 자동적으로 배포가 진행된다.
  • 컨테이너들의 대한 실행상태 및 로그를 모아줌으로 모니터링과 로깅이 용이하다.
  • 여러 컨테이너를 그룹화해서 관리가 가능하다 즉 MAS 환경에 유리하다.
  • 컨테이너들을 네트와크와 분리하여 외부의 접근제한을 통한 보안성이 강하다.

YAML File

  • YAML Ain't Markup Language 의 줄임말로 컴퓨터가 읽을수 있는 설정파일이며 사람이 읽기에도 쉬운 텍스트 형식 파일이다.

  • 설정이나 데이터를 쉽게 알아볼 수 있는 형식으로 나열하며, 목록이나 키-값 쌍 같은 것들을 관리한다.

  • 설정을 정리 하고 관리 하기에 적합한 형태로 여러 컨테이너의 설정을 한 곳에서 쉽게 정리가 가능하다.

  • 문법 정리

    • 키-값 쌍: 키와 값으로 이루어진 쌍으로 구성됩니다. 키와 값은 콜론(:)으로 구분된다.
    • 리스트: 쉼표(,)로 구분된 값들의 리스트로 구성된다.
    • 딕셔너리: 중괄호({})로 둘러싸인 키-값 쌍의 리스트로 구성된다.
    • 불린 값: true, false, yes, no 등의 값으로 표현된다.
    • 문자열: 큰 따옴표("")나 작은 따옴표('')로 둘러싸인 문자열로 표현된다.
  • 들여쓰기 가 잘못된경우 의도와 다르게 구성될수있으니 주의해야한다.

예제파일

services:
  web:
    build:
      context: .    # Dockerfile 의 위치
      dockerfile: Dockerfile    # Dockerfile 파일명
    container_name: testapp_web_1    # 생략하는 경우 
    # 자동으로 부여 docker run 의 --name 옵션과 동일
    ports: "8080:8080"  # docker run 의 -p 옵션과 동일
    expose: "8080"    # 호스트머신과 연결이 아니라 
    # 링크로 연결된 서비스 간 통신이 필요할 때 사용
    networks: testnetwork    # networks 를 최상위에 정의한다면 해당 이름을 사용
    # docker run의 --net 옵션과 동일
    volumes: .:/var/lib/nginx/html    # docker run 의 -v 옵션과 동일
    environment:
      - APPENV=TEST    # docker run 의 -e옵션과 동일
    command: npm start   # docker run 의 가장 마지막
    restart: always    # docker run 의 --restart 옵션과 동일
    depends_on: db    # 이 옵션에 지정된 서비스가 시작된 이후에 `web`서비스가 실행
    links: db # Docker가 네트워크를 통해 컨테이너를 연결하도록 정의합니다. 
    # 컨테이너를 연결할 때 Docker는 환경 변수를 만들고 
    # 컨테이너를 알려진 호스트 목록에 추가하여 서로를 검색할 수 있도록 합니다.
    deploy:    # 서비스의 복제본 개수 등 지정
      replicas: 3
      mode: replicated

  • docker-compose run
$ docker-compose exec web echo "hello world" # 이미 실행된 web 컨테이너에서 echo "hello world"를 실행
$ docker-compose run web echo "hello world" # web 컨테이너에서 echo "hello world"를 실행하고 컨테이너 종료
  • 특정 명령어를 일회성으로 실행하지만 컨테이너를 batch성 작업으로 사용하는 경우에 해당한다.

Docker 모니터링&로깅

도커 모니터링 이란?

  • 도커에서 컨테이너가 어떻게 돌아가고있는지 확인하는 작업.
  • 컨테이너의 성능, 사용중인 자원, 네트워크 사용량등을 확인 가능하다.
  • 모니터링을 통하여 컨테이너 작업상태 및 문제점을 파악하기가 쉽다.
  • 기본 명령어는 docker stats 가 있고 외부모니터링 도구를 통해 더 자세한정보 혹은 데이터를 한눈에 파악이 가능하다.

htop

  • 리눅스 시스템을 모니터링하는데 사용되는 도구.
  • 주요기능
    • 실시간 모니터링 : CPU, 메모리, 스왑 사용량을 실시간으로 관리할 수 있다.
    • 프로세스 관리 : 실행중인 프로세스를 쉽게 확인 가능하고, 필뇨시 종료도 가능하다.
    • 사용자 친화 인터페이스 : 그래픽 및 간단한 조작을 통해 정보를 쉽게 파악가능하다.
  • df

    • disk free 의 약자로, 리눅스 시스템 전체의 디스크 사용량 확인 가능하다.
  • du

    • 디렉토리 별로 사용 공간을 나타낸다.

Container 로깅

  • Docker는 모든 컨테이너 로그의 표준 출력(stdout) 또는 표준 에러(stderr)를 캡처하여 json-file 로깅 드라이버를 사용하여 json 형식으로 파일에 기록한다.
  • Ubuntu 에서는 /var/lib/docker/containers/[컨테이너ID]/[컨테이너ID]-json.log 에 로그가 기록된다
$ docker run --name logs-test --rm -d ubuntu:22.04 /bin/bash -c 'while true; do date; sleep 1; done'
  • 1초 간격으로 log를 찍어내는 프로그램을 동작시켰다.
# logs-test 컨테이너의 로그를 전체 출력하기
docker logs logs-test

# logs-test 컨테이너의 로그를 tailing하기
docker logs -f logs-test

# 마지막 10줄부터 로그를 계속 보기
docker logs -f --tail 10 logs-test

  • 정상적으로 log들이 출력되는것을 확인이 가능하다.

로그 로테이션 설정

  • APP을 운영하다보면 로그파일의 크기가 계속 커질수 있기 때문에 별도로 로그파일의 최대 크기 와 최대파일 개수를 지정해줄 필요가 있다.
$ docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=10 \
--name nginxtest \
--restart always \
-p 80:80 \
-p 443:443 \
nginx:latest
  • 로그사이즈를 최대 1MB, 5개의 파일까지 작성가능하도록 설정하였다.

  • docker compose 파일에서 설정

services:
  app:
    ...
    logging:
      driver: 'json-file'
      options:
        max-size: '10m'
        max-file: '10'
  • docker compose 파일에서도 로그파일에 대한 설정이 가능하다.
profile
70살까지 개발하고싶은 개발자

0개의 댓글