| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
- DataStructure
- javascirpt
- javascript 초급
- 제로초
- 하이퍼레저
- hyperledger
- 블록체인
- mysql
- 관계형데이터베이스
- 생활코딩
- 깃
- Nodejs 프로젝트
- 블록몽키
- 블록체인개론
- 자바스크립트
- js
- nodejs
- hyperledger fabric
- al
- Blockmonkey
- 컴퓨터사이언스
- 생활코딩 nodejs
- vs code
- javascript 게임
- SQL
- Javascript
- 컴퓨터공학개론
- 프로그래밍
- 파이썬 알고리즘
- algorithum
- Today
- Total
Blockmonkey
Docker 에 대하여 정리 본문
개요
현대에는 Docker Image & Container를 활용해 애플리케이션을 실행하는 방식을 주로 사용한다. 왜냐하면 Image & Container를 활용하였을 때 환경에 의존성으로 인해 애플리케이션의 동작이 달라지는 경우를 방지하기 위함이다. 예를들어, 내 컴퓨터에서 실행되는 애플리케이션이 다른 팀원의 컴퓨터에서 동작하지 않는 등의 상황을 방지한다.
본 포스팅에서는 Docker에 대한 개념과 사용법에 대해 정리하는 시간을 가진다. 모든 내용에 대해 상세히 다루는 것을 목적으로 하지 않으며 전반적인 리뷰를 작성하고 복습하는 것을 목적으로 한다. 만약 독자가 모르는 내용이 있을 경우 자세한 내용은 Docker & Kubernetes 실전가이드 강좌를 참조하여 해당 파트를 공부하는 것을 추천한다.

Docker ?
응용 프로그램을 프로세스 격리 기술(NameSpace)을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 플랫폼
컨테이너는 커널을 공유하면서도 각 애플리케이션이 독립된 환경에서 실행될 수 있도록 격리하여 애플리케이션간 간섭을 방지하고, 개발 배포 과정을 단순화.
*도커와 가상화 참조
즉, Docker는 환경 의존성 문제를 완화한 컨테이너 기술로 쉘 -> 커널을 통해 여러 컨테이너에 접근/관리할 수 있으나 각 컨테이너는 격리된 공간에서 실행되므로 간섭이 발생할 여지가 없어 효율적.
Docker 의 역사
- Docker는 2013년 3월 Solomon Hykes 가 Python을 사용해 Docker를 개발하고, 같은 해 PyCon 컨퍼런스에서 “The future of Linux Containers” 라는 주제로 최초 공개되었으며 6월 Github에 오픈소스 공개.
- 2013 커뮤니티 사이에서 빠르게 인기를 얻어 급부상 하였으며 14년 Docker Inc. 설립.
- 2014년 Google은 이어서 Kubernetes 1.0을 발표하고
- 2016년 Google은 Kubernetes를 CNCF 재단 (리눅스 재단 프로젝트) 에 기증함.
- 2015 ~ 2017년에는 Docker Swarm(오케스트레이션 툴)과 Docker Compose(멀티 컨테이너 애플리케이션 관리 툴) 등이 출시.
*컨테이너 기술의 역사 참조
Docker의 Image 와 Container
Image
- Docker Image는 프로그램, 실행환경 등을 묶어 두는 일종의 스냅샷 과 같은 파일.
- 이미지는 변경 불가의 특성 (Read-only) 을 가짐.
# -t : 생성할 이미지 명
# . : Dockerfile 경로
docker build -t {image name} .
Dockerfile Example
- Image 생성을 위해 작성하는 정의 파일.
- Image Layer 시스템을 활용해 package.json 내역에 변경점이 없으면, COPY . . 구문 레이어 부터 실행시켜 속도를 크게 향상 시킬 수 있다. (node 에서 npm install 로 dependency 설치 받을 때 날 샌다.)
FROM : node:20-alpine # 환경 이미지
WORKDIR : /app # 작업 디렉토리
COPY ./package.json . # Dependency 관리파일을 ./app 폴더로 복사
RUN npm install # package.json 파일로 Dependency 설치
COPY . . # 애플리케이션 관련 파일을 ./app 폴더로 복사
RUN npm run build # 빌드 명령어
EXPOSE 8080 # 노출 포트
CMD ["npm", "start"] # 실행
Container
Docker Container는 위에서 생성한 Image를 기반으로 인스턴스를 생성한 것.
- Application Container와 Uitility Container로 구분되는데,
- Application Container는 해당 애플리케이션이 실행되는 환경 + 애플리케이션
- Uility Container는 실행 환경만을 실행한 것. (ex : nodejs, golang ..)
- 이미지와 다르게 수정(RW) 이 가능하다.
// --rm : 컨테이너가 실행 종료되면, 바로 삭제하는 옵션
// -d : detach mode로 실행 옵션
// -p : local에 노출할 포트와, container에서 사용하는 포트간 포워딩
docker run --rm -d -p {local port}:{container port} {iamge name}
Docker Volume
Docker Container가 Host와 공유할 수 있는 데이터.
Anonymous Volume
- Container 생성 시 자동 생성, 삭제 시 자동 삭제
- Container 내부 파일을 Host에서 사용할 때 사용 (node_modules..)
docker run -v {ContainerPath} ..
Named Volume
- Container 생성 및 종료와 무관하게 영속적.
- 여러 컨테이너 간 데이터 공유 및 컨테이너 종료/재시작 시 데이터 유지 가능.
docker run -v {Name}:{ContainerPath} ..
Bind Mount Volume
- Host의 파일을 Container 내로 마운트.
- Host에서 파일 변화가 Docker Container 내에서도 발생.
- 로컬에서 직접 지우지 않는 한 데이터 유지.
docker run -v {Local Path}:{ContainerPath} ..
Docker Network (Container 간 통신)
AWS VPC같은 개념으로, Docker Container 간 통신 기능 제공.
Container -> WWW 통신
- 원래 가능하며, 별도의 설정이 필요없음.
Container -> Host Machine 통신
- localhost 대신, host.docker.internal 구문을 활용하여 통신이 가능함.
- 위 구문을 host의 IP주소에 맞추어실행함.
Container <-> Container 통신
- container에 ip 주소를 활용해 통신이 가능.
# ip 주소 확인 명령어
docker inspect {container name}

Docker Env & Arg
Env
- 런타임에 동작하는 환경변수
- Docker file에서 ENV로 사용하기
# ENV with dockerfile
ENV PORT 8080
EXPOSE $PORT
...
- run 명령어에서 옵션으로 사용
# env annotation with docker run.
docker run ... --env PORT=8080 ...
- .env 파일 사용하기
# .env file with docker run.
docker run .. --env-file ./.env
Arg
- 빌드타임에 사용하는 Argument
*빌드 타임에 적용되는 변수로, 당연히 런타임 명령어인 CMD 등 에서 사용이 불가함.
# Docker File ARG Example
...
ARG DEFAULT_PORT=8080
EXPOSE $DEFAULT_PORT
Docker Compose
- YAML 파일에 다양한 프로세스를 패키징을 목적으로 만듦.
- Docker Container 실행시 복잡한 명령어를 패키징하여 compose up, down 명령어로 관리할 수 있도록 함.
- 여러 Container를 편하게 실행 또는 중지할 수 있게 함.
# Docker Compose 사용법
## 컴포즈로 컨테이너 들을 실행 (-d 옵션으로 백그라운드 실행)
docker-compose up
## 컴포즈로 컨테이너 들을 정지 (-v 옵션 사용시 볼륨 삭제)
docker-compose down
## 재빌드할 때, (일반적으로 이미지가 있으면 Dockerfile 수정해도 재빌드하지 않음.)
docker-compose build
## Compose에 정의된 특정 서비스만 실행할 때,
docker-compose run {정의한 서비스 명}
# Docker Compose File Example
version: "3.8" # Compose Version
# 서비스 정의
services:
# DB
mongodb:
image: 'mongo' # 이미지 명
volumes: # 볼륨 정의
- data:/data/db
env_file: # 환경변수 정의 파일
- ./env/.mongo.env
# 백앤드
backend:
build: ./backend # Dockerfile 경로
ports: # Expose Port
- '80:80'
volumes:
- logs:/app/logs # 얘는 NameVolume이므로 하단 정의 필요.
- ./backend:/app # 얘는 익명볼륨
- /app/node_modules # 얘는 바인드 마운트
env_file: # 환경변수
- ./backend/.env
depends_on: # 이 컨테이너는 위 mongodb 컨테이너에 의존.
- mongodb
# 프론트앤드
frontend:
build: ./frontend # Docker file 경로
ports: # Expose Port
- '3000:3000'
volumes: # 익명볼륨
- ./frontend/src:/app/src
stdin_open: true # 인터렉티브모드 -it 랑 같음
tty: true # 인터렉티브모드 -it 랑 같음
# 익명볼륨, 바인드마운트는 여기에 지정하지 말고,
# 이름볼륨만 지정할 것.
volumes:
data:
logs:
결론
이번 포스팅에서는 Docker의 정의, 역사, 주요 개념 및 사용법에 대해 요약해서 알아봤고. Docker는 애플리케이션을 독립된 컨테이너 환경에서 실행하고 관리할 수 있게 해주는 도구로 환경 의존성 문제를 해결하고 일관된 실행 환경을 제공받을 수 있는 툴인 Docker를 잘 활용하여 더 편하게 개발하자.
본 포스팅 시리즈는 아래 주제를 순서대로 포스팅하도록 하겠다.
- 2편 - ECS 배포하기
- 3편 - Kubernetes 에 대하여
- 4편 - EKS 배포하기
Refereneces
- https://ko.wikipedia.org/wiki/%EB%8F%84%EC%BB%A4_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4)
- https://www.udemy.com/course/docker-kubernetes-2022/
- https://www.youtube.com/watch?v=Ps8HDIAyPD0&list=PLuHgQVnccGMDeMJsGq2O-55Ymtx0IdKWf
- https://www.youtube.com/watch?v=zh0OMXg2Kog
- https://sourceflower.tistory.com/61
'Web Development > Back-end' 카테고리의 다른 글
| 동기 비동기 & 직렬 & 동시성에 대하여 (0) | 2025.07.21 |
|---|---|
| ECS 사용기 (3) | 2025.07.21 |
| HTTP VS Socket (0) | 2023.05.01 |
| Nestjs 한눈에 기본 정리 (0) | 2023.05.01 |
| HTTP & HTTPS & SSL 이해하기 (0) | 2023.05.01 |