Docker란?
- 도커(Docker)는 컨테이너 기반의 오픈 소스 플랫폼으로
- 애플리케이션을 표준화된 환경에서 개발, 배포 및 실행할 수 있도록 지원
- 애플리케이션과 그 의존성을 함께 패키징하여, 어떤 환경에서도 일관되게 실행될 수 있도록 합니다.
도커의 주요 의미
- 컨테이너화: 애플리케이션과 그 실행에 필요한 모든 파일, 라이브러리, 설정을 포함한 컨테이너를 생성합니다.
- 이식성: 개발 환경, 테스트 환경, 프로덕션 환경 간에 애플리케이션을 쉽게 이동할 수 있습니다.
- 격리성: 각 컨테이너는 독립적으로 실행되므로, 서로의 영향을 주지 않습니다.
도커를 사용하는 이유
- 일관된 환경: 개발, 테스트, 배포 환경에서 동일한 설정을 유지하여 "작동하지 않음" 문제를 줄입니다.
- 효율적인 자원 사용: 가상 머신(VM)보다 가볍고 빠르며, 시스템 자원을 효율적으로 사용할 수 있습니다.
- 배포 자동화: CI/CD(지속적 통합 및 지속적 배포) 파이프라인과 쉽게 통합되어, 자동화된 배포를 지원합니다.
- 빠른 개발 주기: 컨테이너를 사용하면 애플리케이션을 빠르게 구축하고 배포할 수 있어 개발 주기가 단축됩니다.
- 확장성: 필요에 따라 컨테이너를 쉽게 추가하거나 제거하여 애플리케이션을 확장할 수 있습니다.
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) 리뷰로 작성 되었습니다.
'학습일지' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴AI아카데미(26.05.29) Docker compose (0) | 2026.05.29 |
|---|---|
| [스나이퍼팩토리] 한컴AI아카데미(26.05.28) Docker Hub (0) | 2026.05.28 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.22) GitHub (0) | 2026.05.23 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.21) Git (0) | 2026.05.21 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.18) (0) | 2026.05.18 |