오늘은 도커(Docker)와 Docker-compose에 대해 알아보려고 한다.
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 볼륨을 관리하는데 사용된다.도커 엔진은 도커의 핵심 컴포넌트로, 컨테이너를 생성하고 관리하는 역할을 한다.
그 구조는 크게 도커 데몬, 도커 클라이언트, 도커 이미지로 구성되어 있으며, 서버-클라이언트 형태의 구조를 가지고 있다.
도커 데몬(Docker Daemon):
도커 클라이언트(Docker Client):
docker run
같은 도커 커맨드를 입력하면, 도커 클라이언트는 이 커맨드를 받아 도커 데몬에게 전달한다.도커 이미지(Docker Images):
도커 엔진은 이 세 가지 요소를 이용해 컨테이너의 생성, 배포, 실행을 관리하며, 사용자는 도커 클라이언트를 통해 명령을 내리고, 이 명령은 도커 데몬에 의해 처리되며, 실행에 필요한 모든 정보는 도커 이미지에 저장되어 있다.
이렇게 보면 도커 엔진은 사용자가 컨테이너를 쉽게 관리할 수 있도록 도와주는 핵심 도구라고 할 수 있다.
Docker에서 '이미지'는 애플리케이션을 실행하는 데 필요한 모든 파일과 설정값을 포함한 패키지라고 생각하시면 된다.
이 이미지는 변경이 불가능(Immutable)하며, 자체적으로 상태를 가지지 않는다(Stateless).
이미지는 마치 컨테이너를 실행시키기 위한 '레시피'나 '틀' 같은 것으로, 컨테이너가 실행되는 동안에는 변경되지 않는다.
만약 컨테이너가 실행 중에 어떤 데이터를 변경하거나 새로운 데이터를 생성하면, 그 변경 사항은 컨테이너 안에 저장된다.
따라서, 이미지는 '컨테이너를 시작할 때 필요한 모든 것을 담고 있는 스냅샷'이라고 생각하시면 적절하다.
Docker 이미지의 중요한 특징 중 하나는 '레이어'라는 개념을 사용한다는 것이다.
이 레이어는 유니온 파일 시스템을 이용하여 여러 개의 레이어를 하나의 파일 시스템처럼 사용할 수 있게 해 준다.
Docker 이미지는 여러 개의 읽기 전용 레이어로 구성되며, 파일이 추가되거나 수정될 때마다 새로운 레이어가 생성된다.
이렇게 레이어를 쌓아 올리는 방식을 사용하면, 여러 이미지가 동일한 파일을 공유하더라도 그 파일은 딱 한 번만 저장되므로 공간을 효율적으로 사용할 수 있다.
이런 특성 덕분에 Docker는 다양한 이미지를 쉽게 확장하고 관리할 수 있다.
예를 들어, DockerHub라는 곳에는 수많은 Docker 이미지가 저장되어 있고, 이들 이미지는 전 세계에서 80억 번 이상 다운로드되었다.
가상화 기술에는 크게 두 가지 방식이 있다.
하나는 전통적인 방식으로, 하이퍼바이저라는 소프트웨어를 사용하여 물리적인 하드웨어 위에 여러 개의 운영체제(Guest OS)를 설치하고, 각 운영체제 위에 애플리케이션을 실행하는 방식이다.
이 방식은 강력한 격리를 제공하지만, 각각의 운영체제가 필요로 하는 리소스 때문에 오버헤드가 크다.
다른 하나는 컨테이너 기반의 가상화인데, 이는 Docker가 사용하는 방식이다.
Docker는 Linux Container(LXC)를 기반으로 하여, 하나의 운영체제(Host OS)를 공유하면서도 각각의 컨테이너를 마치 독립적인 운영체제처럼 동작하게 만든다.
이 방식은 각 컨테이너가 운영체제의 커널을 공유하기 때문에, 전통적인 가상화 방식보다 훨씬 가볍고 빠르다.
다시 말해, Docker의 컨테이너는 마치 하나의 프로세스처럼 동작하며, 이로 인해 컨테이너의 시작이 매우 빠르고, 한 시스템에서 동시에 수백, 수천 개의 컨테이너를 실행할 수 있다.
Docker Compose는 여러 Docker 컨테이너로 구성된 애플리케이션을 정의하고 관리하기 위한 도구이다.
이런 멀티 컨테이너 도커 애플리케이션은 Docker Compose를 사용해 한 번에 관리할 수 있다.
서비스 정의:
서비스 간의 의존성 관리:
네트워크 관리:
볼륨 관리:
애플리케이션의 배포와 확장:
도커 Compose가 작동하는 방식은 다음과 같다.
이렇게 도커 Compose를 사용하면, 여러 컨테이너로 구성된 애플리케이션을 쉽게 관리하고 운영할 수 있다.
docker-compose up
: docker-compose.yml
에 정의된 모든 서비스를 시작한다. -d
옵션을 추가하면 백그라운드에서 실행된다.docker-compose down
: docker-compose.yml
에 정의된 모든 서비스를 중지하고 컨테이너, 네트워크, 볼륨 등을 제거한다.docker-compose start
: 이전에 생성된 컨테이너를 시작한다.docker-compose stop
: 실행 중인 컨테이너를 중지한다.docker-compose restart
: 서비스를 재시작한다.docker-compose pause
: 실행 중인 컨테이너를 일시 중지한다.docker-compose unpause
: 일시 중지된 컨테이너를 다시 시작한다.docker-compose build
: 서비스에 대한 이미지를 빌드한다.docker-compose pull
: 서비스에 대한 이미지를 가져온다.docker-compose logs
: 컨테이너의 로그를 출력한다. -f
옵션을 사용하면 실시간으로 로그를 보여준다.docker-compose ps
: 프로젝트에 대한 컨테이너의 현재 상태를 보여준다.docker-compose exec
: 실행 중인 컨테이너에서 명령어를 실행한다.도커는 개발부터 배포까지 다양한 실무에서 활용되고 있다.
다음은 몇 가지 대표적인 예시이다.
개발 환경의 통일성 제공:
마이크로서비스 아키텍처:
CI/CD 파이프라인:
머신러닝 및 데이터 분석:
IOT 및 Edge Computing:
위의 예시 외에도 다양한 분야에서 활용되고 있다.
참고 : 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