본문 바로가기
Engineering WIKI/Docker

[도커 교과서] 2장. 기본 사용방법

by wonos 2023. 2. 25.

책 예제에서 docker container run diamol/ch02-hello-diamol

실행 시 최초에는 애플리케이션을 컨테이너에서 실행하기 위한 패키징된 파일(=이미지)가 없기에 pull을 해 이미지를 받아온다. 그 후 컨테이너를 생성하고 이미지(=만든 앱과 실행을 위한 여러 lib,리소스)를 실행한다.

docker container run 명령은 컨테이너로 애플리케이션을 실행하라는 도커 명령이다.

컨테이너 내에 동작하는 프로세스가 없다면(오류가 발생해 종료되거나 정상 종료등) 컨테이너는 자동 종료된다고 한다.

  • 각 컨테이너는 도커가 만들어낸 가상 리소스 (호스트명, ip주소, 파일시스템)을 독자적으로 갖는다.
  • 컨테이너란 무엇인가?
    • 호스트 컴퓨터는 별도의 호스트명, IP 주소와 디스크를 갖는다. 모든 컨테이너는 호스트 컴퓨터의 운영체제 CPU, 메모리를 공유하나. (즉, 독립적인 환경을 갖지만 상자가 실행되는 컴퓨터의 CPU와 메모리 운영체제를 공유)
  • 컨테이너 내부는 외부 환경을 알 수 없다.
  • 호스트 컴퓨터의 cpu,메모리,운영체제를 공유한다 .=> 격리/밀집을 동시에 만족
    • 도커는 격리와 밀집이라는 얼핏 보면 모순돼 보이는 조건을 동시에 만족할 수 있기 때문이다. 밀집이란 컴퓨터에 CPU와 메모리가 허용하는 한 되도록 많은 수의 애플리케이션을 실행하는 것을 의미한다. 그러나 서로 다른 여러 애플리케이션을 동시에 실행하는 데는 제약이 따른다. 자바나 닷넷 등 필요로 하는 런타임의 버전이 서로 다를 수도 있고 서로 호환되지 않는 버전의 라이브러리를 사용하는가 하면, 어느 한 애플리케이션이 과다한 리소스를 필요로 해 다른 애플리케이션의 리소스가 부족해질 수도 있다. 이런 면을 고려하면 애플리케이션은 서로 독립된 환경에서 실행돼야 한다. 하지만 그럴 경우 한 컴퓨터에서 여러 애플리케이션을 실행할 수 없게 되고, 다시 말해 밀집을 달성할 수 없다.
    • 이 모순된 조건을 동시에 달성하라던 첫 번째 시도는 가상 머신을 사용하는 것이었다. (결론적으로 가상머신은 격리는 달성할 수 있지만, 밀집은 제공하지 못한다. ← 운영체제 별도로 가져가야함)
    • 결국, 컨테이너는 이러한 단점을 해결할 수 있다. (각각의 컨테이너는 호스트 컴퓨터의 운영체제를 공유하므로 필요한 리소스가 크게 경감된다) 그만큼 실행도 빠르고 같은 호스트 컴퓨터에서 가상 머신에 비해 더 많은 수(일반적으로 약 다섯 배)의 애플리케이션을 실행할 수 있고, 컨테이너 역시 외부와 독립된 환경을 제공하므로 밀집과 격리가 동시에 달성되는 것이다 ← 도커의 효율성
docker container run --interactive --tty diamol/base
	* --interactive: 컨테이너에서 입력 받을 수 있게 한다.
    * --tty: 터미널 세션에서 컨테이너를 조작
docker container ls
	=> 실행 중인 컨테이너 정보를 조회한다.
docker container top $[containerId]
	=> 해당 컨테이너의 모든 프로세스에 대한 정보를 조회한다.
docker container logs $[containerId]
	=> 해당 컨테이너의 표준 출력으로부터 로그를 조회한다.
docker container inspect $[containerId]
	=> 해당 컨테이너의 상세 정보를 조회한다.

웹 사이트 호스팅

docker container run --detach --publish 8088:80 diamol/ch02-hello-diamol-web
	*--detach: 컨테이너를 백그라운드 모드로 실행하며 containerId를 출력한다
				컨테이너를 빠져 나와도 종료되지 않는다
	*--publish: 컨테이너 포트를 호스트 컴퓨터에 공개한다.

=> 호스트의 8088 포트로 들어온 트래픽을 해당 컨테이너의 80번 포트로 전달한다.

도커를 설치하면 호스트 컴퓨터 네트워크 계층에 도커가 끼어들게 된다. in,out 트래픽을 모두 도커가 가로채서 필요한 것을 컨테이너에 전달한다.

docker container stats ← 실행 중인 컨테이너의 상태를 확인 할 수 있다.

  • 모든 컨테이너를 삭제하는 명령어
    • $() 문법은 괄호 안 명령의 출력을 다른 명령으로 전달하는 역할
  • docker container rm --force $(docker container ls --all --quiet)

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

  • 도커 엔진 (백그라운드로 동작하면서 컨테이너와 이미지를 관리)
    • 도커의 관리 기능을 맡는다.
    • 로컬 이미지 캐시를 관리한다.
    • 호스트 운영체제와 함께 가상네트워크, 컨테이너 등의 도커 리소스 생성을 관리한다.
    • 항시 동작하는 백그라운드 프로세스다.
  • 도커 api
    • 도커 엔진은 도커 api를 통해서만 제어 가능하다.
    • 표준 rest api이다
  • 도커 명령행 인터페이스 (Docker command-line Interface)
    • 도커 CLI는 도커 API의 클라이언트다 (우리가 docker 명령을 사용할 때 실제로 도커 API를 호출하는 것이 바로 도커 CLI다)
    • CLI는 API에 요청을 전달하는 역할

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

연습문제

=> 위의 웹 사이트 호스팅 예제로 실행한 이미지의 index.html 파일을 수정하는 것이었다.나는 실행 중인 컨테이너 shell로 접속하여 vi로 index.html을 수정하였다.제공하는 답안을 살펴보니 docker container cp를 통해 호스트 컴퓨터의 파일을 컨테이너의 파일을 덮어쓰기하는 것이 의도로 보였다.따라서 docker container cp $[파일 절대 경로] $[컨테이너아이디:파일위치경로] 로 해결하는 것을 확인했다.

ref ) https://kr.linkedin.com/pulse/containerd는-무엇이고-왜-중요할까-sean-lee