상세 컨텐츠

본문 제목

25.03.26. Docker, Containerd, Docker Compose의 이해와 사용법

AWS CLOUD SCHOOL 9기

by AI Engineer crystal 2025. 3. 26. 11:55

본문

user1@manager:~/ansiblerole$ tree
.
├── install_web.yml
├── roles
│   └── web
│       ├── defaults
│       ├── files
│       ├── handlers
│       │   └── main.yml
│       ├── meta
│       ├── **tasks**
│       │   ├── amazon.yml
│       │   ├── config.yml
│       │   ├── **main.yml**
│       │   └── ubuntu.yml
│       ├── templates
│       │   └── index.j2
│       └── vars
│           └── main.yml
└── web.lst

9 directories, 9 files
user1@manager:~/ansiblerole$ cat roles/web/tasks/config.yml 
- name: index.j2 > index.html 
  template:
    src: index.j2
    dest: /var/www/html/index.html
    **mode: 0644**
    backup: yes
  notify:
    - restart nginx
    - restart httpd

setuid, setgid, sticky는 리눅스 및 유닉스 시스템에서 파일이나 디렉터리의 특수 권한을 설정하는 데 사용되는 비트입니다. 이 비트들은 기본적인 읽기(r), 쓰기(w), 실행(x) 권한 외에도, 파일이나 디렉터리의 동작을 특별하게 제어합니다. 각 특수 권한은 숫자 코드의 맨 앞자리에 설정될 수 있습니다.

1. setuid (Set User ID)

  • setuid 비트는 실행 가능한 파일에 적용됩니다. 이 비트가 설정되면, 해당 프로그램을 실행하는 사용자 대신, 파일의 소유자의 권한으로 프로그램이 실행됩니다.
  • 예를 들어, 일반 사용자가 setuid 비트가 설정된 프로그램을 실행하면, 프로그램은 그 사용자가 아닌 파일 소유자의 권한으로 실행됩니다.
  • 이 비트는 주로 시스템에서 특수 권한을 필요로 하는 프로그램(예: passwd 명령어)에서 사용됩니다.

예시:

chmod 4755 또는 chmod u+s 명령어로 setuid 비트를 설정할 수 있습니다.

  • 4는 setuid 비트를 의미합니다.

예시:

-rwsr-xr-x 1 root root 12345 Jan 1 12:00 /usr/bin/passwd

위의 예시에서, passwd 명령어는 setuid 비트가 설정되어 있어, root 권한으로 실행됩니다. 일반 사용자가 실행해도 root 권한으로 실행되는 것입니다.

2. setgid (Set Group ID)

  • setgid 비트는 실행 파일이나 디렉터리에 적용될 수 있습니다.
    • 실행 파일에 설정되면, 프로그램을 실행할 때 파일의 그룹 권한으로 실행됩니다.
    • 디렉터리에 설정되면, 해당 디렉터리에서 새로 생성된 파일들이 디렉터리의 그룹 소유권을 상속받습니다. 즉, 디렉터리 내에서 생성된 모든 파일은 그 디렉터리와 같은 그룹 소유자가 됩니다.

예시:

chmod 2755 또는 chmod g+s 명령어로 setgid 비트를 설정할 수 있습니다.

  • 2는 setgid 비트를 의미합니다.

예시:

drwxr-sr-x 2 user group 4096 Jan 1 12:00 /data/shared

위의 예시에서, shared 디렉터리 내에 생성된 파일은 자동으로 group 그룹 소유자가 됩니다.

3. sticky (Sticky Bit)

  • sticky 비트는 디렉터리에 설정됩니다. 이 비트가 설정된 디렉터리에서는 파일 삭제에 대한 특별한 제한이 적용됩니다.
  • 디렉터리에 sticky 비트가 설정되면, 해당 디렉터리 내의 파일은 파일 소유자만 삭제할 수 있습니다. 즉, 다른 사용자는 다른 사용자가 만든 파일을 삭제할 수 없습니다.
  • 이 비트는 주로 공유 디렉터리(예: /tmp)에서 사용되며, 여러 사용자가 공유하는 공간에서 다른 사용자의 파일을 실수로 삭제하지 않도록 보호하는 기능을 제공합니다.

예시:

chmod +t 명령어로 sticky 비트를 설정할 수 있습니다.

  • 1은 sticky 비트를 의미합니다.

예시:

drwxrwxrwt 2 user group 4096 Jan 1 12:00 /tmp

위의 예시에서, /tmp 디렉터리는 sticky 비트가 설정되어 있어서, 사용자는 자신이 만든 파일만 삭제할 수 있고, 다른 사용자의 파일은 삭제할 수 없습니다.

Docker

  1. Docker와 명령어 처리
    • Docker는 사용자가 입력한 명령어를 dockerd (Docker 데몬)를 통해 처리합니다.
    • dockerd는 컨테이너 실행, 이미지 빌드, 네트워크 관리, 볼륨 관리 등 다양한 고수준 작업을 처리합니다.
    • dockerd는 실제 컨테이너 실행을 위해 containerd를 호출하고, containerd는 컨테이너의 실행을 관리합니다.
  2. containerd의 역할
    • containerd는 Docker의 저수준 컨테이너 관리를 담당하는 핵심 구성 요소입니다.
    • containerd는 컨테이너 이미지 관리, 컨테이너 실행, 컨테이너 수명 주기 관리를 담당합니다.
    • containerd는 **컨테이너 실행을 위한 shim (containerd-shim)**을 생성하고, 이를 통해 실제 컨테이너 실행을 관리합니다.
  3. containerd-shim과 runC
    • containerd-shim은 각 컨테이너에 대해 컨테이너 실행을 담당하는 중개자 역할을 합니다. shim은 컨테이너의 생애 주기를 관리하며, 컨테이너가 실행 중일 때 유지됩니다.
    • containerd-shim은 저수준 런타임runC를 호출하여 실제로 컨테이너를 실행합니다.
    • runC는 컨테이너 런타임으로서, **컨테이너의 격리 환경(cgroup, namespace 등)**을 설정하고 실제 컨테이너를 실행하는 역할을 합니다.
    • 실행 후, runC는 컨테이너를 실행하고, 그 이후에는 containerd-shim에 의해 관리됩니다.
  4. 컨테이너의 구성
    • 컨테이너는 cgroup, namespace, chroot, 네트워크 등의 기술을 활용하여 격리된 환경을 제공합니다.
    • runC는 이 격리 기능을 설정하고, 컨테이너가 실제로 실행되도록 합니다.
  5. containerd와 컨테이너 관리
    • 컨테이너가 실행되고 나면, containerd는 이를 관리합니다. containerd-shim은 컨테이너 실행 후 일시적으로 활성화되고, 컨테이너가 종료되면 자체적으로 종료됩니다.
    • 최종적으로 containerd가 컨테이너를 관리하는 핵심 컴포넌트로, dockerd는 그 위에서 여러 고수준 작업을 처리합니다.
  6. Docker와 Kubernetes
    • Dockercontainerd 위에 여러 기능을 추가한 시스템으로, 컨테이너 이미지 빌드, 컨테이너 실행 관리, 네트워크 관리 등 여러 작업을 처리합니다.
    • 그러나 Kubernetes는 Docker 대신 containerd를 직접 사용하여 컨테이너를 관리합니다. Kubernetes는 containerd와 직접 통합되어 컨테이너의 수명 주기를 관리하며, Docker는 더 이상 필수적이지 않습니다.
    • containerd는 독립적으로 컨테이너를 실행하고 관리할 수 있기 때문에, docker가 다운되어도 containerd는 계속해서 개별 컨테이너를 독립적으로 관리할 수 있습니다.

Docker Compose의 역할 및 특징

  1. Stack 형태로 여러 컨테이너 실행 관리
    • Docker Compose는 여러 개의 동일한 컨테이너를 한 번에 실행하고 관리할 수 있는 도구입니다.
    • 예를 들어, 동일한 애플리케이션의 여러 인스턴스를 동시에 실행하거나, 여러 서비스를 하나의 환경에서 동시에 배포할 수 있습니다.
    • Stack: 여러 개의 서비스를 한 번에 관리하는 방식으로, 여러 컨테이너들이 네트워크와 볼륨을 공유하면서 협력할 수 있게 해줍니다.
  2. 단일 서버에서 동작
    • Docker Compose는 클러스터 환경에서 동작하는 것이 아니라, 단일 서버에서 여러 컨테이너를 관리할 수 있는 도구입니다.
    • 즉, 여러 서버에 분산된 컨테이너를 관리하는 것이 아니라, 한 서버 내에서 컨테이너와 네트워크를 관리하는 역할을 합니다.
  3. 명령어 및 YAML 파일 사용
    • Docker Compose는 **명령어 (CLI)**와 YAML 파일을 이용해 구성과 실행을 할 수 있습니다.
    • YAML 파일 (docker-compose.yml)을 사용하여, 여러 컨테이너의 설정, 네트워크, 볼륨 등을 정의하고, 명령어를 통해 이를 실행하거나 제어합니다. 예: docker-compose up 명령어로 정의된 서비스를 실행하고, docker-compose down으로 종료할 수 있습니다.

관련글 더보기