소개
이 포괄적인 Docker 튜토리얼은 개발자 및 IT 전문가에게 컨테이너화 기술에 대한 심층적인 이해를 제공합니다. Docker 의 핵심 개념, 아키텍처, 그리고 실제 구현 전략을 탐색함으로써 학습자는 다양한 컴퓨팅 환경에서 애플리케이션을 패키징, 배포 및 관리하는 실질적인 기술을 습득하게 됩니다.
Docker 기본
Docker 란 무엇인가?
Docker 는 애플리케이션 배포 및 개발을 혁신하는 강력한 컨테이너 플랫폼입니다. 오픈소스 기술로서 Docker 는 개발자가 다양한 컴퓨팅 환경에서 애플리케이션을 일관되게 패키징, 배포 및 실행할 수 있도록 지원합니다.
Docker 의 핵심 개념
컨테이너 대 가상 머신
graph TD
A[물리적 하드웨어] --> B[Docker 컨테이너]
A --> C[가상 머신]
B --> D[경량]
B --> E[공유 OS 커널]
C --> F[중량]
C --> G[전체 OS 오버헤드]
| 특징 | Docker 컨테이너 | 가상 머신 |
|---|---|---|
| 리소스 사용량 | 경량 | 리소스 집약적 |
| 시작 시간 | 몇 초 | 몇 분 |
| 격리 수준 | 프로세스 수준 | 전체 시스템 |
Docker 아키텍처
Docker 는 클라이언트 - 서버 아키텍처를 사용하며 다음과 같은 주요 구성 요소를 포함합니다.
- Docker 데몬
- Docker 클라이언트
- Docker 레지스트리
- Docker 이미지
- Docker 컨테이너
기본 Docker 명령어
Ubuntu 22.04 에 Docker 설치:
## 시스템 패키지 업데이트
sudo apt update
## Docker 종속성 설치
sudo apt install apt-transport-https ca-certificates curl software-properties-common
## Docker 공식 GPG 키 추가
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
## Docker 리포지토리 설정
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
## Docker 엔진 설치
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
## Docker 설치 확인
sudo docker --version
첫 번째 컨테이너 실행
## Ubuntu 이미지 가져오기
sudo docker pull ubuntu:latest
## 대화형 컨테이너 실행
sudo docker run -it ubuntu:latest /bin/bash
## 실행 중인 컨테이너 목록
sudo docker ps
## 모든 컨테이너 목록
sudo docker ps -a
이미지 관리
## 이미지 검색
sudo docker search nginx
## 이미지 다운로드
sudo docker pull nginx
## 로컬 이미지 목록
sudo docker images
컨테이너 네트워킹
Docker 네트워크 유형
graph TD
A[Docker 네트워크 유형] --> B[Bridge 네트워크]
A --> C[Host 네트워크]
A --> D[None 네트워크]
A --> E[Overlay 네트워크]
| 네트워크 유형 | 설명 | 사용 사례 |
|---|---|---|
| Bridge | 기본 네트워크 | 격리된 컨테이너 간 통신 |
| Host | 직접 호스트 네트워크 | 성능이 중요한 애플리케이션 |
| None | 네트워크 접근 없음 | 완전히 격리된 컨테이너 |
| Overlay | 멀티 호스트 네트워킹 | 분산된 컨테이너 시스템 |
포트 매핑 기법
기본 포트 매핑
## 컨테이너 포트 80을 호스트 포트 8080으로 매핑
sudo docker run -p 8080:80 nginx
## 여러 포트 매핑
sudo docker run -p 8080:80 -p 3306:3306 myapp
네트워크 관리 명령어
## Docker 네트워크 목록
sudo docker network ls
## 사용자 정의 네트워크 생성
sudo docker network create mynetwork
## 컨테이너를 네트워크에 연결
sudo docker network connect mynetwork mycontainer
## 네트워크 세부 정보 확인
sudo docker network inspect bridge
고급 네트워킹 시나리오
## 사용자 정의 Bridge 네트워크 생성
sudo docker network create --driver bridge isolated_network
## 사용자 정의 네트워크에서 컨테이너 실행
sudo docker run -d --name web1 --network isolated_network nginx
sudo docker run -d --name web2 --network isolated_network httpd
네트워크 격리 전략
## 외부 네트워크 접근 차단
sudo docker run --network none mycontainer
## 호스트 네트워크 직접 사용
sudo docker run --network host mycontainer
컨테이너 DNS 해결
## 컨테이너 간 자동 DNS 활성화
sudo docker run --name db-container mysql
sudo docker run --name app-container --link db-container:database myapp
Docker 고급 기술
컨테이너 리소스 관리
graph TD
A[리소스 관리] --> B[CPU 제한]
A --> C[메모리 제약]
A --> D[저장소 할당량]
리소스 할당 예제
## 컨테이너를 1개 CPU 코어와 512MB 메모리로 제한
sudo docker run -it --cpus=1 --memory=512m ubuntu /bin/bash
## 메모리 및 스왑 제한 설정
sudo docker run -it --memory=1g --memory-swap=2g ubuntu /bin/bash
Docker Compose 를 이용한 다중 컨테이너 배포
version: "3"
services:
web:
image: nginx
ports:
- "8080:80"
database:
image: postgres
environment:
POSTGRES_PASSWORD: mysecretpassword
보안 권장 사항
| 보안 기법 | 구현 방법 |
|---|---|
| 루트가 아닌 컨테이너 | Dockerfile 에서 USER 지시문 사용 |
| 읽기 전용 파일 시스템 | 볼륨 마운트에 :ro 플래그 추가 |
| 컨테이너 기능 제한 | --cap-drop 및 --cap-add 사용 |
Docker Swarm 을 이용한 컨테이너 오케스트레이션
## Swarm 클러스터 초기화
sudo docker swarm init
## 복제본이 있는 서비스 생성
sudo docker service create --replicas 3 --name web nginx
## 서비스 동적으로 확장
sudo docker service scale web=5
고급 네트워크 구성
## 서브넷이 있는 사용자 정의 네트워크 생성
sudo docker network create \
--driver bridge \
--subnet 192.168.0.0/24 \
--gateway 192.168.0.1 \
custom_network
컨테이너 모니터링 및 로깅
## 실시간 컨테이너 로그
sudo docker logs -f container_name
## 컨테이너 메트릭 검사
sudo docker stats container_name
## 로그 파일 크기 제한
sudo docker run --log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
nginx
Dockerfile 최적화 기법
## 다단계 빌드
FROM maven:3.8.1-openjdk-11 AS build
COPY src /home/app/src
COPY pom.xml /home/app
RUN mvn -f /home/app/pom.xml clean package
FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/app.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
요약
Docker 는 소프트웨어 배포 방식에 혁신을 가져오는 기술로, 가볍고 휴대 가능하며 효율적인 컨테이너화 솔루션을 제공합니다. Docker 의 기본 개념, 아키텍처, 그리고 명령줄 기술을 숙달함으로써 개발자들은 애플리케이션 개발을 간소화하고, 시스템 일관성을 개선하며, 전체 인프라의 확장성과 성능을 향상시킬 수 있습니다.



