티스토리 뷰
1. 환경 차이로 생기는 오류를 방지하기 위해
- 어떤 운영체제든 동일한 환경에서 실행됨
- 예: 윈도우에서 잘 되던 코드가 리눅스 배포서버에서는 오류나는 경우
- 어떻게? Docker는 컨테이너 안에 리눅스 기반 OS계층을 포함하고 있어서, 리눅스 환경을 가상화 한다.
=> 어떤 OS를 사용하던, 컨테이너 안에선 동일한 리눅스 환경이 보장된다.
- 그럼 windows에서 작성한 Docker 이미지가 리눅스 서버에서 100% 똑같이 동작할까?
=> 대부분의 경우 동일하게 동작하지만, 만약 윈도우 전용 경로(/, \)나 한글 인코딩을 사용하는 경우 문제가 발생할 수 있다
=> Docker에서는 가능한 리눅스 기반 이미지를 사용하고, 환경 독립적인 코드 작성이 중요하다
2. 배포가 편하다
- 직접 서버에 적속해서 설치, 환경설정을 하지 않고도 배포 가능
- docker run 한줄로 실행 가능 또는, docker-compose up으로 여러 컨테이너를 한번에 실행이 가능
- 개발 → 테스트 → 운영 배포가 쉬워짐
1) Dockerfile: 컨테이너 이미지 빌드용 스크립트(앱 환경을 정의)
2) docker-compose.yml: 여러 컨테이너실행과 연결을 정의(서비스 오케스트레이션)
3) docker-compose로 네트워크, 볼륨, 환경변수 등도 설정 가능
3. 가볍고 빠르다
- 실행 속도가 빠르고 리소스도 적게 사용한다.
- VM보다 가볍고, OS전체가 아니라 앱만 격리된다.
* VM은 하이퍼바이저 위에서 OS전체를 실행하지만, Docker는 호스트 OS의 커널을 공유하고 앱만 격리해서 docker가 더 가볍고 부팅도 빠르다.
** 윈도우에서는 WSL2(Windows Subsystem for Linux 2)가 리눅스 커널을 직접 실행해줘 Docker Desktop이 Linux 컨테이너를 실행 가능하게 해준다.
4. 버전관리가 쉽다
- 특정 버전의 python, mysql등 정확히 명시가 가능하다
- 예: FROM python:3.10, requirements.txt와 함께 사용해 의존성까지 고정 가능
5. 이미지 사이즈 최적화 : multi-stage build
Docker 이미지가 커지면, 불필요한 파일을 삭제하거나 최종 이미지를 슬림하게 유지한다. 또는 슬림베이스 이미지 사용
=> multi-stage build: 예시로, node.js앱의 경우, node이미지로 의존성 설치 및 빌드를 하고 nginx같은 가벼운 이미지로 빌드된 결과만을 복사해 불필요한 빌드 도구가 빠져 이미지가 작아진다.
# 1단계: 빌드
FROM node:20 as build
WORKDIR /app
COPY . .
RUN npm install && npm run build
# 2단계: nginx로 배포
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
# 이렇게하면 Node 설치나 node_modules는 최종 이미지에 없어 가볍고 안전하다
6. 확장성과 유연성
- 여러 서비스를 분리된 컨테이너로 구성이 가능하다(예: 백엔드, DB, 프론트 따로 컨테이너로 구성해 docker-compose로 네트워크를 연결하고, 의존성 제어 가능)
- Docker Compose를 쓰면 같은 네트워크 안에서묶여서 서비스 이름으로 통신이 가능하다.
- Docker-compose를 왜 쓸까? CLI로도 가능하지만, 명령어가 길고 복잡해진다. 또한 compose를 사용하면 실행 설정을 명확하게 기록하고 버전 관리를 할 수 있어 팀 작업에 유리하다.
- docker-compose 기본 설정으로 bridge 네트워크를 자동 생성해 같은 compose 파일에 있으면 서비스 이름으로 DNS 해석이 가능하다.
6. Dockerfile 주요 명령어
- FROM: 베이스 이미지 지정 (예: FROM python:3.10-slim)
- COPY: 로컬 파일을 이미지에 복사(예:COPY . /app)
- RUN: 이미지 빌드 중 명령 실행(예: 패키지 설치 RUN pip install -r requirements.txt)
- CMD: 컨테이너가 실행될 때 기본으로 실행할 명령 지정(예: CMD ["python","main.py"]
- docker build -t myapp . : 현재 디렉톨리의 dockerfile로 이미지 빌드
- docker run -p 8000:8000 myapp : 컨테이너 실행 및 포트 매핑
- docker exec -it mycontainer bash : 실행 중인 컨테이너에 접속
- docker logs mycontainer : 로그 확인
- docker stop mycontainer : 컨테이너 중지
- docker rm mycontainer : 컨테이너 삭제
- docker image prune: 사용하지 않는 이미지 정리
7. docker-comose 주요 요소
version: "3"
services:
backend:
build: .
ports:
- "8000:8000"
depends_on:
- db
env_file:
- .env
db:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=${DB_PASSWORD}
volumes:
- dbdata:/var/lib/mysql
volumes:
dbdata:
- services: 실행할 서비스 목록(컨테이너)
- build: Dockerfile 기준으로 이미지 빌드
- ports: 호스트:컨테이너 포트 연결
- depends_on: 실행 순서 지정
- volumes: 데이터 유지
- env_file: .env로 환경 변수 주입
'AI > AI 서비스 개발' 카테고리의 다른 글
[AI 서비스 개발] Wav2Vec, SpeechBrain (0) | 2025.04.22 |
---|---|
[AI 서비스 개발] 프로프트 엔지니어링, RAG (0) | 2025.04.22 |
[AI 서비스 개발] 리눅스에 미니포지 설치하기 (0) | 2025.03.28 |
[AI 서비스 개발] AI 여행플래너 서비스 프로젝트 관련 용어 복기 (0) | 2025.03.18 |
[AI 서비스 개발] 크롤링 방지 기법, 크롤링 정책 (0) | 2025.03.17 |
- Total
- Today
- Yesterday
- 뉴스
- IH
- 오블완
- 미라클모닝
- 실기
- 습관
- SQL
- 고득점 Kit
- Python
- 경제
- 루틴
- Ai
- 아침운동
- 아침
- 빅데이터 분석기사
- 스크랩
- 30분
- llm
- 다이어트
- 기초
- 갓생
- 프로그래머스
- 오픽
- 영어회화
- 줄넘기
- C언어
- 운동
- ChatGPT
- opic
- 티스토리챌린지
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |