도커 컨테이너 기초
컨테이너 개념, 실행 방법, 관리 명령어, 애플리케이션 호스팅과 도커 엔진 구조
도커 컨테이너 기초
1. 컨테이너
- 컨테이너는 애플리케이션과 애플리케이션을 실행할 가상 리소스(IP 주소, 호스트명, 디스크 드라이브)로 구성된다
- 컨테이너는 서로 독립적인 환경을 갖지만 상자가 실행되는 컴퓨터의 CPU와 메모리, 운영체제를 공유한다
- 격리(isolation)와 밀집(density)
- 격리: 서로 다른 애플리케이션을 독립된 환경에서 실행하는 것
- 밀집: 컴퓨터에 CPU와 메모리가 허용하는 한 되도록 많은 수의 애플리케이션을 실행하는 것
- 격리와 밀집 두 조건을 달성하기 위해 가상 머신 혹은 컨테이너 사용
- 가상 머신
- 애플리케이션이 실행될 독립적 환경
- 호스트 컴퓨터의 운영체제를 공유하지 않고 별도의 운영체제를 필요로 한다
- 별도의 운영체제는 애플리케이션이 사용해야 할 CPU와 메모리 자원을 상당량 차지한다
- 컨테이너
- 각각의 컨테이너는 호스트 컴퓨터의 운영체제를 공유하므로 필요한 리소스 경감
- 같은 호스트 컴퓨터에서 가상 머신에 비해 더 많은 수(일반적으로 약 다섯 배)의 애플리케이션을 실행할 수 있다
2. 컨테이너 실행
- 컨테이너로 애플리케이션 실행
1
docker container run diamol/ch02-hello-diamol
- docker container run
- 컨테이너로 애플리케이션을 실행하라는 도커 명령어
- diamol/ch02-hello-diamol
- 애플리케이션 패키지명
- 이 컨테이너 패키지를 도커에서는 이미지라 한다
- docker container run
- 이미지에는 애플리케이션을 실행하는 데 필요한 모든 내용과 함께 애플리케이션을 실행하는 방법이 정의돼 있다
- 이미지를 이용해 컨테이너를 실행하려면 먼저 이미지가 있어야 한다. 이미지가 없다면 이미지를 내려받고 내려받은 이미지를 사용해 컨테이너를 실행한다
- 빌드, 공유, 실행
- 빌드: 애플리케이션을 컨테이너에서 실행할 수 있도록 패키징
- 공유: 다른 사람이 패키지를 사용할 수 있도록 공유
- 실행: 패키지를 내려받은 사람이 컨테이너를 통해 애플리케이션을 실행
- 따로 지정하지 않는다면 컨테이너를 실행할 때마다 호스트명이 매번 바뀌며, IP 주소 역시 매번 바뀔 확률이 높다
3. 컨테이너 사용
- 도커를 사용해 스크립트와 스크립트 실행에 필요한 도구들을 하나의 이미지로 패키징해 추가적인 설치나 설정 작업 없이 컨테이너로 바로 실행할 수 있다
- 컨테이너를 실행하고 실행된 컨테이너에 마치 원격 컴퓨터에 접속하듯 터미널을 통해 접근할 수 있다
1
docker container run --interactive --tty diamol/base
- 터미널 세션으로 조작할 수 있는 대화식 컨테이너 실행
- –interactive 플래그를 사용하면 컨테이너에 접속한 상태가 된다
- –tty 플래그는 터미널 세션을 통해 컨테이너를 조작하겠다는 의미
- 현재 실행중인 모든 컨테이너에 대한 정보 확인
1
docker container ls
- 컨테이너 이미지, 컨테이너 ID, 컨테이너 실행 후 도커가 실행한 명령 등이 출력
- 도커는 컨테이너를 실행할 때마다 무작위로 생성한 ID 값을 부여한다. 그리고 이 ID 값 중 일부분이 호스트명이 된다
- 실행 여부와 상관 없이 모든 컨테이너 목록 확인
1
docker container ls --all
- 특정 컨테이너에서 실행중인 프로세스의 목록
1
docker container top f1
- 컨테이너를 특정하려면 컨테이너 ID의 처음 몇 글자를 지정하면 된다
- 만약 f1695de1f2ec 컨테이너를 대상으로한다면 f1이렇게 지정하면 된다
- 특정 컨테이너에서 수집된 모든 로그 출력
1
docker container logs f1
- 도커는 애플리케이션의 표준 출력으로부터 로그를 수집한다
- 특정 컨테이너의 상세 정보 출력
1
docker container inspect f1
- 컨테이너 가상 파일 시스템상의 경로, 컨테이너에서 실행 중인 명령, 해당 컨테이너가 접속된 가상 도커 네트워크 정보 등 애플리케이션에 발생한 문제를 추적하는 데 유용한 정보 제공
- JSON 포맷으로 구성된다
- 실행 중인 컨테이너의 상태 확인
1
docker container stats e53
- 실시간으로 컨테이너의 CPU, 메모리, 네트워크, 디스크 사용량 등을 볼 수 있다
- 컨테이너 ID를 지정해 컨테이너 삭제
1
docker container rm e53085ff0cc4
- 모든 컨테이너 삭제
1
docker container rm --force $(docker container ls --all --quiet)
- –force: 실행 중인 컨테이너라도 바로 삭제
- $() 문법은 괄호 안 명령의 출력을 다른 명령으로 전달하는 역할
- 위 명령어는 삭제 전 아무 확인 절차가 없기 때문에 사용할 때 주의
4. 컨테이너에서 애플리케이션 호스팅
- 컨테이너 내부의 애플리케이션이 실행 중이어야 컨테이너의 상태도 실행중이다. 애플리케이션 프로세스가 종료되면 컨테이너의 상태도 Exited가 된다
- 종료된 컨테이너는 CPU 자원이나 메모리를 사용하지 않는다
- 컨테이너가 종료돼도 컨테이너는 명시적으로 삭제하지 않는 한 사라지지 않고 그대로 남아 있다.
- 그러므로 나중에 컨테이너를 다시 실행하거나, 로그를 확인하거나, 컨테이너의 파일 시스템에 새로운 파일을 복사하거나 외부로 복사해올 수 있다. 또한 컨테이너의 파일 시스템이 그대로 남아 있으므로 호스트 컴퓨터의 디스크 공간을 계속 점유한다
- 컨테이너에서 애플리케이션 호스팅
1
docker container run --detach --publish 8080:80 diamol/ch02-hello-diamol-web
- –detach: 컨테이너를 백그라운드에서 실행하며 컨테이너 ID를 출력한다
- –publish: 컨테이너의 포트를 호스트 컴퓨터에 공개
- 도커를 설치하면 호스트 컴퓨터의 네트워크 계층에 도커가 끼어들게 되는데, 그러면 호스트 컴퓨터에서 들고나는 네트워크 트래픽을 모두 도커가 가로채서 그중 필요한 것을 컨테이너에 전달
- 컨테이너는 기본적으로 외부 환경에 노출되지 않는다. 각 컨테이너는 고유의 IP 주소를 갖지만, 이 IP 주소는 도커가 관리하는 내부 가상 네트워크의 주소지 호스트 컴퓨터가 연결된 물리 네트워크에 연결된 것이 아니다
- 컨테이너의 포트를 공개한다는 건 도커가 호스트 컴퓨터의 포트를 주시하다가 해당 포트로 들어오는 트래픽을 컨테이너로 전달해 주는 것이다
5. 도커가 컨테이너를 실행하는 원리
- 도커 엔진(Docker Engine)
- 도커의 관리 기능을 맡는 컴포넌트로 항시 동작하는 백그라운드 프로세스
- 호스트 운영체제와 함께 컨테이너와 가상 네트워크 등 도커 리소스를 만든다
- 로컬 이미지 캐시를 담당
- 도커 엔진은 도커 API를 통해 맡은 기능을 수행한다. 도커 API는 표준 HTTP 기반 REST API이다. 도커 엔진의 설정을 수정하면 이 API를 네트워크를 경유해 외부 컴퓨터로부터 호출할 수 없도록 자단(default)하거나 허용할 수 있다
- 도커 CLI는 도커 API의 클라이언트이다. docker 명령을 사용할 때 실제로 도커 API를 호출하는 것이 바로 도커 CLI
- containerd
- 도커 엔진이 컨테이너를 관리하기 위해 사용하는 컴포넌트
- 호스트 운영체제가 제공하는 기능을 통해 컨테이너를 만든다
- CNCF에서 관리하는 오픈 소스 프로젝트이며, 컨테이너는 개방형 컨테이너 이니셔티브(Open Container Initiative, OCI)라는 이름으로 공개된 개방형 표준
This post is licensed under CC BY 4.0 by the author.