티스토리 뷰

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로 환경 변수 주입

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
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
글 보관함