본문 바로가기

Minding's Programming/Knowledge

[Docker] Docker의 개념 및 기본 실행 명령어

728x90
반응형

Docker

 

Docker는 애플리케이션을 컨테이너라는 독립된 환경에서 실행할 수 있게 해주는 Linux 컨테이너 기반 플랫폼이다. 애플리케이션과 관련된 라이브러리와 종속성을 하나의 패키지로 묶어 어디서든 일관된 환경에서 실행되도록 해준다.

 

이전에는 하나의 PC(또는 서버)에 가상화(Virtual Machine)를 통해 여러 개의 애플리케이션을 실행시키는 방법이 많이 사용됐다. 하지만 최근에는 Docker를 통해 각 컨테이너 별로 애플리케이션을 실행시키는 방식이 많이 도입되고 있다. 하나의 하드웨어에서 여러 개의 소프트웨어를 실행시킨다는 기본적인 개념은 같지만, Docker를 쓰기 시작한 데에는 많은 이유가 있다.

 

특징 가상 머신(VM) Docker 컨테이너
운영체제 각 VM마다 별도의 게스트 OS 필요 호스트 OS의 커널 공유
시작 속도 느림 빠름
자원 사용 게스트 OS 포함으로 인해 무겁고 비효율적 경량화되어 효율적
격리 수준 높은 수준의 격리 제공 프로세스 수준의 격리 제공

 

 

위 그림과 표에서도 볼 수 있듯 가상화의 경우 각 VM마다 OS가 포함되어 있기 때문에 매우 무거워진다는 단점이 있다. 따라서 Size도 커지고, 부팅 속도도 느려진다. 하지만 컨테이너의 경우 호스트 OS 커널을 각 컨테이너에 공유하는 방식이기 때문에, 비교적 Size가 가볍고 부팅 속도도 빠르다.

 

이런 장점이 있기 때문에 Docker는 클라우드 환경에서 대규모 서버 관리, 애플리케이션 배포에 널리 사용되고 있다.

 

Docker의 구성 요소

  • Docker Engine: 컨테이너를 생성하고 관리하는 핵심 요소, Docker Daemon과 클라이언트로 구성됨.
  • Docker Image: 컨테이너를 실행하기 위한 읽기 전용 템플릿, 이는 Dockerfile이라는 파일에 정의된 명령어들로부터 생성됨. 컨테이너의 목적에 맞는 바이너리와 의존성이 설치되어 있고, 여러 개의 계층으로 된 바이너리 파일로 존재함.
  • Docker Container: Docker Image를 실행한 상태로, 격리된 시스템 자원 및 네트워크를 사용하는 독립된 공간
  • Registry: Docker 이미지를 저장하고 공유할 수 있는 저장소

Docker는 Image로 컨테이너를 생성하고 실행시킨다는게 제일 큰 특징이라고 할 수 있다.

 

Docker 설치

 

Docker 설치는 아래 공식 홈페이지의 순서에 따라 진행하면 된다. (Ubuntu 기준)

https://docs.docker.com/engine/install/ubuntu/

 

Ubuntu

Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.

docs.docker.com

 

만약 Windows 환경이라면, WSL2를 설치해 Ubuntu 환경을 먼저 세팅한 다음에 Docker 설치를 진행해야 한다.

Windows 환경에서 Linux 사용을 위한 WSL2 설치 (이 링크 참고)

 

Mac의 경우 터미널에 아래 명령어를 통해 설치한다.

brew install --cask docker

 

Docker의 실행 흐름

출처: Vikas Rajput Linkedin

 

Docker의 전체적인 실행 흐름은 위 이미지와 같다. Dockerhub 등에서 이미 만들어진 Image를 가져올 수도 있고, 특정 이미지를 dockerfile에서 build 명령어를 통해 자신이 생성할 수도 있다. 이미지는 pull 또는 push 명령을 통해 docker registry에서 가져오거나 저장시킬 수 있고, run 명령어를 통해 컨테이너를 실행시킬 수 있다.

 

Docker와 Port forwarding

 

Docker 컨테이너는 기본적으로 외부 네트워크와 격리된 상태다. 따라서, 외부에서 컨테이너 내부 서비스에 접근할 수 있도록 하기 위해서는 '포트 포워딩'이라는 과정이 필요하다.

 

포트 포워딩은 네트워크에서 특정 포트로 들어오는 트래픽을 다른 포트로 전달하는 것을 의미한다. Docker에서는 호스트의 특정 포트를 컨테이너의 포트에 매핑해 외부에서 컨테이너 내부의 애플리케이션에 접근할 수 있다.

출처: https://iximiuz.com/en/posts/docker-publish-container-ports/

 

위 이미지처럼 호스트와 서버가 동일할 경우 컨테이너(서버)에 80번 포트가 열려있다면, 호스트에서도 80번 포트로 접속하면 된다. 그러나 Docker 컨테이너의 경우 완전히 격리된 상황이므로 포트 포워딩으로 호스트의 8080포트를 컨테이너의 80번 포트로 연결한다면, 호스트의 8080포트에서도 접근할 수 있게된다. (꼭 8080포트를 쓰지는 않아도 된다.)

 

Docker의 주요 명령어

  • container 생성 및 실행 관련명령어
    • container 생성 및 실행: run
    • container 중지 : stop
    • container 실행 : start
    • conatiner 재실행 : restart
  • container 관리 관련 명령어
    • container 확인 : ps
    • container 삭제 : rm
  • container 실행 관리 관련명령어
    • container log 확인 : logs
    • container에 명령어 수행: exec
  • image 관리 관련명령어
    • image 확인: images
    • image 삭제: rmi
    • image 다운로드하기: pull
    • image 업로드하기: push
    • image 태그지정하기: tag

 

Dockerfile

 

Dockerfile은 아래의 명령어들로 구성된다. 이 Dockerfile을 통해 Image를 생성한다.

명령어 설명
FROM 베이스 이미지를 지정합니다. Dockerfile은 반드시 FROM 명령어로 시작해야 합니다.
RUN 새로운 이미지 레이어에서 명령을 실행합니다. 주로 패키지 설치나 설정에 사용됩니다.
CMD 컨테이너 실행 시 기본으로 실행할 명령을 지정합니다. 여러 개의 CMD가 있을 경우, 마지막 CMD만 적용됩니다.
LABEL 이미지에 메타데이터를 추가합니다.
EXPOSE 컨테이너가 수신할 포트를 명시합니다. 이는 문서화 목적이며 실제 포트 개방은 아닙니다.
ENV 환경 변수를 설정합니다.
ADD 파일 또는 디렉토리를 이미지에 추가합니다. URL에서 파일을 다운로드할 수도 있습니다.
COPY 로컬 파일 또는 디렉토리를 이미지에 복사합니다. ADD보다 단순한 기능을 제공합니다.
ENTRYPOINT 컨테이너의 기본 실행 파일을 지정합니다. CMD와 함께 사용하여 기본 인수를 설정할 수 있습니다.
VOLUME 컨테이너 내의 디렉토리를 호스트와 공유할 수 있는 볼륨으로 지정합니다.
USER 명령어 실행 시 사용할 사용자와 그룹을 지정합니다.
WORKDIR 명령어 실행 전 작업 디렉토리를 설정합니다.
ARG 빌드 시 사용할 변수 값을 정의합니다.
ONBUILD 부모 이미지로부터 파생된 이미지가 빌드될 때 실행할 명령을 지정합니다.
STOPSIGNAL 컨테이너 종료 시 사용할 시스템 호출 신호를 설정합니다.
HEALTHCHECK 컨테이너의 상태를 확인하기 위한 테스트를 정의합니다.
SHELL 기본 셸을 설정합니다. 일반적으로 /bin/sh -c가 기본값입니다.

 

Docker-compose

 

만약 컨테이너를 여러 개 사용한다면 이를 하나씩 실행시키고 관리하기에는 매우 불편한 점이 있다.(Airflow 하나만 사용하더라도 컨테이너 4개가 필요하다.) 그 때 사용하는게 Docker-compose이며, yaml 파일에 실행할 컨테이너의 정보를 작성하고 한 번에 실행시킬 수 있다. 예를 들어 웹 서버, DB, 캐시 등 다양한 서비스가 함께 작동해야 하는 애플리케이션에 매우 유용하다.

 

yaml 파일 내에는 애플리케이션의 서비스, 네트워크 볼륨 등이 정의되어 있다. 이 파일은 애플리케이션 스택의 청사진 역할이라고 할 수 있으며, 각 컨테이너가 어떻게 빌드되고 구성되는지를 명시한다.

 

프로젝트의 루트 디렉토리에 yaml파일은 생성한 뒤에, 아래 명령어로 실행한다.

docker-compose up

 

각 서비스의 로그는 아래 명령어로 확인한다.

docker-compose logs

 

모든 서비스를 중지하고 제거할 때는 아래 명령어를 사용한다.

docker compose down

 

 

728x90