ddingmin.dev

[도커 교과서] 2장 도커의 기본적인 사용법

사내 도커 스터디 개인 정리
도커교과서
2 months ago
·
15 min read

  • 도커의 핵심 기능인 컨테이너를 실행하는 다양한 방법을 알아보자.

  • 컨테이너가 애플리케이션을 경량으로 실행할 수 있는 이유에 대해 알아보자.

2.1 컨테이너로 Hello World 실행하기

다음 명령어를 실행하면 "Hello World" 메시지를 출력하는 컨테이너가 실행된다.

docker container run diamol/ch02-hello-diamol
  • 이 명령을 실행하면 해당 컨테이너가 실행된다.

latest: Pulling from diamol/ch02-hello-diamol
941f399634ec: Pull complete
93931504196e: Pull complete
d7b1f3678981: Pull complete
Digest: sha256:c4f45e04025d10d14d7a96df2242753b925e5c175c3bea9112f93bf9c55d4474
Status: Downloaded newer image for diamol/ch02-hello-diamol:latest
  • 현재 컴퓨터에 실행하려는 도커 이미지가 없기 때문에 먼저 내려받아야한다.

Hello from Chapter 2!
---------------------
My name is:
52527506a77f
---------------------
Im running on:
Linux 6.10.4-linuxkit aarch64
---------------------
My address is:
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
  • 다운받은 패키지를 사용해서 컨테이너를 실행하고, 애플리케이션이 정상적으로 실행되어 출력된다.

다음 명령어를 통해 워크플로의 핵심을 알아볼 수 있다.

  1. [빌드] 애플리케이션을 컨테이너에서 실행할 수 있도록 패키징한다.

  2. [공유] 다른 사람이 패키지를 사용할 수 있도록 공유한다.

  3. [실행] 패키지를 내려받고, 애플리케이션을 컨테이너를 통해 실행한다.

도커를 실행할 수 있는 환경이라면 어디서든 실행할 수 있도록 도커 이미지를 만들 수 있다.

이런 방법으로 도커의 핵심적인 이점인 이식성이 확보된다.

2.2 컨테이너란 무엇인가?

도커 컨테이너는 말 그대로 물건을 담는 컨테이너와 다를 것이 없다.

호스트명, IP 주소, 파일 시스템까지 모두 도커가 만들어낸 가상 리소스다.

컨테이너안에서는 밖을 볼 수 없다.

컨테이너는 어떤 컴퓨터상에서 동작하는 것이고, 이 컴퓨터는 이 컨테이너 말고도 다른 여러 컨테이너를 실행할 수 있다.

이 컨태이너는 서로 독립적인 환경을 갖지만 컨테이너가 실행되는 컴퓨터의 CPU와 메모리, 운영체제를 공유한다.

이러한 구도가 중요한 이유는 격리와 밀집이라는 모순돼 보이는 조건을 동시에 만족할 수 있기 때문이다.

밀집이란 컴퓨터의 CPU와 메모리가 허용하는 한 되도록 많은 수의 애플리케이션을 실행하는 것을 의미한다.

이를 만족하기 위해 최초에는 가상머신을 사용했다. 하지만 가상 머신은 호스트의 컴퓨터 운영체제를 공유하지 않기 때문에 낭비가 커진다. 또한 운영체제 라이선스 비용, 업데이트 부담이 발생한다.

컨테이너는 호스트 컴퓨터의 운영체제를 공유하기 때문에 실행도 빠르고, 외부와 독립된 환경을 제공하므로 밀집과 격리가 동시에 달성되는 것이다.

2.3 컨테이너를 원격 컴퓨터처럼 사용하기

도커를 사용하면 도구와 스크립트를 하나의 이미지로 패키징해 추가적인 설치나 설정 작업 없이 컨테이너로 스크립트를 바로 실행하도록 할 수 있다.

docker container run --interactive --tty diamol/base
  • --interactive 옵션을 통해 컨테이너가 접속된 상태로 유지할 수 있다.

  • --tty 옵션은 터미널 세션을 통해 컨테이너를 조작하겠다는 의미이다.

도커 컨테이너는 호스트 컴퓨터의 운영체제를 공유한다. 따라서 호스트 컴퓨터가 리눅스라면 리눅스 셸이 동작하고, 윈도우라면 윈도우 명령 프롬프트가 동작한다.

도커 자체는 호스트 컴퓨터의 아키텍처나 운영체제와 상관없이 동작하지만 컨테이너에 들어있는 애플리케이션은 운영체제나 아키텍처를 가릴 수 있다.

docker container ls
  • 다음 명령어를 통해 현재 실행중인 모든 컨테이너에 대한 정보를 볼 수 있다.

  • CONTAINER ID, IMAGE, COMMAND, CREATED, STATUS

  • 도커는 컨테이너를 실행할 때마다 무작위로 생성한 ID 값을 부여한다.

docker container top f1
  • 다음 명령어는 대상 컨테이너에서 실행 중인 프로세스의 목록을 보여준다.

docker container logs f1
  • 다음 명령어는 대상 컨테이너에서 수집된 모든 로그를 출력한다.

docker container inspect f1
  • 다음 명령어는 대상 컨테이너의 상세 정보를 보여준다.

  • 가상 파일 시스템상의 경로, 컨테이넌에서 실행 중인 명령, 해당 컨테이너가 접속된 가상 도커 네트워크 정보 등 애플리케이션에 발생한 문제를 추적하는 데 유용한 정보가 제공된다.

  • JSON 포맷 형태이다.

도커를 적용하면 모든 애플리케이션 위에 관리를 위한 계층이 추가된다. 이는 결국 도커를 사용하는 한 컨테이너는 모두 똑같음을 의미한다.

2.4 컨테이너를 사용해 웹 사이트 호스팅하기

  1. 컨테이너 내부의 애플리케이션이 실행중이어야 컨테이너의 상태도 실행중이다. 종료된 컨테이너는 자원이나 메모리를 사용하지 않는다.

  2. 컨테이너가 종료되어도 컨테이너는 사라지지 않는다. 종료된 컨테이너는 그대로 남아있으므로 나중에 컨테이너를 다시 실행하거나 로그를 확인하거나, 컨테이너의 파일 시스템에 새로운 파일을 복사하거나 외부로 복사해 올 수 있다.

docker container run --detach --publish 8088:80 diamol/ch02-hello-diamol-web
  • 해당 명령를 실행하면 컨테이너 ID만 출력된다.

  • 이 컨테이너는 종료되지 않고 백그라운드에서 계속 실행된다.

  • --detach 옵션은 컨테이너를 백그라운드에서 실행하며 컨테이너 ID를 출력한다.

    • 마치 리눅스 데몬이나 윈도 서비스처럼 백드라운드로 동작하며 겉으로 드러나지 않는다.

  • --publish 옵션은 컨테이너의 포트를 호스트 컴퓨터에 공개한다.

    • 각 컨테이너는 도커가 관리하는 고유의 IP 주소를 갖는다.

    • publish 옵션을 통해 포트를 공개하는 것은 호스트 컴퓨터의 포트를 주시하다가 해당 포트로 들어오는 트래픽을 컨테이너로 전달해주는 것이다.

docker container stats e53
  • 다음 명령어를 통해 실행 중인 컨테이너의 상태를 확인할 수 있다.

  • CPU, 메모리, 네트워크, 디스크 사용량을 추가로 볼 수 있다.

docker container rm
  • 컨테이너 사용이 끝나면 다음 명령어를 통해 대상 컨테이너를 삭제할 수 있다.

2.5 도커가 컨테이너를 실행하는 원리

  • 도커 엔진은 도커의 관리 기능을 맡는 컴포넌트이다. 로컬 이미지 캐시를 담당하므로 새로운 이미지가 필요하면 이미지를 내려받으며, 기존 이미지가 있다면 내려받은 이미지를 사용한다. 호스트 운영체제와 함께 가상 네트워크 등 도커 리소스를 만드는 일도 담당한다. 도커 엔진은 항시 동작하는 백그라운드 프로세스이다.

  • 도커 엔진은 도커 API를 통해 맡은 기능을 수행한다. 도커 API는 표준 HTTP 기반 REST API이며, 도커 엔진의 설정을 수정하면 이 API를 네트워크를 경유해 외부 컴퓨터로부터 호출할 수 없도록 차단하거나 허용할 수 있다.

  • 도커 CLI는 도커 API의 클라이언트이다. 우리가 docker 명령어를 사용할 때 실제로 도커 API를 호출하는 것이 바로 도커 CLI이다.

도커 엔진과 상호 작용할 수 있는 유일한 방법은 API를 통하는 방법이다.

지금까지는 한 대의 물리머신에서 컨테이너를 실행하고 관리하기 위한 목적으로 CLI를 사용했는데, 원격 컴퓨터에서 실행 중인 도커를 조작할 수 있도록 CLI가 요청을 전달하는 곳을 변경할 수 있다.

도커 API는 운영체제와 상관없이 동일하므로 어느 곳에 위치한 도커 엔진이라도 이들을 제어할 수 있다.

도커 엔진은 Containerd 라는 컴포넌트를 통해 컨테이너를 실제로 관리하는데, 이는 호스트 운영체제가 제공하는 기능을 통해 컨테이너, 즉 가상 환경을 만든다.

  • Containerd는 CNCF에서 관리하는 오픈 소스 프로젝트이며, OCI라는 이름으로 공개된 개방형 표준이다.


예상 문제

  1. docker container run 명령어를 수행하면 일어나는 일은?

    1. [빌드] 애플리케이션을 컨테이너에서 실행할 수 있도록 패키징한다.

    2. [공유] 다른 사람이 패키지를 사용할 수 있도록 공유한다.

    3. [실행] 패키지를 내려받고, 애플리케이션을 컨테이너를 통해 실행한다.

  2. 도커에서 이미지를 내려받는 것은 무엇이라 하는가?

    • PULL

  3. 도커를 실행할 수 있는 어느 환경이라면 어디서든 실행할 수 있는 도커의 핵심적인 이점은?

    • 이식성

  4. 동일한 컨테이너를 실행할 때 마다 바뀌는 것은?

    • 컴퓨터 이름, IP주소(높은 확률)

  5. 각 컨테이너가는 다른 컨테이너를 볼 수 있나요?

    • X

  6. 도커의 구도는 ( )와 ( )을 동시에 만족한다.

    • 격리, 밀집

  7. 가상 머신에 비해 컨테이너가 제공하는 장점은?

    • 운영체제 리소스 감소 (CPU, 메모리)

    • 운양체제 라이선스 비용

    • 운영체제 업데이트 설치 부담

  8. 도커 컨테이너의 애플리케이션은 운영체제에 상관없이 동작한다.

    • 도커 자체는 운영체제에 상관없이 동작하지만, 컨테이너에 들어있는 애플리케이션은 운영체제를 가릴 수 있다.

  9. 도커 엔진이란?

    • 도커의 관리 기능을 맡는 컴포넌트다. 로컬 이미지 캐시를 담당하고, 호스트 운영체제와 함께 컨테이너와 가상 네트워크 등 도커 리소스를 만드는 일도 담당한다.

    • 항시 동작하는 백그라운드 프로세스다.

  10. 도커 API는 어떤 표준을 따르는가?

    • HTTP기반 REST

  11. 도커 엔진은 어떤 것을 통해 컨테이너를 실제로 관리하는가?

    • containerd

  12. containerd는 ( ) 에서 관리하는 프로젝트이며, 컨테이너는 ( ) 이라는 이름으로 공개된 개방형 표준이다.

    • CNCF, OCI