파드, 컨테이너, 도커, 쿠버네티스의 관계
파드들은 워커 노드라는 노드 단위로 관리하며, 워커 노드와 마스터 노드가 모여 쿠버네티스 클러스터가 된다. 그리고 파드는 1개 이상의 컨테이너로 이루어져 있다.
파드는 쿠버네티스로부터 IP를 받아 컨테이너가 외부와 통신할 수 있는 경로를 제공한다. 그리고 컨테이너들이 정상적으로 작동하는지 확인하고 네트워크나 저장 공간을 서로 공유하게 한다. 파드가 이러한 환경을 만들기 때문에 컨테이너들은 마치 하나의 호스트에 존재하는 것처럼 작동할 수 있다. 도커는 이러한 컨테이너를 사용하는 방법을 명령어로 정리 한것이다. 도커를 사용하면 사용자가 따로 신경 쓰지 않아도 컨테이너를 생성할 때 개별적인 실행 환경을 분리하고 자원을 할당한다.
다양한 컨테이너 관리 도구
- 컨테이너디: 컨테이너디는 다른 시스템과 통합해 컨테이너를 관리하는 기능을 제공하기 때문에 컨테이너 관리 도구를 직접 개발하려는 개발자에게 적합하다
- 크라이오: 크라이오는 범용적인 컨테이너 관리 도구인 도커나 컨테이너디와 달리 쿠버네티스와 통합하는 것을 주목적으로 한다. 크라이오는 다른 도구보다 가볍고 단순하며, CRI 규격을 자체적으로 구현하고 있어서 별도의 구성 요소나 플러그인 없이 쿠버네티스와 통합할 수 있다.
- 카타 컨테이너: 컨테이너마다 독립적인 커널을 제공한다. 기존 컨테이너 방식과 가상화 방식의 중간 영역에 있다. 가상머신을 통해 컨테이너를 격리하므로 기술적으로 보안에 좀 더 강하지만, 필요한 CPU나 메모리의 크기가 기존 컨테이너 방식보다 크다.
- 도커: 컨테이너 관리 기능 외에도 컨테이너를 실행하는 데 필요한 이미지를 만들거나 공유하는 등의 다양한 기능을 제공한다. 도커는 사용자가 명령어를 입력하는 명령어 도구와 명령을 받아들이는 도커 데몬으로 구성돼 있다.
도커로 컨테이너 다루기
이미지 검색하고 내려받기
이미지는 레지스트리라고 하는 저장소에 모여 있다. 별도의 레지스트리를 지정하지 않으면 기본으로 도커 허브에서 이미지를 찾는다.
docker search <검색어>를 입력하면 특정한 이름을 포함하는 이미지가 있는지 찾습니다.
docker search <검색어> 했을시 나오는 정보
- INDEX: 이미지가 저장된 레지스트리의 이름
- NAME: 검색된 이미지 이름. 공식 이미지를 제외한 나머지는 레지스트리 주소/ 저장소 소유자/이미지 이름 형태이다.
- DESCRIPTION: 이미지에 대한 설명
- STARS: 해당 이미지를 내려받은 사용자에게 받은 평가 횟수
- OFFICIAL: [OK] 표시는 해당 이미지에 포함된 애플리케이션, 미들웨어 등을 개발한 업체에서 공식적으로 제공한 이미지라는 의미이다
- AUTOMATED: [OK]표시는 도커 허브에서 자체적으로 제공하는 이미지 빌드 자동화 기능을 활용해 생성한 이미지를 의미한다.
docker pull <이미지> 했을시 나오는 정보
- 태그: 아무런 조건을 주지 않고 이미지 이름만으로 pull을 수행하면 기본으로 latest 태그가 적용된다. latest 태그는 가장 최신 이미지를 의미한다. 따라서 내려받는 이미지 버전이 다를 수 있다.
- 레이어: 하나의 이미지는 여러개의 이미지로 이루어져 있어서 레이어마다 pull complete메시지가 발생한다.
- 다이제스트: 이미지의 고유 식별자로, 이미지에 포함된 내용과 이미지의 생성 환경을 식별할 수 있다. 식별자는 해시 함수로 생성되며 이미지가 동일한지 검증하는데 사용. 이름이나 태그는 이미지를 생성할 때 임의로 지정하므로 이름이나 태그가 같다고 해서 같은 이미지라고 할 수 없다. 그러나 다이제스트는 고유하 값이므로 다이제스트가 같은 이미지는 이름이나 태그가 다르더라도 같은 이미지이다.
- 상태: 이미지를 내려받은 레지스트리, 이미지, 태그 등의 상태 정보를 확인할 수 있다. 형식은 레지스트리 이름/이미지 이름:태그이다.
이미지 태그
태그는 이름이 동일한 이미지에 추가하는 식별자이다. 이미지를 내려받거나 이미지를 기반으로 컨테이너를 구동할 때는 이미지 이름만 사용하고 태그를 명시하지 않으면 latest 태그를 기본으로 사용한다. 컨테이너를 배포할 때는 latest 태그가 아닌 검증된 버전으로 배포해야 문제가 생기지 않는다
이미지의 레이어 구조
이미지는 같은 내용일 경우 여러 이미지에 동일한 레이어를 공유한다. 그렇기에 여러 이미지를 내려받더라도 디스크 용량을 효율적으로 사용할 수 있다.
컨테이너 실행하기
- docker run <조건들> <이미지 이름>[:태그 | @다이제스트]
docker run으로 컨테이너를 생성하면 컨테이너를 식별할 수 있는 고유 ID가 나옴
태그와 다이제스트는 생략가능
옵션
- d(--detach): 컨테이너를 백그라운드에서 구동한다는 의미.
- --restart always: 컨테이너의 재시작과 관련된 정책을 의미하는 옵션. 오류가 발생한 경우 컨테이너도 중지된다. 이때 중지된 컨테이너를 즉시 재시작하거나 리눅스 시스템에서 도커 서비스가 작동할 때 컨테이너를 자동으로 시작하도록 설정할 수 있다.
-p <요청 받을 호스트 포트>:<연결할 컨테이너 포트>:
docker ps 했을시 나오는 정보
- CONTAINER ID: 컨테이너를 식별하기 위한 고유 ID
- IMAGE: 컨테이너를 만드는데 사용한 이미지
- COMMAND: 컨테이너가 생성될 때 내부에서 작동할 프로그램을 실행하는 명령어
- CREATED: 생성된 시각
- STATUS: 컨테이너가 작동을 시작한 시각을 표시합니다. 중지했다가 다시 시작할 경우 초기화
- PORTS: 컨테이너가 사용하는 포트와 프로토콜을 표시한다.
- NAMES: 컨테이너 이름을 표시
docker ps -f <필터링 대상> 사용하는 경우
검색 결과 필터링 가능. 필터링 대상을 지정할 때는 key(대상)=value(값) 형식으로 입력. 이때 value가 정확히 일치하지 않더라도 value에 해당하는 문자열을 포함하는 경우 필터링.
자주 사용하는 필터링 키
- id : 아이디
- name: 이름
- lable: 레이블
- exited: 종료됐을 때 반환하는 숫자 코드
- status: 작동 상태
- ancestor: 컨테이너가 사용하는 이미지
컨테이너 내부 파일 변경하기
- docker cp: docker cp<호스트 경로> <컨테이너 이름>:<컨테이너 내부 경로> 형식으로 호스트에 위치한 파일을 구동 중인 컨테이너 내부에 복사한다. 따라서 컨테이너에 임시로 필요한 파일이 있는 경우 단편적으로 전송하기 위해서 사용. 또는 컨테이너에 저장돼 있는 설정 및 로그를 추출해 확인 목적으로 사용
- Dockerfile ADD: 이미지는 Dockerfile 기반으로 만들어지는데, 이때 Dockerfile에 ADD라는 구문으로 컨테이너 내부로 복사할 파일을 지정하면 이미지를 빌드할 때 지정한 파일이 이미지 내부로 복사된다. 이후 해당 이미지를 기반으로 구동한 컨테이너에서는 복사한 파일을 사용할 수 있다. 그러나 사용자가 원하는 파일을 선택해 사용할 수 없다는 약점이 존재한다.
- 바인드 마운트: 호스트의 파일 시스템과 컨테이너 내부를 연결해 어느 한쪽에서 작업한 내용이 양쪽에 동시에 반영되는 방법이다. 새로운 컨테이너를 구동할 때도 호스트와 연결할 파일이나 디렉터리의 경로만 지정하면 다른 컨테이너에 있는 파일을 새로 생성한 컨테이너와 연결할 수 있다. 컨테이너가 바뀌어도 없어지면 안되는 자료는 이 방법을 통해 보존
- 볼륨: 호스트의 파일 시스템과 컨테이너 내부를 연결하는 것은 바인드 마운트와 동일하지만, 호스트의 특정 디렉터리가 아닌 도커가 관리하는 볼륨을 컨테이너와 연결한다.
사용하지 않는 컨테이너 정리하기
컨테이너 정지하기
컨테이너나 이미지를 삭제하기 전에 먼저 컨테이너를 정지해야 한다. 삭제할 때 말고도 동일한 호스트의 포트를 사용하는 컨테이너를 배포하거나 작동 중인 컨테이너의 사용자체를 종료할 때도 먼저 컨테이너를 정지해야 한다.
- docker stop <컨테이너 이름 | ID>
컨테이너와 이미지 삭제하기
- docker rm <컨테이너 이름 | ID>
- docker rmi <이미지>