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 비트를 설정할 수 있습니다.
예시:
-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 비트를 설정할 수 있습니다.
예시:
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 비트를 설정할 수 있습니다.
예시:
drwxrwxrwt 2 user group 4096 Jan 1 12:00 /tmp
위의 예시에서, /tmp 디렉터리는 sticky 비트가 설정되어 있어서, 사용자는 자신이 만든 파일만 삭제할 수 있고, 다른 사용자의 파일은 삭제할 수 없습니다.
Docker
- Docker와 명령어 처리
- Docker는 사용자가 입력한 명령어를 dockerd (Docker 데몬)를 통해 처리합니다.
- dockerd는 컨테이너 실행, 이미지 빌드, 네트워크 관리, 볼륨 관리 등 다양한 고수준 작업을 처리합니다.
- dockerd는 실제 컨테이너 실행을 위해 containerd를 호출하고, containerd는 컨테이너의 실행을 관리합니다.
- containerd의 역할
- containerd는 Docker의 저수준 컨테이너 관리를 담당하는 핵심 구성 요소입니다.
- containerd는 컨테이너 이미지 관리, 컨테이너 실행, 컨테이너 수명 주기 관리를 담당합니다.
- containerd는 **컨테이너 실행을 위한 shim (containerd-shim)**을 생성하고, 이를 통해 실제 컨테이너 실행을 관리합니다.
- containerd-shim과 runC
- containerd-shim은 각 컨테이너에 대해 컨테이너 실행을 담당하는 중개자 역할을 합니다. shim은 컨테이너의 생애 주기를 관리하며, 컨테이너가 실행 중일 때 유지됩니다.
- containerd-shim은 저수준 런타임인 runC를 호출하여 실제로 컨테이너를 실행합니다.
- runC는 컨테이너 런타임으로서, **컨테이너의 격리 환경(cgroup, namespace 등)**을 설정하고 실제 컨테이너를 실행하는 역할을 합니다.
- 실행 후, runC는 컨테이너를 실행하고, 그 이후에는 containerd-shim에 의해 관리됩니다.
- 컨테이너의 구성
- 컨테이너는 cgroup, namespace, chroot, 네트워크 등의 기술을 활용하여 격리된 환경을 제공합니다.
- runC는 이 격리 기능을 설정하고, 컨테이너가 실제로 실행되도록 합니다.
- containerd와 컨테이너 관리
- 컨테이너가 실행되고 나면, containerd는 이를 관리합니다. containerd-shim은 컨테이너 실행 후 일시적으로 활성화되고, 컨테이너가 종료되면 자체적으로 종료됩니다.
- 최종적으로 containerd가 컨테이너를 관리하는 핵심 컴포넌트로, dockerd는 그 위에서 여러 고수준 작업을 처리합니다.
- Docker와 Kubernetes
- Docker는 containerd 위에 여러 기능을 추가한 시스템으로, 컨테이너 이미지 빌드, 컨테이너 실행 관리, 네트워크 관리 등 여러 작업을 처리합니다.
- 그러나 Kubernetes는 Docker 대신 containerd를 직접 사용하여 컨테이너를 관리합니다. Kubernetes는 containerd와 직접 통합되어 컨테이너의 수명 주기를 관리하며, Docker는 더 이상 필수적이지 않습니다.
- containerd는 독립적으로 컨테이너를 실행하고 관리할 수 있기 때문에, docker가 다운되어도 containerd는 계속해서 개별 컨테이너를 독립적으로 관리할 수 있습니다.
Docker Compose의 역할 및 특징
- Stack 형태로 여러 컨테이너 실행 관리
- Docker Compose는 여러 개의 동일한 컨테이너를 한 번에 실행하고 관리할 수 있는 도구입니다.
- 예를 들어, 동일한 애플리케이션의 여러 인스턴스를 동시에 실행하거나, 여러 서비스를 하나의 환경에서 동시에 배포할 수 있습니다.
- Stack: 여러 개의 서비스를 한 번에 관리하는 방식으로, 여러 컨테이너들이 네트워크와 볼륨을 공유하면서 협력할 수 있게 해줍니다.
- 단일 서버에서 동작
- Docker Compose는 클러스터 환경에서 동작하는 것이 아니라, 단일 서버에서 여러 컨테이너를 관리할 수 있는 도구입니다.
- 즉, 여러 서버에 분산된 컨테이너를 관리하는 것이 아니라, 한 서버 내에서 컨테이너와 네트워크를 관리하는 역할을 합니다.
- 명령어 및 YAML 파일 사용
- Docker Compose는 **명령어 (CLI)**와 YAML 파일을 이용해 구성과 실행을 할 수 있습니다.
- YAML 파일 (docker-compose.yml)을 사용하여, 여러 컨테이너의 설정, 네트워크, 볼륨 등을 정의하고, 명령어를 통해 이를 실행하거나 제어합니다. 예: docker-compose up 명령어로 정의된 서비스를 실행하고, docker-compose down으로 종료할 수 있습니다.