식사법
도커 기본 설명 본문
도커 컨테이너 격리
도커
도커란?
도커(Docker)는 가상실행 환경(Container)를 제공해주는 하나의 플랫폼입니다. 명확히 표현하자면 “컨테이너화된 프로세스(Containerized Process) 입니다.
그렇다면 도커를 사용하는 이유는 무엇일까요? 과거 어떤 프로그램을 개발할 시 모든 환경에서 동일하게 동작할 것이라는 보장이 없었습니다. 개발자의 PC에서는 정상적으로 실행되던 애플리케이션이 사용자의 PC에서는 돌아가지 않을 수 있습니다. 이때 이러한 애플리케이션을 Container로 만들어 놓는다면 도커가 설치된 환경이든 동일하게 실행될 수 있습니다.
Container와 VM
- 가상화 하면 Docker 말고도 VM(가상 머신)을 생각하시는 분들도 있을 것이라 생각합니다.
- 그렇다면 VM과 Docker Container의 차이는 무엇일까요?
VM
- 전공자 분들은 아무래도 많이 사용해 보실것이라 생각합니다. Window PC 에서 리눅스가 필요할때 많이들 설치하셔서 사용하실 거라 생각합니다.
- 흔히들 사용하시는 AWS 의 EC2 와 같은 서비스가 AWS 측에서 만들어준 VM을 우리가 접속하는 형태입니다.
특징
1. Virtualization Layer의 필요 ( Hypervisor 등 )
VM은 호스트의 Hardware 리소스와 직접적으로 연결되지 않습니다. 그렇기 때문에 이러한 Hardware 리소스를 동적으로 할당해 줄 수 있는 녀석이 필요합니다. 이러한 녀석이 바로 Virtualization Layer로 가상머신에 필요한 리소스를 할당 및 스케줄링합니다.
2. 각각의 VM마다 OS 보유
호스트 운영체제와 관계없이 각 VM은 별개의 OS를 가지고 있습니다. Window PC에서 구동되는 VM이 리눅스 OS로 실행 될 수 있습니다. 이 때문에 보통 VM 이미지의 경우 GB단위로 구성됩니다.
OS를 가지고 있다는 특성 때문에 보통 VM하나를 실행하는데 오랜시간이 걸립니다.
Docker Container
- 흔히들 사용하시진 않으시겠지만 AWS의 ECS 가 Container를 실행시켜주는 클라우드 서비스 입니다.
특징
1. 별도의 레이어 없이 작동
Docker Container의 경우 호스트의 OS 커널을 공유하기 때문에 Hardware 리소스를 할당받아 작동할 수 있습니다.
2. OS 가 존재 하지 않음
위에서 말했듯이 호스트의 OS를 공유하기 때문에 별도의 OS가 없습니다. 컨테이너에 따라 천차만별이긴 하지만 작게는 10MB 이하로도 컨테이너를 구성가능합니다. ( CICD 파이프라인 작동 시 Code 구조를 검사하는 codeclimate-structure 라는 이미지는 대략 2.5기가 정도됩니다)
도커 아키텍처
Docker Client
- 실질적으로 사용자가 docker 명령어를 사용하는 곳입니다. docker 명령어를 Docker Daemon에 전달합니다
Docker Daemon
- Docker 데몬은 Docker 관련 api 를 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리합니다.
Docker Registry
- Docker Registry는 Docker image 를 저장하는 저장소입니다. image를 기반으로 컨테이너가 실행되기 때문에, Docker와 땔래야 땔 수 없는 녀석입니다. Docker 에서 공식적으로 제공하는 레지스트리와, 기업 혹은 개인이 프라이빗하게 사용하기 위한 레지스트리가 존재합니다. ( AWS ECR 등 )
도커 기본 사용
# 번외 : Linux Process 이해
- 프로세스란?
프로세스는 실행 중인 프로그램의 인스턴스를 의미합니다. 프로세스는 고유한 PID를 가지고 있습니다. 프로세스에 대한 리소스 자원 할당 및 스케쥴링은 OS가 맡고 있습니다. Linux에서 이러한 프로세스는 트리구조로 관리 되고있으며, 부모 프로세스와 자식프로세스로서 존재합니다.
- 프로세스 확인법 ( /proc )
많이들 ps 명령어를 통해 프로세스를 확인하시곤 하는데, /proc 경로를 통해 프로세스를 확인할 수 있습니다
/proc 디렑토리는 커널이 동적으로 생성하는 정보를 실시간으로 제공해 줍니다.
다양한 /proc 내부 정보들
- 리눅스의 /proc 디렉터리는 커널이 동적으로 생성하는 정보를 실시간 제공 : 시스템 상태, 프로세스(/proc/[PID]), HW 정보
- /proc/cpuinfo: CPU에 대한 정보가 포함되어 있습니다. CPU 모델, 코어 수, 클럭 속도 등의 정보를 확인할 수 있습니다.
- /proc/meminfo: 메모리 사용 현황을 보여줍니다. 전체 메모리, 사용 중인 메모리, 가용 메모리, 캐시 메모리 등 다양한 메모리 관련 정보를 제공합니다.
- /proc/uptime: 시스템이 부팅된 후 경과된 시간을 초 단위로 보여줍니다. 첫 번째 숫자는 총 가동 시간, 두 번째 숫자는 시스템의 유휴 시간입니다.
- /proc/loadavg: 시스템의 현재 부하 상태를 나타냅니다. 첫 번째 세 개의 숫자는 1, 5, 15분간의 시스템 부하 평균을 의미하며, 네 번째 숫자는 현재 실행 중인 프로세스와 총 프로세스 수, 마지막 숫자는 마지막으로 실행된 프로세스의 PID를 나타냅니다.
- /proc/version: 커널 버전, GCC 버전 및 컴파일된 날짜와 같은 커널의 빌드 정보를 포함합니다.
- /proc/filesystems: 커널이 인식하고 있는 파일 시스템의 목록을 보여줍니다.
- /proc/partitions: 시스템에서 인식된 파티션 정보를 제공합니다. 디스크 장치와 해당 파티션 크기 등을 확인할 수 있습니다.
- 프로세스(/proc/[PID]) 별 정보
- /proc/[PID]/cmdline: 해당 프로세스를 실행할 때 사용된 명령어와 인자를 포함합니다.
- /proc/[PID]/cwd: 프로세스의 현재 작업 디렉터리에 대한 심볼릭 링크입니다. ls -l로 확인하면 해당 프로세스가 현재 작업 중인 디렉터리를 알 수 있습니다.
- /proc/[PID]/environ: 프로세스의 환경 변수를 나타냅니다. 각 변수는 NULL 문자로 구분됩니다.
- /proc/[PID]/exe: 프로세스가 실행 중인 실행 파일에 대한 심볼릭 링크입니다.
- /proc/[PID]/fd: 프로세스가 열어놓은 모든 파일 디스크립터에 대한 심볼릭 링크를 포함하는 디렉터리입니다. 이 파일들은 해당 파일 디스크립터가 가리키는 실제 파일이나 소켓 등을 참조합니다.
- /proc/[PID]/maps: 프로세스의 메모리 맵을 나타냅니다. 메모리 영역의 시작과 끝 주소, 접근 권한, 매핑된 파일 등을 확인할 수 있습니다.
- /proc/[PID]/stat: 프로세스의 상태 정보를 포함한 파일입니다. 이 파일에는 프로세스의 상태, CPU 사용량, 메모리 사용량, 부모 프로세스 ID, 우선순위 등의 다양한 정보가 담겨 있습니다.
- /proc/[PID]/status: 프로세스의 상태 정보를 사람이 읽기 쉽게 정리한 파일입니다. PID, PPID(부모 PID), 메모리 사용량, CPU 사용률, 스레드 수 등을 확인할 수 있습니다.
도커 기본 설치
- 사실 설치는 환경에 따라 다르기 때문에 Docker 공식 문서를 확인바랍니다
https://docs.docker.com/engine/install/
Non-root user로 docker 사용하기
- 우선 Docker는 보안상의 이유로 Root user사용을 권고하고 있지 않습니다. 하지만 Docker Daemon은 Unix Socket에 바인딩 되어있어 root user로만 작동합니다. 이때, docker group에 user를 추가함으로서 다른 사용자로 docker를 실행 시킬 수 있습니다.
#Check docker group
tail -n 3 /etc/group
# sudo usermod -aG docker ${username}
sudo usermod -aG docker ubuntu
Container 내부에서 Docker 사용하기
- 컨테이너가 내부에서 Docker를 활용하기 위해서는 host의 docker socket file 공유를 해야한다.
- 방법은 간단히 docker.socket 경로를 container 내부에 마운트 해주면 된다.
예시
docker run --rm -it **-v /run/docker.sock:/run/docker.sock -v /usr/bin/docker:/usr/bin/docker** ubuntu:latest bash
위와 같은 방식은 docker in docker 를 활용할 때 자주 사용하는데, Container가 다른 Container를 실행시켜야하는 경우 자주 사용한다.
도커 정보 확인
- 네트워크 정보 확인
ip -br -c addr
- 이더넷 브리지 정보 확인
brctl show
- iptables 정책 확인
sudo iptables -t filter -S
'K8s > 컨테이너 격리' 카테고리의 다른 글
컨테이너 격리 - process (0) | 2024.08.31 |
---|---|
리눅스 프로세스 격리 - filesystem (0) | 2024.08.31 |