DevOps/Docker

[Docker] Docker 입문 수업

샤아이인 2022. 2. 8.

생활코딩의 Docker 입문 수업을 들은후, 요약과 추가 정리한 내용입니다.

 

Docker 란?

Docker란 Go언어로 작성된 리눅스 컨테이너 기반으로하는 오픈소스 가상화 플랫폼이다.

 

컨테이너?

container라는 단어가 계속 나오고 있는데, 기본적으로 우리 컴퓨터의 OS가 설치되어있는 곳을 host라 하고 docker로 실행시킨 각각의 실행환경을 container라고 한다.

container에는 라이브러리와 실행파일만 설치되어있어 용량이 작다.

 

컨테이너는 가상화 기술 중 하나로 대표적으로 LXC(Linux Container)가 있습니다.

기존 OS를 가상화 시키던 것과는 달리, 컨테이너는 OS레벨의 가상화로 프로세스를 격리시켜 동작하는 방식으로 이루어집니다.

 

VM 가상화 vs Docker 가상화

기존의 여러 OS를 가상화를 통해 사용하는 것과(virtualbox 같은) VS 컨테이너 방식으로 프로세스를 격리시켜 동작하는 방법의 차이는?

우선 사진을 하나 살펴봅시다!

출처 - https://khj93.tistory.com/entry/Docker-Docker-%EA%B0%9C%EB%85%90

기존에 우리에게 익숙한 VM같은 경우엔 Host OS 위에 가상화를 시키기 위한 Hypervisor 엔진 그리고 그 위에 Guest OS를 올려 사용합니다.

이는 가상화된 하드웨어 위에 OS가 올라가는 형태로 거의 완벽하게 Host와 분리된다고 봐도 무방합니다.

위 사진에서 OS 가상화를 보면 Host OS와 완전히 분리되는 장점이 있지만, OS위에 OS를 올리기 때문에 무겁고 느릴수 밖에 없습니다.

 

반면에 컨테이너 기반 가상화는 Docker 엔진 위에 Application 실행에 필요한 바이너리만 올라가게 됩니다.

이러한 컨테이너 기반 가상화는 Host OS 그리고 Docker 엔진위에서 바로 동작하며 Host의 커널을 공유합니다.

커널을 공유하게 되면 io처리가 쉽게 되어 성능의 효율을 높일 수 있습니다.

컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host OS가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것입니다. 

 
그럼 이러한 컨테이너 기술은 기존의 OS가상화 방식보다 장점만 있는것 일까요?
OS가상화는 컨테이너기반 가상화보다 더 높은 격리 레벨을 지원합니다. 이는 보안적인 측면에서 더욱 유리합니다.
또한 OS가상화의 커널을 공유하지 않는 장점 또한 있습니다. => 커널을 공유하지 않는 만큼 멀티 OS가 가능합니다.
 
그럼에도 왜 Docker를 쓰는 이유는 성능향상, 뛰어난 이식성, 쉽게 Scale Out을 할 수 있는 유연성이라고 생각합니다.
 

 

Docker Hub, Image, Container

Docker Hub

docker hub를 app store와 비슷하다. docker hub에서 우리가 필요한 소프트웨어들의 image를 다운받는 것 이다.

여기서 설치하고 싶은 image를 찾아서 설치하면 되는데, docker hub에서 image를 가져와서 설치하는 것을 pull 받는다고 한다.

docker pull imageName

 

Image

docker hub에서 pull 받아온 것이 image인데, 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있다.

받아온 Image를 컨테이너에 담고 실행을 시킨다면 해당 프로세스가 동작하게 되는 것이죠.


docker hub가 app store라면 image는 program으로 비유가 된다.

image를 pull 받아오면 한 개의 image로 여러 개의 container를 만들 수 있다.
image를 실행시켜 container로 만들때는 run을 해주면 된다.

 

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

 

Container

container는 프로그램을 실행시키면 생성되는 process로 비유할 수 있다.
image를 run 해서 container를 생성하는데, 하나의 program이 여러개의 process를 가질 수 있는 것처럼
하나의 image로 여러 개의 container를 생성할 수 있다.

 

기본 명령어

docker run --name containerName image

--name 뒤에 생성할 container의 이름을 적고 container로 만들고 싶은 Image이름을 적으면 된다.

 

docker ps 

실행중인 container의 목록을 볼 수 있고, 뒤에 -a를 붙이면 실행중이 아닌 container도 확인할 수 있다.

리눅스 커맨드 중에서 실행중인 process를 확인하는 ps와 비슷하다.

 

docker stop containerName

컨테이너의 실행을 중단하기

 

docker rm containerName

컨테이너를 삭제하는 명령어. 실행중인 컨테이너는 삭제하지 못하기 때문에 stop시킨 후 삭제해야한다.

아니면 rm 뒤에 --force 옵션을 붙이면 stop시키지 않고 바로 삭제할 수도 있다.

 

docker logs containerName

실행중인 컨테이너의 로그를 확인할 수 있는 명령어.

하지만 위 명령어를 입력하면, 입력하는 순간 에서의 로그만 확인이 가능하다.

실시간으로 실행 log를 보고 싶으면 컨테이너 이름 앞에 -f 옵션을 붙이면 된다.

 

docker rmi images

이미지 삭제 명령어 rmi는 remove image의 약자이다.

 

docker exec -it containerName /bin/sh

실행중인 컨테이너를 대상으로 쉘과 연결하게 된다. 이때 -it옵션이 필수로 필요하다.

연결된 쉘을 통해서 해당 컨테이너에 지속적으로 명령어를 입력할 수 있게 해준다.

연결 끊을 때는 exit.

만약 bash shell을 쓰고 싶을 때는 /bin/bash로 실행하면 된다.

 

컨테이너와의 포트포워딩

docker run -p 8080:80 --name ex-server httpd

위와 같이 ex-server 라는 컨테이너를 생성했다.
localhost의 8080포트를 Container의 80번 포트와 포트포워딩을 한 것 이다.

따라서 주소창에 localhost:8080을 입력하면 컨테이너 내부에 있는 index.html파일의 내용을 볼 수 있다.

출처 - 생활코딩

 

Host와 디렉토리 연동

위처럼 실행 중인 컨테이너 안에서 직접적으로 파일을 수정하는 것은 불편하기도 하고, 실수로 컨테이너를 삭제하면 작업 내용이 사라지기 때문에 좋은 방법은 아니다.

 

컨테이너를 사용하는 이유는 필요할 때 언제든지 생성했다가 필요가 없어지면 지울 수 있는 것인데, 컨테이너 내부에서의 작업은 이런 장점을 살리지 못한다.

 

따라서 작업 파일을 host에 두고 해당 디렉토리를 Host와 연동하여 사용하면 관리에 편하다. 이때 사용하는 옵션이 -v 옵션이다.

docker run -p 8888:80 -v ~/Desktop/htdocs:/usr/local/apache2/htdocs/ httpd

위와 같이 하면 desktop/htdocs/index.html을 수정할면 컨테이너 내의 htdocs/index.html에 적용되어 브라우져에서 localhost:8888에 접속했을 때 수정된 내용을 볼 수 있다.

출처 - 생활코딩

댓글