1. 보안 개념: Stateful vs Stateless
-
Stateful (상태 저장)
- 연결 상태(세션)를 기억함
- Inbound 규칙만 허용하면 Outbound는 자동으로 허용됨
- 예시: AWS Security Group, NCP ACG
-
Stateless (상태 비저장)
- 세션 정보를 저장하지 않음
- Inbound와 Outbound 규칙을 각각 따로 명시해야 함
- 예시: Network ACL(NACL)
-
실습 환경
- Default NACL(Stateless)을 그대로 사용하고,
- ACG(Stateful)를 설정하여 서버 접근 제어(SSH 22, HTTP 80 등)를 관리
2. Docker 명령어 기초
-
이미지 관리
docker pull [이미지명]: 이미지 다운로드docker images: 이미지 목록 확인docker rmi [이미지명]: 이미지 삭제docker build -t [이름:태그] .: Dockerfile을 이용해 이미지 빌드
-
컨테이너 관리
docker run -d --name [이름] -p [호스트포트:컨테이너포트] [이미지]: 컨테이너 생성 및 백그라운드 실행docker ps/docker ps -a: 실행 중/전체 컨테이너 목록 확인docker stop,docker start,docker restart: 컨테이너 제어docker rm: 컨테이너 삭제docker logs: 로그 확인docker exec -it [이름] /bin/bash: 실행 중인 컨테이너 내부 셸 접속docker cp: 호스트와 컨테이너 간 파일 복사
3. Docker 실습 환경
-
Play with Docker(PWD)
- 웹 기반의 무료 Docker 실습 환경
-
Ubuntu 환경 구축
- Ubuntu 22.04 VM에 Docker Engine 설치
- 패키지 업데이트 및 필수 의존성 설치 (
apt-get) - Docker 공식 GPG 키 추가 및 저장소 설정
- Docker Engine, CLI, Compose 플러그인 설치
4. Nginx 웹 서버 실습
-
기본 실행
docker run을 통해 Nginx 배포 및 포트 포워딩(8000:80) 테스트
-
커스텀 이미지 빌드
index.html파일을 수정하여 나만의 웹페이지 생성Dockerfile작성:FROM(베이스 이미지),COPY(파일 복사),EXPOSE(포트 명시),CMD(실행 명령어)- 이미지 빌드 후 실행하여 변경된 웹페이지 확인
5. MySQL 데이터베이스 실습
-
기본 실행
MYSQL_ROOT_PASSWORD환경 변수를 설정하여 실행
-
설정 커스터마이징
- 외부 접속 허용을 위해 설정 파일(
mysqld.cnf)의bind-address수정 - 초기화 스크립트(
init.sql)를/docker-entrypoint-initdb.d/에 복사하여 컨테이너 실행 시 DB 및 사용자 자동 생성 - 이를 자동화하는
Dockerfile작성 및 빌드
- 외부 접속 허용을 위해 설정 파일(
6. Portainer (Docker GUI 도구)
- 개요: Docker 및 Kubernetes 환경을 웹 GUI로 관리하는 도구
- 설치: Docker 소켓(
/var/run/docker.sock)을 볼륨으로 마운트하여 컨테이너로 실행 - 기능: 웹 브라우저(9000번 포트)를 통해 컨테이너, 이미지, 네트워크, 볼륨 등을 시각적으로 관리 및 배포 가능
7. Docker Registry 및 이미지 백업
-
Docker Hub
docker login: 계정 로그인docker tag: 이미지에 사용자 ID 태그 추가docker push: Hub로 이미지 업로드
-
이미지 백업/복원
docker save: 이미지를 tar 파일로 추출docker load: tar 파일에서 이미지 복원
-
Private Registry 구축
- 로컬 환경에 사설 레지스트리 컨테이너(registry) 실행 (5000번 포트)
daemon.json에insecure-registries설정 필요- 사설 레지스트리를 통한 이미지 Push/Pull 실습
8. Load Balancer (Nginx) & Docker Compose
-
Docker Compose
- 여러 컨테이너의 설정(이미지, 네트워크, 볼륨 등)을
docker-compose.yml파일 하나로 정의하고 관리
- 여러 컨테이너의 설정(이미지, 네트워크, 볼륨 등)을
-
로드 밸런싱 실습
- 3개의 웹 서버 컨테이너(Server 1, 2, 3) 생성
- 1개의 Nginx 로드 밸런서 컨테이너 생성
- Nginx 설정(
nginx.conf)의upstream기능을 이용해 요청을 3개의 서버로 분산
9. 미니 프로젝트: 3-Tier Architecture
-
구조
- Frontend (Nginx) ←> Backend (Flask) ←> Database (SQLite/Volume)
-
구성 요소
- Frontend: HTML/JS 및 Nginx 설정(Reverse Proxy).
/api요청을 백엔드로 전달 - Backend: Python Flask 앱. DB에 데이터를 저장(POST)하거나 조회(GET)하는 API 제공
- Database: SQLite 파일 사용 (볼륨을 통해 데이터 영속성 보장)
- Frontend: HTML/JS 및 Nginx 설정(Reverse Proxy).
-
실행
docker-compose up -d --build명령어로 전체 스택을 한 번에 배포 및 연동 확인
10. Docker Swarm (오케스트레이션)
-
개요
- 여러 Docker 호스트를 클러스터로 묶어 관리하는 컨테이너 오케스트레이션 도구
-
구성
- Manager Node(관리)와 Worker Node(작업)로 구성
-
주요 명령어
docker swarm init: 스웜 클러스터 초기화 (Manager)docker swarm join: 워커 노드를 클러스터에 합류docker node ls: 노드 상태 확인
-
서비스 배포
docker service create: 스웜 서비스 생성--replicas: 컨테이너(Task) 복제본 수 설정 (Scale Out)docker service scale: 운영 중 서비스의 복제본 수 조절
-
특징
- 여러 노드에 컨테이너가 분산 배포되며,
- 어느 노드로 접근하더라도 로드 밸런싱되어 서비스에 연결됨(Routing Mesh)