도커 기본 설명
도커 컨테이너 격리
도커
도커란?
도커(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