소프트웨어 기술(스타트업 위주)
docker
docker 정리 입니다. 추가적인 자세한 설명 및 툴 이용 방법은 각 목차별로 공식문서 페이지로 하이퍼링크 참조하겠습니다.
1. Introduction
1.1 What are Containers?
컨테이너(Container)는 응용 프로그램과 그 종속성을 함께 패키징하여 운영 체제(OS)에서 격리된 환경에서 실행할 수 있도록 해주는 가상화 기술이다. 컨테이너는 OS 레벨 가상화를 사용하며, 가볍고 이식성이 뛰어나며 빠르게 실행될 수 있다.
예제:
- 개발자가 로컬에서 실행한 애플리케이션을 동일한 환경으로 서버에서도 실행할 수 있음
- 여러 개의 서로 다른 애플리케이션을 동일한 서버에서 충돌 없이 실행 가능
1.2 Why do we need Containers?
컨테이너가 필요한 이유는 다음과 같다:
- 이식성(Portability): 개발 환경과 운영 환경이 동일하게 유지됨
- 격리성(Isolation): 하나의 서버에서 여러 애플리케이션이 독립적으로 실행됨
- 경량화(Lightweight): VM보다 더 적은 리소스를 사용하면서 빠르게 실행 가능
- 빠른 배포 및 확장: CI/CD와 결합하여 애플리케이션을 빠르게 배포할 수 있음
1.3 Bare Metal vs VMs vs Containers
항목 | Bare Metal (물리 서버) | Virtual Machine (VM) | Container |
---|---|---|---|
성능 | 최고 | 중간 | 높음 |
리소스 사용량 | 높음 | 많음 | 적음 |
부팅 속도 | 느림 | 느림 | 빠름 |
OS 격리 | 없음 | 있음 | 없음 |
배포 속도 | 매우 느림 | 중간 | 매우 빠름 |
이식성 | 낮음 | 중간 | 높음 |
1.4 Docker and OCI
- Docker: 컨테이너를 생성하고 관리하기 위한 도구로, 컨테이너 런타임, 이미지 빌드, 네트워크 관리 등을 제공한다.
- OCI (Open Container Initiative): 컨테이너 표준을 정의하는 오픈 소스 프로젝트로, 컨테이너 런타임과 이미지 형식의 표준을 제공한다.
2. Prerequisites
2.1 Linux Fundamentals
Docker는 리눅스 컨테이너 기술을 기반으로 하기 때문에, 기본적인 리눅스 개념을 이해하는 것이 중요하다.
2.1.1 Package Managers (패키지 관리자)
- Ubuntu/Debian:
apt
,dpkg
- CentOS/RHEL:
yum
,dnf
,rpm
- Arch Linux:
pacman
예제:
# Ubuntu에서 nginx 설치
sudo apt update && sudo apt install -y nginx
2.1.2 Users / Groups Permissions (사용자 및 권한)
root
사용자와sudo
명령어 사용chown
,chmod
명령어를 통한 파일 권한 변경
예제:
# myfile.txt 파일의 소유자를 user1으로 변경
sudo chown user1 myfile.txt
2.1.3 Shell Commands (셸 명령어)
ls
,cd
,mkdir
,rm
,grep
,find
등의 기본 명령어ps
,top
,kill
을 사용하여 프로세스 관리
2.1.4 Shell Scripting (셸 스크립팅)
- 기본적인 Bash 스크립트 작성
- 변수, 조건문, 반복문 사용
예제:
#!/bin/bash
for i in {1..5}
do
echo "Hello, Docker!"
done
3. Underlying Technologies
3.1 Namespaces (네임스페이스)
네임스페이스는 컨테이너가 서로 독립된 환경을 유지할 수 있도록 하는 기술이다.
- PID 네임스페이스: 각 컨테이너의 프로세스를 독립적으로 실행
- Network 네임스페이스: 각 컨테이너가 독립적인 네트워크 인터페이스를 가짐
- Mount 네임스페이스: 컨테이너의 파일 시스템을 격리함
3.2 cgroups (Control Groups)
cgroups는 컨테이너의 CPU, 메모리, 디스크 I/O 등의 리소스를 제한하는 기술이다.
예제:
# 특정 컨테이너에 CPU와 메모리 제한 적용
docker run --memory=512m --cpus=1 nginx
3.3 Union Filesystems (유니온 파일 시스템)
유니온 파일 시스템은 컨테이너 이미지의 계층적 구조를 제공한다.
- OverlayFS: 최신 Docker에서 사용되는 파일 시스템
- AUFS: 예전 Docker에서 사용되던 파일 시스템
4. Installation / Setup
4.1 Docker Desktop (Windows / Mac / Linux)
Docker Desktop은 GUI 기반의 Docker 실행 환경을 제공한다.
설치 방법 (Windows/Mac)
- Docker 공식 사이트에서 Docker Desktop 다운로드
- 설치 후 Docker 실행 및 설정
설치 확인:
docker --version
4.2 Docker Engine (Linux)
리눅스 환경에서 Docker 엔진을 설치하는 방법이다.
Ubuntu에서 설치:
sudo apt update
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
설치 확인:
docker version
5. Basics of Docker
Docker는 컨테이너 기반 가상화 기술을 제공하는 플랫폼으로, 애플리케이션과 그 종속성을 컨테이너에 패키징하여 어디서든 동일한 환경에서 실행할 수 있도록 돕습니다.
5.1 Docker의 주요 개념
- 이미지(Image): 실행 가능한 애플리케이션을 포함한 불변의 파일 시스템 스냅샷
- 컨테이너(Container): 이미지를 실행하여 애플리케이션을 실행하는 독립된 환경
- Docker Daemon: 컨테이너 관리를 수행하는 백그라운드 서비스
- Docker CLI: 사용자가 Docker를 제어하는 명령줄 도구
- Docker Hub: 공식적인 Docker 이미지 저장소
5.2 간단한 Docker 실행 예제
docker run hello-world
이 명령어는 hello-world
컨테이너를 실행하여, Docker가 정상적으로 작동하는지 확인합니다.
6. Data Persistence
Docker 컨테이너는 기본적으로 휘발성 파일 시스템을 사용합니다. 데이터를 유지하려면 볼륨(Volume)이나 바인드 마운트(Bind Mount)를 사용해야 합니다.
6.1 Ephemeral Container Filesystem
컨테이너의 기본 파일 시스템은 휘발성이며, 컨테이너가 종료되면 내부 데이터가 사라집니다.
docker run -it --rm ubuntu bash
위 명령을 실행하고 파일을 생성한 후 컨테이너를 종료하면 파일이 사라지는 것을 확인할 수 있습니다.
6.2 Volume Mounts
볼륨을 사용하면 데이터를 컨테이너 외부에 저장할 수 있습니다.
docker volume create my_volume
docker run -d --name my_container -v my_volume:/data busybox
위 명령어는 my_volume
을 생성하고 /data
디렉토리에 마운트한 컨테이너를 실행합니다.
6.3 Bind Mounts
호스트의 특정 디렉토리를 컨테이너에 직접 마운트하는 방법입니다.
docker run -d --name my_container -v /host/data:/container/data busybox
위 명령어는 /host/data
를 컨테이너 내부의 /container/data
에 마운트합니다.
7. Using 3rd Party Container Images
7.1 Database 컨테이너 실행
docker run -d --name postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 postgres
7.2 Interactive Test Environments
docker run -it python:3.9 bash
7.3 Command Line Utilities
docker run --rm busybox echo "Hello from BusyBox"
8. Building Container Images
8.1 Dockerfile 작성 예제
FROM python:3.9
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "app.py"]
8.2 Efficient Layer Caching
Docker는 캐싱을 활용하여 빌드를 빠르게 할 수 있습니다.
8.3 Image Size & Security
- 작은 기반 이미지를 사용 (
alpine
,slim
버전) - 불필요한 파일 제외 (
.dockerignore
활용)
9. Container Registries
9.1 Docker Hub
공식적인 이미지 저장소이며, docker push
명령어를 사용하여 이미지를 업로드할 수 있습니다.
9.2 다른 레지스트리 (AWS ECR, GCP Artifact Registry 등)
9.3 Image Tagging Best Practices
latest
태그 사용 자제- 버전 및 빌드 정보 포함 (
app:v1.2.3
)
10. Running Containers
10.1 docker run
명령어
docker run -d -p 80:80 nginx
10.2 docker-compose
사용
version: '3'
services:
web:
image: nginx
ports:
- '8080:80'
10.3 Runtime Configuration Options
-e
: 환경 변수 설정--restart
: 재시작 정책 설정-v
: 볼륨 마운트--network
: 네트워크 설정
11. Container Security
컨테이너 보안(Container Security)은 컨테이너 환경에서의 취약점을 식별하고, 실행 중인 컨테이너의 위협을 탐지 및 방어하는 기술과 전략을 포함한다. 컨테이너는 경량화된 가상화 기술이지만, 잘못된 구성이나 보안 패치를 적용하지 않은 이미지 사용 시 공격의 대상이 될 수 있다.
11.1 Runtime Security
정의: 실행 중인 컨테이너의 동작을 모니터링하고, 이상 징후를 탐지하여 보안 위협을 방어하는 과정이다. 이는 시스템 호출 분석, 네트워크 트래픽 모니터링, 권한 상승 탐지 등을 포함한다.
예시:
- Falco: 컨테이너 내에서 발생하는 비정상적인 동작을 탐지하는 오픈소스 보안 도구.
- AppArmor / SELinux: 컨테이너의 프로세스를 제한하여 보안성을 강화하는 리눅스 커널 보안 모듈.
- Sysdig: 컨테이너 환경에서의 보안 이벤트를 실시간으로 분석하는 도구.
11.2 Image Security
정의: 컨테이너 이미지의 취약점을 분석하고, 보안 패치가 적용된 안전한 이미지를 사용하여 악성 코드 및 보안 위협을 방지하는 방법이다.
예시:
- Docker Content Trust(DCT): 서명된 컨테이너 이미지만 실행할 수 있도록 보장하는 기능.
- Trivy / Clair / Anchore: 컨테이너 이미지의 취약점을 스캔하는 도구.
- 최소 권한 원칙 적용: 루트 권한이 없는 사용자로 컨테이너를 실행하여 보안성을 높임.
12. Docker CLI
Docker CLI(Command Line Interface)는 도커를 제어하고 컨테이너, 이미지, 볼륨, 네트워크 등을 관리하는 명령어 집합이다.
12.1 Containers
정의: 컨테이너는 애플리케이션과 그 종속성을 함께 패키징하여 격리된 환경에서 실행하는 단위이다.
예시 명령어:
docker run -d -p 8080:80 nginx
: Nginx 컨테이너 실행.docker ps
: 실행 중인 컨테이너 목록 확인.docker stop <container_id>
: 특정 컨테이너 중지.
12.2 Images
정의: 컨테이너 실행에 필요한 모든 파일과 환경을 포함하는 불변의 패키지.
예시 명령어:
docker pull ubuntu:latest
: 최신 Ubuntu 이미지 다운로드.docker images
: 로컬에 저장된 이미지 목록 확인.docker rmi <image_id>
: 특정 이미지 삭제.
12.3 Volumes
정의: 컨테이너 간 데이터 공유 및 지속성을 유지하기 위한 Docker의 스토리지 메커니즘.
예시 명령어:
docker volume create myvolume
: 볼륨 생성.docker run -v myvolume:/data alpine
: 특정 볼륨을 컨테이너에 마운트.docker volume rm myvolume
: 특정 볼륨 삭제.
12.4 Networks
정의: Docker 컨테이너 간의 통신을 관리하는 네트워크 기능.
예시 명령어:
docker network create mynetwork
: 새로운 네트워크 생성.docker run --network=mynetwork nginx
: 특정 네트워크에 컨테이너 연결.docker network ls
: 네트워크 목록 확인.
13. Developer Experience
13.1 Hot Reloading
정의: 소스 코드 변경 사항을 자동으로 감지하여 컨테이너 내 애플리케이션을 즉시 업데이트하는 기능.
예시:
nodemon
: Node.js 애플리케이션에서 코드 변경 시 자동 재시작.webpack-dev-server
: 프론트엔드 개발에서 코드 변경을 즉시 반영.docker-compose up --build
: 변경된 코드를 적용하여 컨테이너 재시작.
13.2 Debuggers
정의: Docker 환경에서 애플리케이션을 디버깅하는 기술과 도구.
예시:
dlv
: Go 애플리케이션 디버깅.remote debugging
: VS Code와 같은 IDE에서 원격 디버깅 설정.docker logs <container_id>
: 컨테이너 로그 확인.
13.3 Tests
정의: Docker 환경에서의 테스트 자동화.
예시:
pytest
: Python 애플리케이션의 테스트 실행.Jest
: JavaScript 애플리케이션의 테스트 프레임워크.docker-compose -f docker-compose.test.yml up
: 테스트 환경 컨테이너 실행.
13.4 Continuous Integration
정의: 코드 변경 사항을 지속적으로 통합하고 테스트하는 DevOps 프로세스.
예시:
- GitHub Actions + Docker: CI/CD 파이프라인 구축.
- GitLab CI/CD:
.gitlab-ci.yml
을 활용한 Docker 기반 빌드 및 테스트. - Jenkins: Docker 컨테이너에서 테스트 실행.
14. Deploying Containers
14.1 PaaS Options
정의: 컨테이너 기반 애플리케이션을 배포할 수 있는 플랫폼.
예시:
- AWS Elastic Beanstalk
- Google Cloud Run
- Heroku
14.2 Kubernetes
정의: 컨테이너 오케스트레이션을 통해 애플리케이션을 배포, 관리, 확장하는 시스템.
예시:
kubectl apply -f deployment.yaml
: 쿠버네티스에 애플리케이션 배포.minikube start
: 로컬 쿠버네티스 클러스터 실행.helm install myapp chart/
: Helm을 이용한 쿠버네티스 애플리케이션 배포.
14.3 Docker Swarm
정의: Docker가 제공하는 네이티브 컨테이너 오케스트레이션 도구.
예시:
docker swarm init
: Swarm 모드 활성화.docker service create --replicas 3 nginx
: 3개의 복제본을 가지는 서비스 생성.docker stack deploy -c docker-compose.yml myapp
: 스택을 이용한 애플리케이션 배포.
14.4 Nomad
정의: HashiCorp에서 개발한 컨테이너 및 VM을 오케스트레이션하는 경량 솔루션.
예시:
nomad job run example.nomad
: Nomad 잡 실행.nomad status <job_name>
: 실행 중인 잡의 상태 확인.nomad stop <job_name>
: 특정 잡 중지.