[1 Month Docker] 1. Docker의 기본 컨셉과 Hello World

Docker의 기본 컨셉을 다루고, 간단한 Hello World를 실습한다.


build, share, run:

  • build: (생략)
  • share: DockerHub에서 이미지를 공유할 수 있다.
  • run: 공유된 이미지를 통해 누구나 컨테이너를 실행할 수 있다.

이미지? 일단 Docker의 재사용 단위라고 생각하자.

도커 컨테이너? 애플리케이션을 담은 박스.

  • 이 박스에는 기기명, IP 주소, 스토리지가 딸린, Docker에서 만들어낸 논리적인 가상 컴퓨터가 있다.

  • 애플리케이션은 이 컴퓨터에서 실행된다.

  • 박스 안의 애플리케이션은 박스 밖을 볼 수 없다.

  • 이 박스는 여러 개가 동시에 실행될 수도 있다.

  • 박스는 같은 실제 컴퓨터를 공유하면서 격리된 환경을 갖는다.

일관된 작업 방식: 아무리 애플리케이션이 복잡하더라도 Docker Image 단위로 Share, Run 만 하면 된다. 몇 개의, 어떤 컴포넌트, 설정 파일, 라이브러리를 사용하는지는 중요하지 않다.

Portability: Docker가 있는 컴퓨터에선 명령어 하나로 곧바로 설치가 가능하다.

효율적인 자원 활용: 도커는 VM이 그렇듯, 여러 애플리케이션을 동시에 실행하는 것으로 컴퓨터 자원을 최대한 활용할 수 있다. 다만 VM보다 나은 점을 아래 표로 정리했다.

사용 자원 Docker VM
Guest OS 사용 여부 No (커널 공유) Yes
가상화 리소스 비용 매우 낮음 (커널 공유) 독립적인 OS 수준
Gust OS Update 다운로드 Base Image 교체 수동 설치
아주 작은 앱 띄우기 Yes No
인수인계/배포 비용 A Dockerfile hours of installation

책에서는 Guest OS License 비용 문제에서도 차이가 난다고 언급했지만, Docker Image 형태로 쓴다고 해서 License 비용이 낮아지거나 사라지지는 않을 것 같다. 반대로 대수가 늘어나기 때문에 Open Source 기반으로 사용하지 않을까 생각이 든다.

네이티브 vs Docker vs KVM(VM 계열) 벤치마크 p.19 참고

주요 도커 명령어:

명령어 기능
docker container ls 실행 중인 컨테이너의 목록 표시
docker container ls –all 전체 컨테이너의 목록 표시 (종료된 것 포함)
docker container run –detach {IMG} 컨테이너를 백그라운드로 실행
docker container run –publish 8088:80 {IMG} Host의 8088 포트로 Listen하여 컨테이너의 80포트로 전달
docker container inspect {ID} 컨테이너의 상세 정보를 JSON으로 출력
docker container stats {ID} 컨테이너가 사용하는 Host 자원 출력
docker container rm (–force) {ID} 컨테이너를 완전히 제거 (실행 중인 경우 force)
docker container rm –force $(docker container ls –all – quiet) 모든 컨테이너를 강제 제거

종료된 컨테이너는 제거된 것이 아니어서 계속 용량을 차지하며, 아래 작업이 가능하다.

  • 그대로 다시 실행
  • 컨테이너 내의 App이 생성한 로그를 확인
  • 파일을 Host에서 or Host로 복사

컨테이너의 네트워크:

  • 기본적으로, 각 컨테이너는 Host 네트워크에 대해 격리된다. 컨테이너는 Host 내의 가상 사설망으로 구성된다.

  • Docker는 Host의 네트워크 트래픽을 가로채 컨테이너로 보낼 수 있다.

Docker가 컨테이너를 실행하는 방법:

Docker Engine은 Docker Backend이다. Docker API(HTTP 기반의 REST API)를 제공한다. 이미지 재사용에 관한 기능은 직접 하고, 컨테이너는 containerd에 기반해 관리한다고 한다. containerd는 CNCF에 의해 관리되는 오픈소스 프로젝트이다.

Docker CLI: Docker의 Frontend이다. Docker Engine과 소통하는 방법을 제공한다.

기타 정보:

Docker는 가장 인기가 많은 컨테이너 플랫폼이지만, 다른 기술도 있으며 컨테이너 기술로 인해 플랫폼에 락인될 걱정은 하지 않아도 된다.

Docker는 이미지를 사용해 컨테이너를 실행한다. 이 때 이미지가 로컬에 있어야 한다. docker container run을 할 때에 없으면 docker pull을 받게 된다. 한 번 다운로드한 이미지는 재사용한다.

도커 컨테이너 Id는 컨테이너의 hostname이 된다.

컨테이너를 선택할 때, 이름 앞 몇글자만 입력해도 된다. 예: f1695...일 때, docker container top f1만 해도 된다.


실습

솔루션

목표: 실행 중인 Apache 컨테이너에서 index.html을 변경하라.

힌트:

  • 컨테이너는 독립된 파일 시스템을 가지며, 컨테이너 내의 웹 서버 또한 컨테이너의 파일 시스템의 파일을 제공한다.

  • docker container 명령어를 통해 컨테이너에서 수행할 수 있는 명령어 목록을 볼 수 있다.

  • docker {command} --help를 통해 해당 명령어의 상세 설명을 확인할 수 있다.

  • diamol/ch02-hello-diamol-web 이미지는 /usr/local/apache2/htdocs 폴더 내의 파일을 정적으로 제공한다. (윈도우의 경우, C:\user\local\apache2\htdocs 폴더.)


내 풀이

풀이 과정을 서술함.

1. 제공된 컨테이너 트러블 슈팅: 일단 ch02-hello-diamol-web 의 기본 포트인 8088은 접속할 수가 없었다. 그래서 DockerHub 가서 Apache 이미지를 받아서 실행해봤다. 8080 포트로 잘 되더라. 이 때 명령어가 $ docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4 였는데, 배운 점:

  • -dit: --detach --interactive의 약자인데, -dit가 필요한 이유를 보면, bash 스크립트가 엔트리 포인트인 경우 -d만 하면 정지된 상태에서 아무것도 못한다고 한다. -it를 줘서 셸이 있어야 스크립트가 실행된다고 한다.
  • -p: --publish의 약자이다.
  • -v: 아직 안 배웠지만, 볼륨 개념일 것으로 추정된다.

도커 자체의 네트워크 문제가 아님을 알고, 80으로 하니까 잘 됐는데, 이유는 모르겠다.

2. 컨테이너 셸 접속: 일단 docker container exec -it --tty {id} /bin/bash 로 접속할 순 있었다. (나오는건 exit 치면 된다.)

3. 직접 파일 수정: 무슨 망할 기반 이미지를 쓰는지 vi 밖에 지원을 하지 않아서 직접 수정은 포기했다. 파일을 복사해야 하는데, 어떻게 하는지 모르겠다.

4. 파일 복사 방법: Dockerfile을 수정하는 게 가장 쉬울 것 같았지만, 제공되지 않아서 할 수 없었다. 복사를 해야 하는데, 호스트에서 컨테이너로 파일 복사하기docker cp 명령어를 배워서 수행했고, 성공했다.


매우 작은 작업이었지만 너무 오랜 기간이 걸렸다. 아무래도 기록하면서 하니까 오래 걸리고, 책의 내용을 요약했음에도 불구하고 며칠만에 다시 보는거여서 오래 걸렸다.

많이 헤맨 덕분에, docker container ls, docker container rm, docker container exec, docker container run은 정말 많이 사용해서 다행이다.


참고 자료: Docker In A Month of Lunches (Manning, 2020)


추가로 읽을 것: Docker와 VM

[1 Month Docker] 1. Docker의 기본 컨셉과 Hello World

https://jsqna.com/docker-diamol-1-hello-world/

Author

Seongbin Kim

Posted on

21-01-02

Updated on

21-01-19

Licensed under

댓글