학습일지

[스나이퍼팩토리] 한컴AI아카데미(26.05.27) Docker

cd-record 2026. 5. 27. 18:59

 

Docker란?

  • 도커(Docker)는 컨테이너 기반의 오픈 소스 플랫폼으로
  • 애플리케이션을 표준화된 환경에서 개발, 배포 및 실행할 수 있도록 지원
  • 애플리케이션과 그 의존성을 함께 패키징하여, 어떤 환경에서도 일관되게 실행될 수 있도록 합니다.

도커의 주요 의미

  1. 컨테이너화: 애플리케이션과 그 실행에 필요한 모든 파일, 라이브러리, 설정을 포함한 컨테이너를 생성합니다.
  2. 이식성: 개발 환경, 테스트 환경, 프로덕션 환경 간에 애플리케이션을 쉽게 이동할 수 있습니다.
  3. 격리성: 각 컨테이너는 독립적으로 실행되므로, 서로의 영향을 주지 않습니다.

도커를 사용하는 이유

  1. 일관된 환경: 개발, 테스트, 배포 환경에서 동일한 설정을 유지하여 "작동하지 않음" 문제를 줄입니다.
  2. 효율적인 자원 사용: 가상 머신(VM)보다 가볍고 빠르며, 시스템 자원을 효율적으로 사용할 수 있습니다.
  3. 배포 자동화: CI/CD(지속적 통합 및 지속적 배포) 파이프라인과 쉽게 통합되어, 자동화된 배포를 지원합니다.
  4. 빠른 개발 주기: 컨테이너를 사용하면 애플리케이션을 빠르게 구축하고 배포할 수 있어 개발 주기가 단축됩니다.
  5. 확장성: 필요에 따라 컨테이너를 쉽게 추가하거나 제거하여 애플리케이션을 확장할 수 있습니다.

 

Docker(Docker desktop) 설치

https://www.docker.com/products/docker-desktop/

 

Docker Desktop: The #1 Containerization Tool for Developers | Docker

Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.

www.docker.com

 

Q. Docker desktop 을 설치한 이유?

1. 운영체제(OS) 간의 장벽 해결

도커는 본래 리눅스 커널 기술을 기반으로 작동합니다. 따라서 Windows나 macOS에서는 도커를 그냥 실행할 수 없습니다.

  • 가상화 자동 설정: Docker Desktop은 Windows의 WSL2(Windows Subsystem for Linux)나 macOS의 경량 가상화 프레임워크를 알아서 설정해 줍니다.
  • 개발자는 복잡한 가상머신(VM) 세팅 신경 쓸 필요 없이, 리눅스 환경과 동일하게 컨테이너를 구동할 수 있습니다.

2. 직관적인 GUI (그래픽 인터페이스) 제공

터미널에서 docker ps, docker rm, docker logs 같은 명령어를 매번 타이핑하지 않아도 됩니다.

  • 시각적 관리: 실행 중인 컨테이너 목록, 이미지, 볼륨(데이터 저장소)을 한눈에 볼 수 있습니다.
  • 클릭 한 번으로 제어: 컨테이너를 끄고 켜거나, 삭제하는 작업을 마우스 클릭으로 해결합니다.
  • 로그 및 터미널 확인: 컨테이너 내부에서 나오는 로그를 실시간으로 모니터링하고, 클릭 한 번으로 컨테이너 내부 터미널(CLI)에 접속할 수 있습니다.

3. 개발 편의 기능 및 생태계 통합

  • Kubernetes(쿠버네티스) 지원: 실제 운영 환경에서 많이 쓰는 쿠버네티스를 복잡한 설정 없이 설정(Settings) 메뉴에서 체크박스 하나만 누르면 로컬에 바로 구축해 줍니다.
  • 대시보드를 통한 자원 관리: 도커가 메모리나 CPU를 얼마나 잡아먹고 있는지 직관적으로 확인하고 제한할 수 있습니다.
  • Docker Marketplace (확장 프로그램): 보안 취약점 점검 디스크 공간 정리 등 다양한 서드파티 툴을 클릭 몇 번으로 추가해 사용할 수 있습니다.

4. 파일 공유 및 네트워킹 최적화

로컬 PC의 소스 코드 폴더를 도커 컨테이너 내부와 동기화(볼륨 마운트)할 때, OS 간의 파일 시스템 차이로 인해 속도 저하나 권한 오류가 자주 발생합니다. Docker Desktop은 이 파일 공유(File Sharing)와 로컬 포트 포워딩 설정을 최적화하여 개발자가 소스 코드를 수정하면 컨테이너에 즉시 반영되도록 돕습니다.

 

Docker 활용

# 버전 확인

docker --version

 

# 테스트용 컨테이너 실행

docker run hello-world
# docker: 도커 프로그램을 호출하는 기본 명령어
# run: 새로운 컨테이너를 생성하고 실행하라는 명령어.(create + start)
# hello-world: 존재하는 '도커 이미지'로, 도커 공식 스타터 팩

# 명령어 쳤을 때 나오는 내부 메커니즘

#로컬 창고 확인 (Unable to find image...):
#도커는 먼저 내 컴퓨터(로컬)에 hello-world라는 이미지가 있는지 찾아봅니다. 처음 실행할 때는 당연히 없으므로 "어? 내 컴퓨터엔 없네?"라는 메시지를 띄웁니다.

#클라우드에서 다운로드 (Pulling from library/hello-world):
#내 컴퓨터에 없으니, 도커는 인터넷 중앙 창고인 Docker Hub(도커 허브)로 달려가서 hello-world 이미지를 자동으로 다운로드(Pull)해 옵니다.

#컨테이너 생성 및 실행:
#다운로드가 완료되면, 그 이미지를 기반으로 독립된 방인 '컨테이너'를 만들고 그 안에 있는 프로그램을 실행합니다.

#결과 화면 출력 (Hello from Docker!):
#컨테이너 안의 프로그램이 실행되면서 "안녕! 이 메시지가 보이면 도커가 잘 설치된 거야!"라는 환영 문구를 내 화면에 보여주고, 자기 할 일을 다 마친 컨테이너는 자동으로 종료됩니다.

 

# image 명령어

#image 확인
docker images

#image 삭제
docker rmi <이미지명>

## 이미지 만들기

#web 폴더 만들어서 거기에 Dockerfile파일 생성
mkdir web
notepad Dockerfile
# nano Dockerfile(리눅스에서)
----------------------------------------
#Nginx 공식 Stable 이미지 사용
From nginx:stable

#웹 서버 표준 포트 개방
EXPOSE 80

#Nginx 웹 서버를 포어그라운드로 실행 유지
CMD["nginx","-g","daemon off;"]
----------------------------------------

# 빌드(이미지 생성)
docker build -t my_nginx .

 

# 컨테이너 명령어

#현재 돌고있는 서비스(컨테이너 목록)
docker ps

#서비스 과거 이력(모든 컨테이너 목록)
docker ps -a

#컨테이너 삭제
docker rm <컨테이너명 | 컨테이너ID>

#컨테이너 서비스 시작
docker start <컨테이너명 | 컨테이너ID>

#컨테이너 서비스 중지
docker stop <컨테이너명 | 컨테이너ID>

#실시간 리소스 사용량
docker stats <컨테이너>

#실행중인 컨테이너 프로세스 표시
docker top <컨테이너>

 

## 이미지를 컨테이너 실행

docker run --name webserver1 -p 8001:80 -d nginx:stable
# -d: 백그라운드에서도 계속 실행
# -p: 포트포워딩(브라우저에서 8001으로 실행하면 도커내부에서 80으로 실행)
# --name: 컨테이너 이름

 

** 특정 포트 찾기

netstat -ano | findstr 8001 (윈도우에서)

ss -tulpn | grep 8001 (리눅스에서)

 

##  해당 컨테이너 내부 경로 확인

# 해당 컨테이너 안에 사전에 있던 경로에 index.html 밀어넣기
docker cp index.html webserver1:/usr/share/nginx/html/index.html

# 컨테이너 내부 경로확인
# 방법 1. 컨테이너 내부로 직접 들어가서 확인하기
docker exec -it webserver1 bash

# 방법 2. 컨테이너 밖에서 명령만 내려서 확인하기
# 특정 경로에 어떤 파일들이 있는지 목록 조회
docker exec webserver1 ls -la /usr/share/nginx/html

# 특정 파일의 내용(코드)을 화면에 출력
docker exec webserver1 cat /usr/share/nginx/html/index.html

# OS종류 확인
cat /etc/os-release

 

## 테스트(Nginx)

# 1. nginx 이미지 파일 가져오기(docker hub에서)
docker pull nginx:stable

# 2. nginx 이미지 만들기

#web 폴더 만들어서 거기에 Dockerfile파일 생성
mkdir web
notepad Dockerfile

nano Dockerfile(리눅스에서)
----------------------------------------
#Nginx 공식 Stable 이미지 사용
From nginx:stable

#웹 서버 표준 포트 개방
EXPOSE 80

#Nginx 웹 서버를 포어그라운드로 실행 유지
CMD["nginx","-g","daemon off;"]
----------------------------------------

# 빌드하기
docker build -t my_nginx .

# 이미지를 컨테이너 실행
docker run --name webserver1 -p 8001:80 -d nginx:stable
docker run --name webserver1 -p 8001:80 -d my_nginx

# 해당 경로에 아래 내용이 담긴 index.html파일 생성( 경로 예: C://hancom_5/docker/config )
echo "<h1>Hello from Docker Volume Mount!</h1>" > ~/html/index.html

# config라는 폴더 만든 후 default.conf 생성
# default.conf에 아래 내용 작성
server {
    listen       80; 
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

# 컨테이너 실행
# 리눅스에서 줄바꿈은 \, 파워쉘에서는 `(백틱)
# 파워쉘에서는 . 또는 ${pwd}로 절대경로로 써야함
docker run --name webserver2 `
  -p 8002:80 `
  -v ${pwd}/html:/usr/share/nginx/html `
  -v ${pwd}/config/default.conf:/etc/nginx/conf.d/default.conf `
  -d nginx:stable

 

## 테스트(python)

# flask 폴더 안에 app.py, requirement.txt, Dockerfile 생성

# app.py
from flask import Flask

app = Flask(name)

@app.route('/')
def home():
    return "Hello, World! Welcome to my Python app. (from hancom)"

if name == 'main':
    app.run(host='0.0.0.0', port=5000)
    
# requirements.txt
flask, request

# Dockerfile
--------------------------------
# 베이스 이미지 설정
FROM python:3.12-slim

# 작업 디렉토리 설정
WORKDIR /app

# requirements.txt 복사 및 패키지 설치
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 애플리케이션 코드 복사
# COPY app.py .
COPY . .

# 컨테이너가 실행할 명령
CMD ["python", "app.py"]
--------------------------------

# 빌드하기
docker build -t my-python-app .

# container 연결
docker run -d --name my_python_app -p 5005:5000 my-python-app

 

볼륨 마운트(Volume Mount)

격리된 도커 컨테이너와 내 실제 컴퓨터(호스트)의 폴더를 실시간으로 연결(링크)하는 기술

 

볼륨 마운트 사용하는 이유

 

  • 데이터 영속성 보장: 컨테이너의 생명 주기와 상관없이 중요한 데이터(DB, 로그 등)를 안전하게 보관합니다.
  • 개발 생산성 향상: 소스 코드를 수정할 때마다 매번 도커 이미지를 다시 빌드(docker build)할 필요 없이, 호스트에서 코드를 수정하면 컨테이너에 즉시 실시간 반영됩니다.
  • 컨테이너 경량화: 대용량 파일이나 가변 데이터를 이미지 자체에 포함하지 않고 외부에서 연결하므로 이미지 용량이 대폭 줄어듭니다.

핵심 마운트 방식 2가지 비교

분류 1️⃣ 바인드 마운트 (Bind Mount) 2️⃣ 도커 볼륨 (Named Volume)
개념 호스트 컴퓨터의 특정 절대 경로를 컨테이너 내부와 직속으로 연결 도커가 자체적으로 관리하는 **안전한 저장 공간(비밀 창고)**을 생성하여 연결
주요 용도 소스 코드 실시간 동기화 (웹 개발 등) 데이터베이스 데이터 보관 (MySQL, SQLite 등)
특징 호스트의 파일 변경이 컨테이너에 즉시 반영됨 데이터가 도커 전용 영역에 저장되어 안전하고 관리가 편함
명령어 예시 -v ${PWD}/app:/app -v db_data:/var/lib/sqlite

 

 

명령어

docker run -d --name webserver1 -p 8080:80 -v ./flask2:/app my-python-app
# -v 볼륨 마운트(바인드 마운트)
# 컨테이너 내부의 /app 폴더와 실시간으로 내 컴퓨터의 flask2 폴더와 링크(동기화)
# 즉, 덮어쓰기 개념이 아니라 app 폴더 내 파일을 실행하는 대신 flask2 폴더 내의 파일들 실행

 

 

 

 

 

 

 

——————————————————————————

본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.