Search
📙

그림과 실습으로 배우는 도커 & 쿠버네티스(1)

목차 보기

 CHAPTER 1 도커란 무엇인가?

SECTION 1 도커란 무엇인가?

안개 속에 숨겨진 도커의 정체는?

도커는 ‘데이터 또는 프로그램을 격리시키는’ 기능을 제공한다

도커를 한마디로 정의하면 ‘데이터 또는 프로그램을 격리시키는 기능’을 제공하는 소프트웨어라고 할 수 있다.
개인용 PC에 엑셀, 메신저, 브라우저 등이 독립적으로 동시에 사용하는 것처럼,
도커는 다양한 프로그램과 데이터를 각각 독립된 환경에 격리하는 기능을 제공한다.
그것도 운영체제(비슷한것) 통째로 격리하는 기능이다

컨테이너와 도커 엔진

조립형 창고를 컨테이너(container)라고 할때, 이 컨테이너를 다루는 기능을 제공하는 소프트웨어가 도커(Docker)이다.
도커를 사용하려면 도커 엔진을 설치해야한다.
그리고 도커 엔진을 사용해 컨테이너를 생성하고 구동시킬 수 있다.

컨테이너를 만들려면 이미지가 필요하다

컨테이너를 만들려면 도커 엔진 외에도 컨테이너의 빵 틀과도 같은 역할을 할 이미지가 필요하다

도커는 리눅스 컴퓨터에서 사용한다

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

데이터나 프로그램을 독립된 환경에 격리해야 하는 이유

데이터는 둘째치고 프로그램을 독립된 환경에 격리해야하는 이유는 잘 이해가 가지 않을 수도 있다.
대부분의 프로그램은 어떤 실행 환경이나 라이브러리 또는 다른 프로그램을 이용해 동작한다.
이때 독립된 환경이 아닌 같은 환경에서 프로그램들 간에 디렉터리나 환경을 공유하게 되면, 처음에는 괜찮을지는 몰라도 프로그램 하나를 업데이트를 하게되면 다른 프로그램에도 영향을 미치게 된다.
즉, 어떤 프로그램에서는 의도하지 않은 변경사항이 발생하거나 설정이 충돌하는 경우가 발생하기 때문이다

SECTION 2 서버와 도커

컨테이너를 이용해 여러 가지 서버 기능을 안전하게 함께 실행하기

도커 환경에서 컨테이너를 사용하면 프로그램을 완전히 격리시킬 수 있다고 설명했다.
예산이 부족해 한 대의 서버에서 웹 서버와 메일 서버, 시스템과 DB서버를 구축하여 사용하고 있었다면,
도커를 사용하는 경우 무엇을 업데이트하더라도 서로 영향을 미치지 않게 하면서 서버들을 독립된 환경에서 안전하게 운용할 수 있다.
또한 일반적으로 웹 서버(아파치)의 경우 서버 당 한 벌 밖에 실행하지 못하지만 컨테이너 기술을 활용하면 여러 개의 웹 서버를 올릴 수 있다.
따라서 물리 서버 한 대에 여러개의 웹 서버를 띄우면 그만큼 물리 서버 수를 줄일 수 있다.

자유로이 옮길 수 있는 컨테이너

컨테이너는 자유로이 옮길 수 있다.
컨테이너의 정보를 내보내기한 다음, 다른 도커 엔진에서 복원하는 형태를 사용하면 쉽게 옮길 수 있다.
이런 특성을 이용하면 똑같은 상태로 튜닝된 컨테이너를 팀 전체에 빠르고 동일하게 배포할 수 있다.
도커만 설치돼 있으면 운영체제가 달라도 이를 신경쓰지 않고 컨테이너로 옮길 수 있다.
도커를 이용하면 물리적 환경의 차이, 서버 구성의 차이를 무시할 수 있다.

 CHAPTER 2 도커의 동작 원리

SECTION 1 도커의 동작 원리

도커의 구조

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

컨테이너 안에는 운영체제 ‘비슷한 것’이 들어있다

모든 컨테이너에는 ‘리눅스 운영체제 비슷한 무언가’가 들어있다.
아무것도 주문하지 않아도 기본 반찬이 나오듯, 최소한의 컨테이너에도 ‘리눅스 운영체제 비슷한 무언가’가 딸려 나온다. ‘빈 컨테이너’라고 했지만 정말로 텅 빈 것은 아닌 셈이다.
scratch라는 이미지를 이용하면 텅 빈 컨테이너를 만들 수 있지만 초보자가 이를 사용할 일은 거의 없다.

운영체제가 하는 일은 뭘까?

운영체제는 소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 역할을 한다.
도커 엔진 아래에도 리눅스 운영체제가 있는데, 컨테이너 속에 또 리눅스 운영체제(비슷한것)가 있다.
왠지 기묘한 구조다
본래 운영체제는 ‘커널’이라는 부분과 ‘그 외의 주변 부분’으로 구성된다
주변 부분이 프로그램의 연락 내용을 커널에 전달하고 커널이 하드웨어를 다룬다.
주변 부분은 명령을 전달받거나 커널이 실행한 결과를 프로그램에 다시 전달하는 역할을 한다. 커널과 주변 부분을 합친 패키지가 배포판이다. 널리 알려진 배포판으로 레드햇과 CentOS, 우분투가 있다.
도커에서는 컨테이너가 완전히 분리돼 있으므로 밑바탕이 되는 리눅스 운영체제의 주변부분이 컨테이너 속 프로그램의 명령을 전달받을 수 없다.
하지만 컨테이너 속에 운영체제의 주변 부분이 들어 있어 프로그램의 명령을 전달받고 이를 밑바탕이 되는 커널에 전달하는 구조로 돼 있다.
컨테이너 속에 ‘리눅스 운영체제 비슷한 것’이 들어 있는 것은 이 때문이다.
리눅스 운영체제 전체를 컨테이너 속에 넣으면 되지 않을까 싶지만, 주변 부분만 컨테이너에 넣고 커널은 밑바탕에 있는 것을 빌려 쓰는 형태 덕분에 도커의 가장 큰 특징인 ‘가벼움’을 얻을 수 있다

도커는 기본적으로 ‘리눅스용’이다

도커는 기본적으로 리눅스 운영체제에서만 동작한다.
이유는 리눅스 운영체제가 동작하는 것을 전제로 하는 구조로 돼 있기 때문에 리눅스 운영체제에서만 동작할 수 있다.

윈도우와 macOS에서 도커 구동하기

도커는 리눅스 운영체제를 사용한다고 전제하기 때문에 윈도우나 macOS 운영체제를 사용하는 컴퓨터에서는 도커를 사용할 수 없어야 한다.
하지만 가능하다.
VirtualBox나 VMware 같은 가상 환경 위에 리눅스를 설치하고 그 위에서 도커를 실행하거나,
‘윈도우용 또는 macOS용 도커 데스크톱’처럼 도커를 실행하는 데 필요한 리눅스 운영체제를 포함하는 패키지를 설치해 사용하는 방법이 있다.
간단히 말하면 어떠한 형태로든 리눅스 운영체제를 갖춰야 한다는 말이다.

SECTION 2 도커 허브와 이미지, 그리고 컨테이너

이미지와 컨테이너

이미지는 금형과 같다

로봇 장난감을 원하는 아이에게 로봇을 만드는 금형은 아무 소용이 없다.
이미지 역시 이미지 자체로는 큰 쓸모가 없다. 이미지는 컨테이너를 만드는데 사용한다.
이미지 하나만 있으면 똑같은 것을 여러 개 만들 수 있다.

컨테이너로도 이미지를 만들 수 있다.

기본적인 언어만 설치된 컨테이너 안에 소프트웨어나 시스템을 넣은 뒤 새로운(개조된) 이미지를 만들 수 있다.

도커 엔진 간에 이동이 가능하다

컨테이너 자체가 이동하는 것은 아니지만 이미지를 통해 컨테이너가 이동한 것과 같은 효과를 얻을 수 있다.

도커 허브와 도커 이미지

초보자가 컨테이너의 이미지를 밑바닥부터 만들어 낼 일은 거의 없다.
있다 하더라도 이미 준비돼 있을 가능성이 높다.
도커 허브(https://hub.docker.com) 는 공식적으로 운영되는 도커 레지스트리이며 누구든지 편리하게 이용할 수 있다.
도커 허브는 공개된 컨테이너 이미지가 모여있는 곳이다. 이곳에서 원하는 컨테이너의 이미지를 내려받을 수 있다.

도커 허브에는 어떤 이미지가 공개돼 있을까?

도커 허브에는 운영체제만 들어 있는 이미지부터, 여러 소프트웨어가 함께 포함된 것까지 다양한 이미지가 제공된다.

안전한 컨테이너 이미지를 고르는 법

이미지의 종류가 많다 보니 이미지를 선택하는 데 어려움을 느낄 수 있다.
또한 누구나 자유롭게 이미지를 등록할 수 있기 때문에 안전하지 못한 이미지가 있을 수 있다.
공식 이미지를 사용한다.
다만 특정 운영체제 및 버전으로 한정된 경우가 있어서 (드물게는) 원하는 것을 찾지 못할 수도 있다.
커스텀 이미지를 직접 만들어 사용한다.

다양한 형태로 조합이 가능한 컨테이너

도커를 사용할 때의 원칙 중 하나로, ‘한 컨테이너에 한 프로그램’이라는 것이 있다.
말 그대로 하나의 프로그램만 담긴 컨테이너를 사용한다는 의미로, 보안 및 유지 관리 측면에서 유리하다.
도커를 사용해서 각각 별도의 컨테이너로 구성할 수도 있고, 한 컨테이너에 모두 집어넣는 방법도 있다.
(한 컨테이너 모두 집어넣는 방식은 유지보수나 도커의 장점을 누리기 어렵기 때문에 추천하지 않는다.)

SECTION 3 도커 컨테이너의 생애주기와 데이터 저장

도커 컨테이너는 ‘쓰고 버리는’ 일회용품

컨테이너는 앞서 얘기했듯이 쉽게 만들 수 있다. 그러므로 하나를 업데이트하면서 계쏙 사용하기 보다는 업데이트된 소프트웨어가 들어있는 새로운 컨테이너를 사용하는 것이 좋다.
즉, 새로운 버전이 나오면 새로운 컨테이너로 갈아타는 것이다.
컨테이너를 만들고실행하고종료하고폐기한다.
이후 다시 컨테이너를 만드는 일련의 과정을 컨테이너의 생애주기라고 부른다.

데이터 저장

컨테이너를 폐기했다면 컨테이너에 들어있던 데이터는 어떻게 될까?
당연히 사라진다.
하지만 도커가 설치된 물리적 서버(호스트)의 디스크를 마운트해 이 디스크에 데이터를 저장하여 데이터를 보존할 수 있다.

SECTION 4 도커의 장점과 단점

도커의 구조와 성질

‘환경을 격리할 수 있다’는 것이 핵심이다

이러한 성질 덕분에 ‘독립된 환경’‘이미지를 만들 수’있게 되며 컨테이너에 ‘커널을 포함시키지 않아도 되는 구조’가 가능했다.
독립된 환경
독립된 환경 덕분에 ‘여러 개의 컨테이너를 띄울 수’ 있으며, ‘똑같은 어플리케이션도 여러개 띄울 수’ 있다. 그 중 일부를 교체하거나 수정할 수도 있다
이미지를 만들 수 있다
이미지를 만들 수 있으며 그 이미지를 ‘도커 허브에 배포’할 수 있다.
‘이미지를 내려받기만 하면’ 도커가 설치된 어디에서든 컨테이너를 실행 시킬 수 있다.
컨테이너에 ‘커널을 포함시킬 필요가 없다’
그래서 가볍다.
배포판(레드햇, CentOS, 우분투 등)도 원하는 것을 사용할 수 있다.

도커의 장점과 단점

도커의 장점

도커의 장점은 ‘여러 개’, ‘이동성’, ‘생성’, ‘보안’이라는 키워드로 나타낼 수 있다.
한 대의 물리 서버에 여러 대의 서버를 띄울 수 있다
서버 관리가 용이하다
서버 고수가 아니어도 다루기 쉽다

도커의 단점

리눅스용 소프트웨어밖에 지원하지 않는다
물리 서버 한 대에 여러 대의 서버를 띄우는 형태이므로 호스트 서버에 문제가 생기면 모든 컨테이너에 영향이 미친다.
이 점은 가상화 기술이나 클라우드와 같이 가상화 플랫폼에서도 마찬가지지만, 하나의 물리서버에 하나의 기능을 띄우는 상태와 비교하면 물리 서버에 문제가 생겼을 때 영향이 미치는 범위가 커진다.
따라서 확실한 대책을 세워야 한다.
컨테이너를 여러 개 사용하는 형태를 가정하므로 컨테이너 하나를 장기간에 걸쳐 사용할 때는 그리 큰 장점을 느끼기 어렵다.
컨테이너를 하나밖에 사용하지 않는데 도커를 설치하고 도커 엔진을 구동한다면 오버헤드에 지나지 않는다.

도커의 주 용도

팀원 모두에게 통일한 개발환경 제공하기(=동일한 환경을 여러 개 만들기)

동일한 개발환경을 쉽고 빠르게 구축할 수 있다.

새로운 버전의 테스트(=격리된 환경을 이용)

새로운 버전뿐만 아니라 변경된 환경에 대한 테스트에도 유용하다.

동일한 서버가 여러 대 필요한 경우(=컨테이너 밖과 독립된 성질을 이용)

물리 서버를 여러 개의 컨테이너가 공유하므로 비용을 절약할 수 있다.
명령 한 줄이면 서버를 필요한 만큼 띄울 수 있어 단순 업무를 반복할 필요가 없다.
이 밖에도 스케일링에 유리하므로 웹 서버나 API 서버로 활용하는 등 다양한 활용 방법이 있다.
도커 컨테이너(Docker Container) 실행 방식
Docker 기술은 Linux 커널과 Cgroups 및 네임스페이스 등 커널의 기능을 사용하여 프로세스를 분리함으로써 독립적으로 실행할 수 있도록 합니다. 이러한 독립성은 컨테이너의 본래 목적입니다. 다시 말해서, 여러 프로세스와 애플리케이션을 서로 개별적으로 실행하여 인프라를 더 효과적으로 활용하고 개별 시스템을 사용할 때와 동일한 보안을 유지할 수 있습니다.

 CHAPTER 4 컨테이너를 실행해 보자

SECTION 1 컨테이너의 기본적인 사용 방법

컨테이너 사용의 기본은 도커 명령어

컨테이너 사용의 기본은 도커 명령어다.
컨테이너를 다루는 모든 명령은 ‘docker’ 명령어로 시작한다
$ docker ~
Shell
복사

명령어와 대상

docker 명령어 뒤에 오는 ‘무엇을’ ‘어떻게’에 해당하는 부분을 ‘커맨드’라고 한다.
커맨드는 다시 상위 커맨드와 하위 커맨드로 구성되며, 상위 커맨드가 ‘무엇을’ 하위 커맨드가 ‘어떻게’에 해당하는 내용을 지정한다.
‘대상’에는 컨테이너명 또는 이미지명 등 구체적인 이름이 들어간다.
docker 명령어 뒤로 ‘무엇을’, ‘어떻게’, ‘대상’의 순으로 지정하면 된다.

옵션과 인자

기본적인 형태는 docker [커맨드] [대상]이지만 이 외에도 ‘옵션’과 ‘인자’라는 추가 정보가 붙는다.
$ docker container run -d penguin --mode=1 // container : 상위 커맨드 // run : 하위 커맨드 // -d : 옵션 // penguin : 대상 // --mode=1 : 인자
Shell
복사

기본적인 명령어 - 정리

정리하자면 기본적인 명령어는 다음과 같은 형태를 띤다.
docker 커맨드 (옵션) 대상 (인자)
Shell
복사

커맨드(상위 커맨드/하위 커맨드)

‘컨테이너’를 ‘실행’하고 싶다면 container run 커맨드를 사용한다.
다만 역사적 이유로 start나 run처럼 ‘container’를 붙이지 않아도 실행 가능한 명령어가 있으며, 관례상 이쪽을 사용하는 경우가 많다.
# 커맨드 예 $ docker container run # docker container run을 생략한 커맨드 예 docker run
Shell
복사

옵션

옵션은 커맨드에 세세한 설정을 지정하는 용도로 쓰인다.
# 어떤 값을 전달하고 싶다면 --name 같은 옵션 뒤에 옵션 값을 지정한다 --name penguin # -(하이픈)을 하나만 사용하는 옵션은 한꺼번에 모아 쓸 수 있다. # -d, -i, -t를 합쳐 -dit
Shell
복사

대상

커맨드와 달리 구체적인 이름을 지정한다.

인자

대상에 전달할 값을 지정한다.
문자 코드 또는 포트 번호 등을 전달할 수 있다. 단, 인자를 지정하는 경우는 그리 많지 않다.

대표적인 명령어

컨테이너 조작 관련 커맨드(상위 커맨드 container)

docker container 하위_커맨드 (옵션)
Shell
복사
하위 커맨드
내용
생략 가능 여부
주요 옵션
start
컨테이너를 실행
O
-i
stop
컨테이너를 정지
O
거의 사용하지 않음
create
도커 이미지로부터 컨테이너를 생성
O
—name -e -p -v
run
도커 이미지를 내려받고 컨테이너를 생성해 실행함(다운로드가 필요한 경우에만)
O
—name -e -p -v -d -i -t
rm
정지 상태의 컨테이너를 삭제
O
-f -v
exec
실행 중인 컨테이너 속에서 프로그램을 실행
O
-i -t
ls
컨테이너 목록을 출력
*1
-a
cp
도커 컨테이너와 도커 호스트 간에 파일을 복사
O
거의 사용하지 않음
commit
도커 컨테이너를 이미지로 변환
O
거의 사용하지 않음

이미지 조작 관련 커맨드(상위 커맨드 image)

이미지를 내려받거나 검색하는 등 이미지와 관련된 기능을 실행하는 커맨드.
이미지를 대상으로 어떤 일을 할지는 하위 커맨드를 통해 지정한다
docker image 하위_커맨드 (옵션)
Shell
복사
하위 커맨드
내용
생략 가능 여부
주요 옵션
pull
도커 허브 등의 리포지토리에서 이미지를 내려받음
O
거의 사용하지 않음
rm
도커 이미지를 삭제
*2
거의 사용하지 않음
ls
내려 받은 이미지의 목록을 출력
X
거의 사용하지 않음
build
도커 이미지를 생성
O
-t

볼륨 조작 관련 커맨드(상위 커맨드 volume)

볼륨 생성, 목록 확인, 삭제 등 볼륨과 관련된 기능을 실행하는 커맨드다.
볼륨을 대상으로 어떤 일을 할지는 하위 커맨드를 통해 지정한다.
docker volume 하위_커맨드 (옵션)
Shell
복사
하위 커맨드
내용
생략 가능 여부
주요 옵션
create
볼륨을 생성
X
—name
inspect
볼륨의 상세 정보를 출력
X
거의 사용하지 않음
ls
볼륨의 목록을 출력
X
-a
prune
현재 마운트되지 않은 볼륨을 모두 삭제
X
거의 사용하지 않음
rm
지정한 볼륨을 삭제
X
거의 사용하지 않음

네트워크 조작 관련 커맨드(상위 커맨드 network)

도커 네트워크의 생성, 사겢, 컨테이너의 네트워크 접속 및 접속 해제 등 도커 네트워크와 관련된 기능을 실행하는 커맨드다.
도커 네트워크란 도커 요소 간의 통신에 사용하는 가상 네트워크를 가리킨다.
docker network 하위_커맨드 (옵션)
Shell
복사
하위 커맨드
내용
생략 가능 여부
주요 옵션
connect
컨테이너를 도커 네트워크에 연결
X
거의 사용하지 않음
disconnect
컨테이너의 도커 네트워크 연결을 해제
X
거의 사용하지 않음
create
도커 네트워크를 생성
X
거의 사용하지 않음
inspect
도커 네트워크의 상세 정보를 출력
X
거의 사용하지 않음
ls
도커 네트워크의 목록을 출력
X
거의 사용하지 않음
prune
현재 컨테이너가 접속하지 않은 네트워크를 모두 삭제
X
거의 사용하지 않음
rm
지정한 네트워크를 삭제
X
거의 사용하지 않음

그 밖의 상위 커맨드

대부분 도커 스웜과 관련된 커맨드로서 초보자 수준에서는 사용할 일이 아직 없다.
(*도커 스웜 : 컨테이너 오케스트레이션 기능을 제공하는 것으로 쿠버네티스와는 별개의 도구다.)
하위 커맨드
내용
checkpoint
현재 상태를 일시적으로 저장한 후, 나중에 해당시점 상태로 되돌릴 수 있다. (책 시점 기준 현재 실험기능)
node
도커 스웜의 노드를 관리하는 기능
plugin
플러그인을 관리하는 기능
secret
도커 스웜의 비밀값 정보를 관리하는 기능
service
도커 스웜의 서비스를 관리하는 기능
stack
도커 스웜 또는 쿠버네티스에서 여러 개의 서비스를 합쳐 구성한 스택을 관리하는 기능
swarm
도커 스웜을 관리하는 기능
system
도커 엔진의 정보를 확인하는 기능

단독으로 쓰이는 커맨드

상위 커맨드 없이 단독으로 쓰이는 특수한 커맨드.
주로 도커 허브의 검색이나 로그인에 사용되는 커맨드다.
단독 커맨드
내용
주요 옵션
login
도커 레지스트리에 로그인
-u -p
logout
도커 레지스트리에 로그아웃
거의 사용하지 않음
search
도커 레지스트리 검색
거의 사용하지 않음
version
도커 엔진 및 명령행 도구의 버전을 출력
거의 사용하지 않음