본문 바로가기
Book

[독서 기록] 그림과 실습으로 배우는 도커 & 쿠버네티스, 오가사와라 시게타카

by Renechoi 2023. 5. 18.
 
그림과 실습으로 배우는 도커 & 쿠버네티스
이 책은 컨테이너 기술이 어렵게 느껴지는 엔지니어나 백엔드 기술에 자신이 없는 분들을 위한 도커 입문서입니다. 자세한 그림과 친절한 실습을 통해 리눅스 지식이나 서버 구축 경험이 없어도 컨테이너와 도커, 쿠버네티스에 대한 지식을 쉽게 이해할 수 있습니다. 도커의 개념부터 동작 방식, 명령어 사용법, 컨테이너 운용, 나아가 도커 컴포즈와 쿠버네티스까지, 컨테이너 기술에 대한 배경지식이 전혀 없는 분들도 도커와 쿠버네티스의 개념과 기초 사용법을 익힐 수 있도록 안내합니다. 도커나 쿠버네티스를 배우고 싶은 초보자라면 철저하게 입문자의 눈높이에 맞춘 이 책으로 도커의 세계에 첫발을 내디뎌 보세요.
저자
오가사와라 시게타카
출판
위키북스
출판일
2022.04.05

 

 

 

도커를 한마디로 정의하자면 '데이터 또는 프로그램을 격리시키는 기능'을 제공하는 소프트웨어라고 할 수 있다. 

- 3p 

 

 

이미지는 광디스크 전체 내용을 그대로 파일에 담은 ISO 파일 등을 생각하면 이해하기 쉽다.

- 5p 

 

윈도우나 macOS에서도 도커를 구동할 수는 있지만 이 경우 내부적으로 리눅스가 사용된다. 또, 컨테이너에서 동작시킬 프로그램도 리눅스용 프로그램이다.

- 6p

 

 

프로그램을 격리해야 하는 이유? 

=> 

공유하는 대상을 어느 한쪽만을 위해 수정하면 다른 쪽에서 오류가 발생하게 된다.

- 8p 

 

설계할 때는 문제가 없었던 프로그램끼리도 실제로 설치해보면 오류를 일으키는 경우도 있다. 이러한 문제의 원인은 대부분 프로그램 간 공유에 있다.

- 9p

 

 

 

도커는 서버에서 사용되는 소프트웨어다. ... 서버란 무엇일까? 서버는 이름 그대로 '어떤 서비스를 제공하는 것'을 가리킨다.

- 11p

 

'무슨무슨 서버를 만든다'는 말은 '무슨무슨용 소프트웨어를 설치해 이 기능을 갖춘다'는 말과 같다.

- 15p

 

 

 

만약 컨테이너 기술을 활용하지 않고 물리 서버 한 대에 두 웹 서버를 함께 올린다면 프로젝트 A에 참여 중인 개발자가 프로젝트 B의 환경을 건드리게 될 수도 있고, 아파치는 서버 한 대에 하나밖에 올리지 못하기 때문에 웹 서버의 기능을 공유해야 하는 한계도 생긴다. 컨테이너 기술을 이용하면 이러한 리스크를 감수하지 않고 두 웹 서버를 하나의 물리 서버에 함께 올릴 수 있다.

- 18p 

 

 

 

개발 측면에서의 이점은 개발환경을 갖추거나 운영 환경으로 쉽게 넘어갈 수 있다는 점 등을 들 수 있겠다. 이러한 이점은 컨테이너가 그저 격리된 환경이 아니라 쉽게 옮길 수 있다는 특성에서 비롯된다.

- 18p

 

 

물리적 환경의 차이, 서버 구성의 차이를 무시 

- 19p

 

 

일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가겠지만 도커를 사용하는 경우에는 운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작한다. 프로그램이나 데이터는 컨테이너 안에 위치한다.

-22p 

 

 

모든 컨테이너에는 '리눅스 운영체제 비슷한 무언가'가 들어있다.

-23p 

 

 

간단하게 리눅스 운영체제 전체를 컨테이너 속에 넣으면 되지 않을까 싶지만 주변 부분만 컨테이너에 넣고 커널은 밑바탕에 있는 것을 빌려 쓰는 형태 덕분에 도커의 가장 큰 특징인 '가벼움'을 얻을 수 있다.

- 26p

 

 

 

이미지는 컨테이너를 만드는 데 사용한다.

- 29p

 

새로운 이미지를 사용해 '개조된' 컨테이너를 대량으로 만들 수 있다.

- 32p

 

 

도커를 사용할 때의 원칙 중 하나로, '한 컨테이너에 한 프로그램'이라는 것이 있다. 말 그대로 하나의 프로그램만 담긴 컨테이너를 사용한다는 의미로, 보안 및 유지 관리 측면에서 유리하기 때문에 많이 쓰이는 정책이다.

- 37p 

 

 

컨테이너는 일회용품에 가깝다 - 업데이트 ㄴㄴ 

 

컨테이너를 만들고 -> 실행하고 -> 종료하고 -> 폐기하는 과정 = 컨테이너의 생애주기 

- 40p

 

 

 

- 독립된 환경

- 이미지를 만들 수 있다

- 컨테이너에 '커널을 포함시킬 필요가 없다'

- 한대에 물리 서버에 여러 대의 서버를 띄울 수 있다

- 서버 관리가 용이하다

- 서버 고수가 아니어도 다루기 쉽다 

- 팀원 모두에게 동일한 개발환경 제공하기

- 새로운 버전의 테스트

- 동일한 서버가 여러 대 필요한 경우

- 44~ 46p

 

 

 

 

docker 명령어의 기본적인 형태

docker 커맨드(상위+하위) (옵션) 대상 (인자)

 

 

커맨드 예

docker container run



 

상위 커맨드 

start      | 컨테이너를 실행 

stop      | 컨테이너를정지

create   | 도커 이미지로부터 컨테이너를 생성

rune      | 도커 이미지를 내려받고 컨테이너를 생성해 실행함(다운로드는 필요한 경우에만)

rm         | 정지 상태의 컨테이너를 삭제 

exec     | 실행 중인 컨테이너 속에서 프로그램을 실행

ls          | 컨테이너 목록 출력

cp         | 컨테이너와 호스트 간 파일 복사

commit | 컨테이너를 이미지로 변환 

 

 

 

 

 

 

 

 

 

- 92 ~ 95p 

 

 

 

docker 실행 주요 커맨드 

 

docker run (옵션) 이미지 

 

--name 컨테이너_이름 | 컨테이너 이름을 저장함

-p 호스트_포트번호:컨테이너_포트번호 | 포트번호를 지정함 

-v 호스트_디스크:컨테이너_디렉터리 | 볼륨을 마운트 함 

-net==네트워크_이름 | 컨테이너를 네트워크에 연결함 

-e 환경변수_이름=값 | 환경변수를 설정함

-d 백그라운드로 실행함

-i 컨테이너에 터미널을 연결함

-t 특수 키를 사용 가능하도록 함

 

 

 

존재하는 모든 컨테이너 목록 출력 

docker ps -a

 

- 98 ~ 100p 

 

 

컨테이너를 실행중인 컴퓨터(호스트)의 8080번 포트와 컨테이너의 80번 포트를 연결한다. 이 설정이 -p 옵션이며, 그 뒤로 '호스트의 포트 번호'와 컨테이너의 포트 번호'를 콜론으로 연결해 함께 기재한다. 

 

-p 8080:80

호스트의 포트 8080을 컨테이너 포트 80으로 포워딩 

 

docker run --name apa000ex2 -d -p 8080:80 httpd

 

- 110p 

 

 

 

nginx 컨테이너 실행 실습 

 

docker run --name nginx000ex6 -d -p 8084:80 nginx

 

 

컨테이너 삭제 

 

 

하지만 이미지는 남는다 

 

 

 

 

 

 

호스트의 파일을 컨테이너 속으로 복사 

 

docker cp 원본_경로 복사대상_컨테이너_이름:컨테이너_경로

 

docker cp /users/사용자명/Documents/index.html apa000ex19:/usr/local/apache2/htdocs/

175p 

 

 

 

볼륨이란 스토리지의 한 영역을 분할한 것을 말한다. 간단히 말하면 하드디스크나 SSD를 분할한 하나의 영역이다.

- 179p 

 

이해하기 쉬운 예로 USB 메모리를 컴퓨터에 꽂으면 띠딩, 하는 소리가 난 다음 폴더가 열리는데, 이것도 USB 메모리가 컴퓨터에 마운트 됐기 때문이다.

- 180p 

 

 

 

볼륨 마운트는 도커 엔진이 관리하는 영역 내에 만들어진 볼륨을 컨테이너에 디스크 형태로 마운트한다. 

 

바인드 마운트는 도커가 설치된 컴퓨터의 문서 폴더 또는 바탕화면 폴더 등 도커 엔진에서 관리하지 않는 영역의 기존 디렉터리를 컨테이너에 마운트하는 방식이다.

- 181 ~ 182p 

 

 

 

 

 

 

컨테이너로 이미지 만들기 

docker commit 컨테이너_이름 새로운_이미지_이름 

- 208p 

 

 

 

도커 허브와 레지스트리 

이미지를 배포하는 장소를 '도커 레지스트리'라고 한다. 

- 215p 

 

 

 

 

도커 컴포즈 

 

시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일)에 기재해 명령어 한번에 시스템 전체를 실행하고 종료와 폐기까지 한번에 하도록 도와주는 도구가 바로 도커 컴포즈다.

- 224p 

 

 

 

up 커맨드는 docker run 커맨드와 비슷하다. 정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너를 생성 및 실행한다. 정의 파일에는 네트워크나 볼륨에 대한 정의도 기재할 수 있어서 주변 환경을 한 번에 생성할 수 있다. 

 

down 커맨드는 컨테이너와 네트워크를 정지 및 삭제한다. 볼륨과 이미지는 사게하지 않는다. 컨테이너와 네트워크 삭제 없이 종료만 하고 싶다면 stop 커맨드를 사용한다.

- 225p 

 

 

도커 컴포즈와 Dockerfile 스크립트의 차이점 

 

도커 컴포즈는 말하자면 docker run 명령어를 여러 개 모아놓은 것과 같다. 컨테이너와 주변 환경을 생성한다. 네트워크와 볼륨까지 함께 만들 수 있다. 반면 Dockerfile 스크립트는 이미지를 만들기 위한 것으로 네트워크나 볼륨은 만들 수 없다.

- 226p 

 

 

쿠버네티스는 도커 컨테이너를 관리하는 도구인 만큼 여러 개의 컨테이너를 다루는 것과 관계가 깊다. 따라서 도커 커모즈와도 혼동하기 쉽다. 하지만 쿠버네티스는 컨테이너를 관리하는 도구인 데 비해 도커 컴포즈의 기능은 컨테이너를 생성하고 삭제하는 것뿐으로, 컨테이너 관리 기능은 없다. 

- 227p 

 

 

 

정의 파일의 이름은 미리 정해진 docker-compose.yml 이라는 이름을 사용해야 한다. 

- 229p 

 

 

 

 

주 항목 

services     컨테이너를 정의한다.

networks    네트워크를 정의한다.

volumes     볼륨을 정의한다. 

 

version: "3.8"                                    # docker-compose 파일 버전입니다.
services:                                         # 서비스들을 선언합니다.
  fast-pass-mysql:                                          # 서비스명을 선언합니다.
    container_name: mysql_local
    image: mysql:8.0.30
    volumes:                                      # {호스트}:{컨테이너}
      - ./db/conf.d:/etc/mysql/conf.d             # MySQL 설정 파일이 있습니다.
      - ./db/initdb.d:/docker-entrypoint-initdb.d # sh, sql을 파일명 알파벳순으로 수행합니다. 테이블 create, insert 쿼리 파일이 들어있습니다.
    ports:                                        # 외부로 노출시킬 port 입니다.
      - "3307:3307"
    environment:                                  # 환경 변수
      - MYSQL_DATABASE=pass_local
      - MYSQL_USER=name
      - MYSQL_PASSWORD=password
      - MYSQL_ROOT_PASSWORD=password
      - TZ=Asia/Seoul

 

 

 

 

쿠버네티스는 여러 대의 컨테이너가 여러 대의 물리적 서버에 걸쳐 실행되는 것을 전제로 한다.

- 258p 

 

 

 

쿠버네티스는 전체적인 제어를 담당하는 마스터 노드와 실제 동작을 담당하는 워커 노드라는 두 가지 유형의 노드로 구성된다. 노드라는 낯선 용어가 나왔는데, 거의 물리적 서버와 일치하는 개념이라고 보면 된다.

- 259p 

 

 

마스터 노드 : 관리 

워커 노드 : 컨테이너가 실제 동작하는 서버 

- 260p 

 

 

 

생성, 모니터링, 유지 

 

쿠버네티스의 기능은 어디까지나 '자동으로 상태를 유지하는' 것으로, 컨테이너를 삭제하고 싶다면 삭제 명령어를 입력하는 것이 아니라 파일에서 '바람직한 상태'를 수정해야 한다.

- 264p 

 

 

 

로드 밸런싱이란 한 대의 서버에 모든 요청이 집중되지 않도록 여러 대의 서버를 갖추고 요청을 각 서버에 분산하는 것 

- 266p 

 

 

 

쿠버네티스에서 컨테이너는 파드pod 라는 단위로 관리된다. 파드는 컨테이너와 볼륨을 함께 묶은 것으로, 기본적으로 파드 하나가 컨테이너 하나이지만 컨테이너가 여러 개인 파드도 있을 수 있다.

- 268p 

 

이들 파드를 모은 것이 서비스service

- 269p 

 

 

동일한 구성의 파드를 레플리카

- 272p 

 

 

 

반응형