도커(Docker)와 Docker-compose

Fox·2024년 1월 24일
0
post-thumbnail

오늘은 도커(Docker)와 Docker-compose에 대해 알아보려고 한다.

1. 도커(Docker)란?

  • 도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
  • Docker의 핵심은 경량화 가상화 컨테이너이다.
  • 컨테이너는 애플리케이션과 그것이 동작하는 데 필요한 라이브러리나 시스템 도구 등을 하나로 묶어서 독립적으로 실행할 수 있는 환경을 말한다.

1.1 도커(Docker) 주요 명령어

  • docker run: 새로운 컨테이너를 생성하고 실행한다. 이때 이미지 이름을 인자로 전달해야 한다.
  • docker start: 정지된 컨테이너를 다시 시작한다.
  • docker stop: 실행 중인 컨테이너를 정지한다.
  • docker build: Dockerfile을 이용해 이미지를 생성한다.
  • docker pull: Docker 이미지를 가져온다.
  • docker push: Docker 이미지를 Docker Hub나 다른 레지스트리에 업로드한다.
  • docker rm: 컨테이너를 삭제한다.
  • docker rmi: 이미지를 삭제한다.
  • docker ps: 현재 실행 중인 컨테이너 목록을 출력한다. -a 옵션을 사용하면 중지된 컨테이너도 포함하여 출력한다.
  • docker images: 로컬에 저장된 모든 Docker 이미지 목록을 출력한다.
  • docker exec: 실행 중인 컨테이너에서 명령어를 실행한다.
  • docker logs: 컨테이너의 로그를 출력한다.
  • docker inspect: 컨테이너의 상세 정보를 JSON 형식으로 출력한다.
  • docker network: Docker 네트워크를 관리하는데 사용된다.
  • docker volume: Docker 볼륨을 관리하는데 사용된다.

2. 도커의 작동 원리

2.1 도커 엔진

도커 엔진은 도커의 핵심 컴포넌트로, 컨테이너를 생성하고 관리하는 역할을 한다.
그 구조는 크게 도커 데몬, 도커 클라이언트, 도커 이미지로 구성되어 있으며, 서버-클라이언트 형태의 구조를 가지고 있다.

도커 데몬(Docker Daemon):

  • 도커 데몬은 서버의 역할을 하며 백그라운드에서 실행되는 프로세스이다.
  • 데몬은 도커 API 요청을 수신하고 이미지를 관리하거나 컨테이너를 생성, 시작, 중지 등의 작업을 수행한다.
  • 도커 데몬은 도커 클라이언트와 통신하며, 도커 클라이언트가 없어도 독립적으로 동작할 수 있다.

도커 클라이언트(Docker Client):

  • 도커 클라이언트는 사용자와 도커 데몬 사이의 주요 인터페이스이다.
  • 사용자가 docker run 같은 도커 커맨드를 입력하면, 도커 클라이언트는 이 커맨드를 받아 도커 데몬에게 전달한다.
  • 도커 클라이언트와 도커 데몬은 같은 시스템에 있거나 네트워크를 통해 원격으로 통신할 수 있다.

도커 이미지(Docker Images):

  • 도커 이미지는 컨테이너를 실행하는 데 필요한 모든 것(코드, 라이브러리, 환경 변수, 파일, 등)을 포함하고 있다.
  • 이미지는 도커 파일에서 생성되며, 각 명령은 이미지의 새로운 레이어를 만든다.
  • 이 이미지는 컨테이너를 생성하는 데 사용된다.

도커 엔진은 이 세 가지 요소를 이용해 컨테이너의 생성, 배포, 실행을 관리하며, 사용자는 도커 클라이언트를 통해 명령을 내리고, 이 명령은 도커 데몬에 의해 처리되며, 실행에 필요한 모든 정보는 도커 이미지에 저장되어 있다.

이렇게 보면 도커 엔진은 사용자가 컨테이너를 쉽게 관리할 수 있도록 도와주는 핵심 도구라고 할 수 있다.

2.2 도커 이미지와 컨테이너

  • 도커의 핵심 개념 중 하나는 이미지와 컨테이너다.
  • 도커 이미지는 애플리케이션을 실행하는데 필요한 모든 것을 포함하며, 이 이미지를 기반으로 컨테이너를 생성한다.
  • 컨테이너는 이미지의 실행형 인스턴스라고 생각하면 된다.
  • 또한 같은 이미지에서 여러 개의 컨테이너를 생성할 수 있다.

이미지

Docker에서 '이미지'는 애플리케이션을 실행하는 데 필요한 모든 파일과 설정값을 포함한 패키지라고 생각하시면 된다.
이 이미지는 변경이 불가능(Immutable)하며, 자체적으로 상태를 가지지 않는다(Stateless).

이미지는 마치 컨테이너를 실행시키기 위한 '레시피'나 '틀' 같은 것으로, 컨테이너가 실행되는 동안에는 변경되지 않는다.
만약 컨테이너가 실행 중에 어떤 데이터를 변경하거나 새로운 데이터를 생성하면, 그 변경 사항은 컨테이너 안에 저장된다.

따라서, 이미지는 '컨테이너를 시작할 때 필요한 모든 것을 담고 있는 스냅샷'이라고 생각하시면 적절하다.

Docker 이미지의 중요한 특징 중 하나는 '레이어'라는 개념을 사용한다는 것이다.
이 레이어는 유니온 파일 시스템을 이용하여 여러 개의 레이어를 하나의 파일 시스템처럼 사용할 수 있게 해 준다.

Docker 이미지는 여러 개의 읽기 전용 레이어로 구성되며, 파일이 추가되거나 수정될 때마다 새로운 레이어가 생성된다.
이렇게 레이어를 쌓아 올리는 방식을 사용하면, 여러 이미지가 동일한 파일을 공유하더라도 그 파일은 딱 한 번만 저장되므로 공간을 효율적으로 사용할 수 있다.

이런 특성 덕분에 Docker는 다양한 이미지를 쉽게 확장하고 관리할 수 있다.
예를 들어, DockerHub라는 곳에는 수많은 Docker 이미지가 저장되어 있고, 이들 이미지는 전 세계에서 80억 번 이상 다운로드되었다.

컨테이너

가상화 기술에는 크게 두 가지 방식이 있다.
하나는 전통적인 방식으로, 하이퍼바이저라는 소프트웨어를 사용하여 물리적인 하드웨어 위에 여러 개의 운영체제(Guest OS)를 설치하고, 각 운영체제 위에 애플리케이션을 실행하는 방식이다.
이 방식은 강력한 격리를 제공하지만, 각각의 운영체제가 필요로 하는 리소스 때문에 오버헤드가 크다.

  • 즉, 하나의 VM 마다 고유한 OS가 필요하기 때문에 CPU, RAM 및 기타 리소스를 소비하며 보다 많은 시간과 자원을 낭비하게 되며, 특정 OS는 라이센스가 필요한 경우도 있다.

다른 하나는 컨테이너 기반의 가상화인데, 이는 Docker가 사용하는 방식이다.
Docker는 Linux Container(LXC)를 기반으로 하여, 하나의 운영체제(Host OS)를 공유하면서도 각각의 컨테이너를 마치 독립적인 운영체제처럼 동작하게 만든다.
이 방식은 각 컨테이너가 운영체제의 커널을 공유하기 때문에, 전통적인 가상화 방식보다 훨씬 가볍고 빠르다.

다시 말해, Docker의 컨테이너는 마치 하나의 프로세스처럼 동작하며, 이로 인해 컨테이너의 시작이 매우 빠르고, 한 시스템에서 동시에 수백, 수천 개의 컨테이너를 실행할 수 있다.

3. Docker-compose란?

Docker Compose는 여러 Docker 컨테이너로 구성된 애플리케이션을 정의하고 관리하기 위한 도구이다.
이런 멀티 컨테이너 도커 애플리케이션은 Docker Compose를 사용해 한 번에 관리할 수 있다.

3.1 도커 Compose의 주요 기능

서비스 정의:

  • 'docker-compose.yml' 파일에 여러 컨테이너로 구성된 애플리케이션의 서비스를 정의하고, 각 서비스가 사용하는 Docker 이미지를 지정할 수 있다.

서비스 간의 의존성 관리:

  • 도커 Compose를 사용하면, 서비스 간의 의존성을 명시적으로 정의하여, 서비스가 올바른 순서로 시작되도록 할 수 있다.

네트워크 관리:

  • Docker Compose를 사용하면, 동일한 네트워크에 속한 여러 컨테이너 간에 서로 통신할 수 있게 설정할 수 있다.
  • 'docker-compose.yml' 파일에서 각 서비스의 네트워크를 설정하면 된다.

볼륨 관리:

  • 볼륨은 데이터를 컨테이너 외부에 저장하도록 해주는 메커니즘이다.
  • 이를 통해 컨테이너가 제거되거나 재시작되어도 데이터가 유지된다.
  • Docker Compose를 사용하면, 각 서비스의 볼륨을 쉽게 설정하고 관리할 수 있다.

애플리케이션의 배포와 확장:

  • 도커 Compose를 사용하면, 애플리케이션의 배포와 확장을 쉽게 할 수 있다.
  • 'docker-compose up' 명령을 통해 애플리케이션의 모든 서비스를 한 번에 시작하거나, 'docker-compose down' 명령을 통해 모든 서비스를 한 번에 중지할 수 있다.

3.2 도커 Compose의 작동 원리

도커 Compose가 작동하는 방식은 다음과 같다.

  1. YAML 형식의 'docker-compose.yml' 파일을 작성한다. 이 파일에는 애플리케이션의 모든 서비스와 이들 간의 관계가 정의되어 있다.
  2. 'docker-compose up' 명령을 실행한다. 이 명령은 'docker-compose.yml' 파일을 읽어서 필요한 이미지를 가져오고, 정의된 서비스를 컨테이너로 생성하고 시작한다.
  3. 'docker-compose down' 명령을 실행하면, Compose는 애플리케이션의 모든 컨테이너를 중지하고 삭제한다.

이렇게 도커 Compose를 사용하면, 여러 컨테이너로 구성된 애플리케이션을 쉽게 관리하고 운영할 수 있다.

3.3 도커 Compose 주요 명령어

  1. docker-compose updocker-compose.yml에 정의된 모든 서비스를 시작한다. -d 옵션을 추가하면 백그라운드에서 실행된다.
  2. docker-compose downdocker-compose.yml에 정의된 모든 서비스를 중지하고 컨테이너, 네트워크, 볼륨 등을 제거한다.
  3. docker-compose start: 이전에 생성된 컨테이너를 시작한다.
  4. docker-compose stop: 실행 중인 컨테이너를 중지한다.
  5. docker-compose restart: 서비스를 재시작한다.
  6. docker-compose pause: 실행 중인 컨테이너를 일시 중지한다.
  7. docker-compose unpause: 일시 중지된 컨테이너를 다시 시작한다.
  8. docker-compose build: 서비스에 대한 이미지를 빌드한다.
  9. docker-compose pull: 서비스에 대한 이미지를 가져온다.
  10. docker-compose logs: 컨테이너의 로그를 출력한다. -f 옵션을 사용하면 실시간으로 로그를 보여준다.
  11. docker-compose ps: 프로젝트에 대한 컨테이너의 현재 상태를 보여준다.
  12. docker-compose exec: 실행 중인 컨테이너에서 명령어를 실행한다.

4. Docker의 실무 활용

도커는 개발부터 배포까지 다양한 실무에서 활용되고 있다.
다음은 몇 가지 대표적인 예시이다.

개발 환경의 통일성 제공:

  • 개발자 간에 사용하는 환경을 동일하게 유지할 수 있다.
  • 각자의 로컬 환경에서 동일한 도커 이미지를 사용하여 개발하면, "내 컴퓨터에서는 잘 돌아가는데..."라는 문제를 피할 수 있다.

마이크로서비스 아키텍처:

  • 도커는 마이크로서비스 아키텍처를 구축하는 데 이상적이다.
  • 각 마이크로서비스를 독립적인 컨테이너로 배포하면, 서비스 간의 의존성을 최소화하고 개별 서비스의 확장 및 유지보수를 용이하게 할 수 있다.

CI/CD 파이프라인:

  • 도커는 지속적인 통합(Continuous Integration)과 지속적인 배포(Continuous Deployment)를 지원한다.
  • 개발, 테스트, 스테이징, 프로덕션 등 다양한 환경에서 동일한 도커 이미지를 사용하여 신속하고 안정적인 배포를 수행할 수 있다.

머신러닝 및 데이터 분석:

  • 데이터 과학자들은 도커를 활용하여 필요한 여러 라이브러리와 도구를 포함한 환경을 구성하고, 이를 통해 머신러닝 모델의 학습 및 추론을 수행할 수 있다.
  • 이렇게 생성된 환경은 다른 데이터 과학자들과 쉽게 공유할 수 있다.

IOT 및 Edge Computing:

  • 도커는 리소스 제한이 있는 IOT 디바이스나 Edge 서버에서도 작동할 수 있다.
  • 이를 통해, 이러한 디바이스에서 동작하는 애플리케이션의 배포와 관리를 간소화할 수 있다.

위의 예시 외에도 다양한 분야에서 활용되고 있다.











참고 : https://velog.io/@fj2008/%EB%8F%84%EC%BB%A4-%EC%97%94%EC%A7%84-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90#%EB%8F%84%EC%BB%A4%EC%97%94%EC%A7%84
참고 : https://tech.weperson.com/wedev/devops/docker/#ci-cd

profile
주니어개발자 Fox 입니다 🦊

0개의 댓글