DockerFile, Docker Compose를 사용하는 이유

디하·2024년 6월 20일
1

배포

목록 보기
8/8
post-thumbnail

DockerFile


DockerFile
- DockerFile은 Docker 컨테이너 이미지를 생성하기 위해 필요한 명령어와 지침을 담고 있는 텍스트 파일
- Dockerfile을 사용하여 특정 애플리케이션을 실행하는 데 필요한 환경을 정의하고, 그 정의를 기반으로 이미지를 빌드

DockerFile 을 사용하는 이유?

  1. 일관된 환경 구축
    개발, 테스트, 배포 환경이 일관되게 유지
    모든 설정과 종속성을 명확히 정의하여 어디서나 동일한 환경에서 애플리케이션을 실행할 수 있다

  2. 자동화된 배포
    빌드 및 배포 과정을 자동화
    CI/CD 파이프라인에 통합하여 코드 변경 시마다 자동으로 이미지를 빌드하고 배포

  3. 버전 관리
    소스 코드와 함께 버전 관리가 가능
    특정 버전의 애플리케이션에 맞는 환경을 쉽게 재현

  4. Portability (이식성) :

    어플리케이션이 하나의 플랫폼에서 다른 플랫폼으로 옮기는 것이 용이한 것

Docker 이미지는 운영체제에 관계없이 동일하게 작동
Dockerfile을 통해 작성된 이미지는 다양한 플랫폼과 클라우드 서비스에서
이식성 있게 배포


명령어
- FROM: 베이스 이미지를 선택
- MAINTAINER: 이미지를 만든 사람의 정보를 입력
- RUN: 이미지에 명령을 실행하여 파일을 추가하거나 삭제
- COPY: 파일을 이미지에 복사
- EXPOSE: 컨테이너가 노출할 포트를 설정
- CMD: 컨테이너가 실행될 때 실행할 명령을 설정

Docker 이미지 생성 -> Docker CLI를 사용하여 실행

docker buildx build -t my-nginx:latest .
docker build -t my-nginx:latest . # 위 명령이 실행되지 않는 경우 실행
  • 현재 디렉토리에서 Dockerfile 기반으로 my-nginx:latest docker image를 생성

Docker 이미지 Docker CLI를 사용하여 컨테이너로 실행

docker run -d -p 80:80 my-nginx:latest
  • my-nginx:latest 이미지를 기반으로 컨테이너를 실행
  • 80번 포트를 호스트 머신의 80번 포트로 맵핑

Docker CLI를 사용하여 종료하거나 업데이트

docker stop my-nginx

-> Docker 이미지는 Docker 레지스트리를 사용하여 다른 사용자와 공유 가능
Docker 레지스트리를 사용하면 Docker 이미지를 저장하고 공유할 수 있고, 다른 사용자가 이미지를 다운로드하여 사용할 수 있다


  • Dockerfile 명령어
    • FROM: 베이스 이미지를 지정
      • ex) FROM ubuntu:22.04
    • MAINTAINER: Dockerfile을 작성한 사람의 정보를 입력
      • ex) MAINTAINER naebaecaem <nbcamp@spartacoding.co>
    • LABEL: 이미지에 메타데이터를 추가
      • ex) LABEL purpose='nginx test'
    • RUN: 이미지를 생성하는 동안 실행할 명령어를 입력
      • 사용자를 지정하지 않은 상태라면, root 로 실행
      • ex) RUN apt update && apt upgrade -y && apt autoremove && apt autoclean
      • ex) RUN apt install openjdk-21-jdk
    • CMD: 컨테이너를 생성할 때, 실행할 명령어를 입력
      • 컨테이너를 생성할 때만 실행
      • 추가적인 명령어에 따라 설정한 해당 명령어 수정 가능
      • ex) CMD ["nginx", "-g", "daemon off;"]
    • ENTRYPOINT: 컨테이너 시작할 때, 실행할 명령어를 입력
      • 컨테이너를 시작할 때마다 실행
      • 추가적인 명령어 존재 여부와 상관 없이 무조건 실행
      • ex) ENTRYPOINT ["npm", "start"]
    • ENV: 환경 변수를 설정
      • 이미지 안에 각종 환경 변수를 지정
      • ex) ENV STAGE staging
      • ex) ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
    • WORKDIR: 작업 디렉터리를 지정
      • ex) WORKDIR /app
    • COPY: 파일을 복사
      • 호스트의 파일이나 디렉토리를 이미지 안에 복사
      • Docker Context, 즉, 빌드 작업 디렉토리 내 파일만 복사 가능
      • ex) COPY index.html /usr/share/nginx/html
    • USER: 사용자를 설정
      • Container의 기본 사용자는 root 에요. root 권한이 필요 없는 application이라면 다른 사용자로 변경하여 사용해야 해요.
        RUN ["useradd", "user"]
        USER user
        RUN ["/bin/bash, "-c", "ls"]
    • EXPOSE: 컨테이너에서 노출할 포트를 지정
      • ex) EXPOSE 80
      • ex) EXPOSE 443

Docker Compose 를 사용하는 이유는?

  • 편하게 설정하기: Docker Compose는 여러 컨테이너를 한 파일에 적어서 설정할 수 있음
    이 파일에는 컨테이너가 무슨 이미지를 쓸지, 어떤 포트를 사용할지, 환경 변수는 뭐가 필요한지 등을 적어둔다
    이렇게 하면 여러 컨테이너를 한 번에 쉽게 설정할 수 있기 때문이다

  • 자동으로 배포하기: 설정 파일이 있으면, Docker Compose가 알아서 컨테이너들을 만들어 주고 실행해 줌
    개발자가 일일이 명령어를 입력할 필요가 없다

  • 의존성 관리: 컨테이너들이 서로 의존하는 관계가 있으면, Docker Compose가 이를 관리
    예를 들어, A 컨테이너가 B 컨테이너를 필요로 하면, A를 먼저 켜고 나서 B를 실행하는 식

  • 모니터링과 로깅: Docker Compose는 컨테이너들이 어떻게 돌아가는지 지켜보고, 로그도 모아줌
    이렇게 하면 문제가 생겼을 때 빨리 찾아서 고칠 수 있다

    = 확장성: 여러 컨테이너를 하나의 그룹으로 관리할 이게 좋은 이유는, 예를 들어 웹 앱을 만드는 여러 컨테이너를 한꺼번에 관리하고 확장하기 쉽기 때문

  • 유연성: Docker Compose는 개발 환경, 테스트 환경, 실제 운영 환경에서도 같은 설정 파일을 써서 일관성을 유지

  • 보안 강화: 컨테이너들의 네트워크를 분리해서 외부로부터의 접근을 제한

  • 유지보수가 쉬움: 설정 파일 하나로 컨테이너들을 관리-> 뭔가 바꿀 일이 있으면 파일만 수정하면 된다그러면 Docker Compose가 알아서 변경사항을 적용

Docker Compose 의 장점

  1. 한 번에 여러 컨테이너 설정하기
  • Docker Compose는 여러 컨테이너의 설정을 하나의 YAML 파일에 넣어서 관리
    이 파일 하나로 여러 컨테이너의 모든 환경을 설정하고, 그걸로 여러 컨테이너를 한 번에 실행
  1. 빠른 서비스 실행:
    • 설정 값들을 저장해 두고 다시 쓸수 있음
      만약 설정이 바뀌지 않았다면, Docker Compose는 이전에 저장해둔 정보를 다시 사용해서 서비스를 더 빨리 시작 가능
  2. 같은 네트워크에서 쉽게 연결:
    • docker-compose.yaml 파일에 있는 애플리케이션들은 모두 같은 네트워크에 자동으로 연결
      이렇게 하면 복잡한 네트워크 설정 없이도 여러 컨테이너가 서로 쉽게 통신 가능


    Docker Compose 실행하기

    1. 각 애플리케이션의 Dockerfile 작성하기

      • 보통 내가 만든 애플리케이션을 실행하기 위한 Dockerfile 만 작성
    2. docker-compose.yaml 파일 작성하기

      • 내가 만든 애플리케이션을 실행하기 위해 필요한 database라든지 redis라든지 다른 서비스들을 한꺼번에 정의하는 파일을 작성
    3. docker compose up 으로 실행하기

      YAML 파일은 컴퓨터가 읽을 수 있는 설정 파일

profile
🖥️ ⌨️🖱️🩵

0개의 댓글

관련 채용 정보