
4.1 도커를 알아야 하는 이유
- 쿠버네티스를 이루는 기본 오브젝트가 파드이고, 파드는 컨테이너로 이루어져있으며, 컨테이너를 만들고 관리하는 도구가 도커이다.
- 쿠버네티스를 이루고 있는 기술 자체는 컨테이너를 벗어날 수 없다.
4.1.1 파드, 컨테이너, 도커, 쿠버네티스
1) 파드
- 파드들은 워커 노드라는 노드 단위로 관리하며, 워커 노드와 마스터 노드가 모여 쿠버네티스 클러스터가 된다.
- 파드는 1개 이상의 컨테이너로 이루어져 있다.
- 파드는 쿠버네티스로부터 IP를 받아서 컨테이너가 외부와 통신할 수 있도록 경로를 제공
- 컨테이너들이 정상적으로 작동하는지 확인하고 네트워크나 저장 공간을 서로 공유하게 한다.
- 즉, 파드가 이러한 환경을 만들기 때문에 컨테이너들은 하나의 호스트(host)에 존재하는 것처럼 동작한다.
2) 컨테이너
- 하나의 운영체제 안에서 커널을 공유하며 개별적인 실행 환경을 제공하는 격리된 공간이다.
- 개별적인 실행 환경이란 CPU, 네트워크, 메모리와 같은 시스템 자원을 독자적으로 사용하도록 할당된 환경
- 컨테이너 내부에서 실행되는 애플리케이션들은 서로 영향을 미치지 않고 독릭접으로 작동
3) 도커
- 유닉스나 리눅스는 하나의 호스트 운영 체제 안에서 자원을 분리해 할당하고, 실행되는 프로세스를 격리해서 관리하는 방법을 제공했다.
- 이런 복잡한 과정을 쉽게 만들어주는 도구로 등장한 것이 도커
- 도커는 컨테이너를 사용하는 방법을 명령어로 정리한 것이라고 보면 된다.
4.1.2 다양한 컨테이너 관리 도구
- 컨테이너디: 컨테이너 런타임 부분을 분리하여 만든 오픈 소스 컨테이너 관리 도구
- 크라이오: 레드햇에서 개발, 쿠버네티스와 통합하는 것을 주목적으로 한다.
- 카타 컨테이너: 실행하면 개별 컨테이너를 위한 가벼운 가상 머신을 생성하고 그 위에서 컨테이너가 동작
- 도커
- 컨테이너를 제어하기 위해 별도의 컨테이너디를 포함하고 있다.
- 쿠버네트스는 컨테이너 오케스트레이션을 위해 도커에 포함된 컨테이너디를 활용
4.2 도커로 컨테이너 다루기
- 베이그런트 이미지는 이미지 자체로는 사용할 수 없고 베이그런트를 실행할 때 추가해야만 사용할 수 있다.
- 이와 마찬가지로 컨테이너 이미지도 그대로 사용할 수 없고 도커와 같은 CRI(Container Runtime Interface, 컨테이너 런타임 인터페이스)로 불러들여야 컨테이너가 실제로 동작한다.
- 컨테이너를 삭제할 때는 내려받은 이미지와 실행된 컨테이너를 모두 삭제해야한다.
4.2.1 컨테이너 이미지 알아보기
이미지는 레지스트리(registry)라고 하는 저장소에 모여 있다
레지스트리는 도커 허브처럼 공개된 유명 레지스트리일 수 있고, 내부에 구축한 레지스트리일 수 있다.
이미지 검색하고 내려받기
명령어: docker search <검색어>
→ 특정한 이름(검색어)을 포함하는 이미지를 찾는다.

- INDEX: 이미지가 저장된 레지스트리 이름
- NAME: 검색된 이미지 이름, 공식 이미지를 제외한 나머지는 '레지스트리/저장소 소유자/이미지 이름'
- DESCRIPTION: 이미지 설명
- STARTS: 사용자에게 받은 평가 횟수
- OFFICAL: 공직적으로 제공한 이미지라는 의미
- AUTOMATED: 도커 허브에서 자체적으로 제공하는 이미지 빌드 자동화 기능을 활용해 생성한 이미지
명령어: docker pull <검색어>
→ 찾은 이미지를 내려받을 수 있다.

- 태그(tag)
- 레이어(layer)
- 다이제스트(digest)
- 상태(status)
명령어: docker images nginx

- SIZE: 전체 파일 크기
명령어: docker history nginx:latest
- ADD file: 74.8MB 크기는 stable과 latest가 서로 공유한다.

명령어: docker history nginx:stable
- ADD file: 74.8MB 크기는 stable과 latest가 서로 공유한다.

이미지의 레이어 구조
- 이미지는 같은 내용일 경우 여러 이미지에 동일한 레이어를 공유하므로 전체 용량이 감소한다.
4.2.2 컨테이너 실행하기
명령어: docker run [옵션] <사용할 이미지 이름>[:태그 | @다이제스트]
- -d(--detach): 컨테이너를 백그라운드에서 구동한다는 의미
- --restart always: 컨테이너의 재시작과 관련된 정책을 의미하는 옵션

값 | 컨테이너 비정상 종료 시 | 도커 서비스 시작 시 |
no(기본값) | 컨테이너를 재시작하지 않음 | 컨테이너를 재시작하지 않음 |
on-failure | 컨테이너를 재시작함 | 컨테이너를 시작함 |
always | 컨테이너를 재시작함 | 컨테이너를 시작함 |
unless-stopped | 컨테이너를 재시작함 | 사용자가 직접 정지하지 않은 컨테이너만 시작함 |
명령어: docker ps
=> 생성한 컨테이너 상태를 확인한다.

- CONTAINER ID
- IMAGE
- COMMAND: 컨테이너가 생성될 때 내부에서 작동할 프로그램을 실행하는 명령어
- CREATED
- STATUS
- PORT
- NAMES
명령어: docker ps -f id=bda
- -f는 검색 결과를 필터링할 수 있다.
- key(대상)=value(값)

명령어: docker run -d -p 8080:80 --name nginx-exposed --restart always nginx:stable
- -p 8080:80: 0.0.0.0의 8080번 포트로 들어오는 요청을 컨테이너 내부의 80포트로 전달한다는 의미


4.2.3 컨테이너 내부 파일 변경하기
컨테이너 내부에서 컨테이너 외부의 파일을 사용할 수 있는 방법은 크게 아래와 같이 4가지를 제공한다.
- docker cp
- docker cp <호스트 경로> <컨테이너 이름>: <컨테이너 내부 경로> 형식으로 호스트에 위치한 파일을 구동 중인 컨테이너 내부에 복사한다.
- 컨테이너 임시로 필요한 파일이 있는 경우 단편적으로 전송하기 위해 사용한다.
- 컨테이너에 저장돼 있는 설정 및 로그를 추출해 확인하는 목적으로도 사용한다.
- Dockerfile ADD
- 이미지는 Dockerfile을 기반으로 만들어지는데, 이 때 Dockerfile에 ADD라는 구문으로 컨테이너 내부로 복사할 파일을 지정하면 이미지를 빌드할 때 지정한 파일이 이미지 내부로 복사된다.
- 바인드 마운트
- 호스트의 파일 시스템과 컨테이너 내부를 연결해 어느 한쪽에서 작업한 내용이 양쪽에 동시에 반영되는 방법
- 데이터베이스의 데이터 디렉터리나 서버의 첨부 파일 데릭터리처럼 컨테이너가 바뀌어도 없어지면 안 되는 자료는 해당 방법으로 보존할 수 있다.
- 볼륨
- 호스트의 파일 시스템과 컨테이너 내부를 연결하는 것은 바인드 마운트와 동일하지만, 호스트의 특정 디렉터리가 아닌 도커가 관리하는 볼륨을 컨테이너와 연결한다.
- 볼륨은 쿠버네티스에서 살펴본 볼륨 구조와 비슷하다.
- 도커가 관리하는 볼륨 공간을 NFS와 같은 공유 디렉터리에 생성한다면 다른 호스트에서도 도커가 고나리하는 볼륨을 함께 사용할 수 있다.
실습:바운드 마운트로 호스트와 컨테이너 연결하기
- 컨테이너 내부에 연결할 /root/html 디렉터리를 호스트에 생성
- docker run -d -p 8081:80 -v /root/html:/usr/share/nginx/html --restart always --name nginx-bind-mounts nginx
- -v 호스트 디렉터리 경로:컨테이너 디렉터리 경로
- docker ps -f name=nginx-bind-nounts
실습:볼륨으로 호스트와 컨테이너 연결하기
- docker volume create nginx-volume
- docker volume inspect nginx-volume
- 명령으로 생성된 볼륨을 조회한다.
- 볼륨에 적용된 드라이버 종류와 실제 호스트에 연결된 디렉터리, 볼륨 이름 등을 조회할 수 있다.

3. ls /var/lib/docker/nginx-volume/_data
4. docker run -d -v nginx-volume:/usr/share/nignx/html -p 8082:80 --restart always --name nginx-volume nginx
볼륨은 바인드 마운트와 달리 호스트 디렉터리를 컨테이너 디렉터리에 덮어쓰는 구조가 아니라 양쪽을 서로 동기화시키는 구조이기 때문에 비어 있는 볼륨을 연결하는 경우에는 컨테이너 디렉터리에 있는 파일이 보존된다.
볼륨에 컨테이너 디렉터리와 동일한 파일이 존재한 상태로 연결하는 경우에는 덮어쓰기가 되니 유의해야 한다.
→ 볼륨에 있는 내용을 도커 컨테이너 파일로 덮어쓰기가 된다.
충분한 용량이 확보된 디렉터리 경로로 설정해야할 때는 볼륨 경로를 수정하면 된다.
var 디렉터리는 시스템이 사용하는 파일 중 로그, 캐시, 상태 정보 등을 저장한다.
4.2.4 사용하지 않는 컨테이너 정리하기
실습: 컨테이너 정지하기
컨테이너나 이미지를 삭제하기 전에 먼저 컨테이너를 정지해야 한다.
- docker ps -f ancestor=nginx
- nginx 이미지를 기반으로 생성된 컨테이너를 조회한다.
- ancestor 키는 컨테이너를 생성하는데 사용한 이미지를 기준으로 필터링한다.
- docker stop 컨테이너 이름 | ID
- docker stop $(docekr ps -q -f ancestor=nginx)
- -q(quite) 옵션은 컨테이너 ID만 출력한다.
- docker ps -a -f ancestor=nginx
- 컨테이너가 모두 정지됐으나 삭제된 것은 아니다.
- 정지된 컨테이너를 포함해 모든 컨테이너 목록을 조회
실습: 컨테이너와 이미지 삭제하기
- docker rm $(docker ps -aq -f ancestor=nginx)
- 현재 정지된 nginx 컨테이너 모두를 삭제한다.
- docker rmi $(docker images -q nginx)
- 컨테이너는 모두 삭제했지만, 내려받은 이미지는 아직도 남아서 공간을 차지하고 잇다.
- 용량 확보를 위해 더 이상 필요 없는 이미지를 삭제한다.
4.3 4가지 방법으로 컨테이너 이미지 만들기
- 기본적인 빌드
- 용량 줄이기
- 컨테이너 내부 빌드
- 멀티 스테이지
4.3.1 기본 방법으로 빌드하기
# Dockerfile
FROM openjdk:8
LABEL description="Echo IP Java Application"
EXPOSE 60431
COPY ./target/app-in-host.jar /opt/app-in-image.jar
WORKDIR /root
ENTRYPOINT ["java", "-jar", "app-in-image.jar"]
- 1번째 줄: FROM <이미지 이름>:[태그] 형식으로 이미지를 가져온다.
- 2번째 줄: LABEL <레이블 이름>:<값>의 형식으로 이미지에 부가적인 설명을 위한 레이블 추가할 때 사용
- 3번째 줄: EXPOSE <숫자>의 형식으로 생성된 이미지로 컨테이너를 구동할 때 어떤 포트를 사용하는지 알려준다.
- 컨테이너를 구동할 때 자동으로 해당 포트를 호스트 포트와 연결하지 않는다.
- 실제로 외부에서 접속하려면 docker run -p 옵션을 사용해야 한다.
- 4번째 줄: 호스트에서 새로 생성하는 컨테이너 이미지로 필요한 파일을 복사한다.
- <호스트 경로> <컨테이너 경로>
- 5번째 줄: 이미지의 현재 작업 위치를 opt로 변경한다.
- 6번째 줄: 컨테이너 구동 시, 대괄호 안에 든 명령을 실행한다.
※ 이하 과정은 생략 ※
목적지에 따라 출발지 표시가 다른 이유
- eth1은 외부 요청을 받아들이는 네트워크 인터페이스이고, docker0은 도커 컨테이너가 사용하는 네트워크 인터페이스이다.
- eth1: 192.168.1.10 → docker0:172.17.0.1 → 172.17.0.n:80
4.3.2 컨테이너 용량 줄이기
- openjdk에서 gcr.io/distroless/java로 변경됨.
- distroless는 자바 실행을 위해 경량화된 이미지이다.
4.3.3 컨테이너 내부에서 컨테이너 빌드하기
자바 소스를 컨테이너 이미지에서 빌드하는 부분이 메인 내용.
'읽은 책 > [책] 컨테이너 인프라 환경 구축을 위한 쿠버네티스 도커' 카테고리의 다른 글
5장. 지속적 통합과 배포 자동화, 젠킨스 (0) | 2024.09.22 |
---|---|
3장. 컨테이너를 다루는 표준 아키텍처, 쿠버네티스 (0) | 2024.09.10 |
1장. 새로운 인프라 환경이 온다 (0) | 2024.09.09 |
3장. 쿠버네티스 - 1편 (0) | 2024.08.05 |