안녕하세요 김재벌 입니다.
코로나-19 때문에 난리인데... ㅜㅜ 건강 유의하시기 바랍니다.
최근 쿠버네티스의 관심은 엄청난 상황은 엄청난 상황이고, 도커의 경우는 너무 기본적인 기술처럼 되어 가고 있죠.
도커 컨테이너 관련 기술 서적과 블로그 , 아티클들은 넘쳐 나고 있지만, 다양한 교육 관련 강의를 하는 저희 회사에서는 도커나 쿠버네티스 같은 교육 관련 콘텐츠의 개발도 왕성하게 하고 있습니다.
그 중 일부 챕터의 내용을 발췌 하여 공개 하고자 합니다. (다 아시는 이야기 일 수 도 있습니다. : -))
2-1. 도커의 개요
1) 도커란?
Docker는 2013년 Docker 사에서 Go 언어로 개발한 오픈소스 플랫폼이다. Docker를 사용하면 리눅스 컨테이너를 더 쉽게 관리하고 실행할 수 있다. Docker의 가장 큰 특징은 이식성인데, 이는 개발 환경, 테스트 환경, 서비스 환경을 모두 동일하게 사용할 수 있기 때문이다.
도커를 사용하는 이유는 도커가 가지고 있는 몇 가지 특징 때문이다. 다음은 도커의 특징이다.
① 서버를 코드 형태로 정의
도커는 이미지를 사용하여 컨테이너를 실행한다. 이 컨테이너는 하나의 애플리케이션을 실행하는 서버처럼 동작한다. 도커는 이미지를 제작할 때 코드형태로 정의하여 작성할 수 있다. 따라서 서버를 코드 형태로 정의할 수 있어 일관성을 유지하는 것과 버전 관리는 부분에서도 편리하다.
② 이식성
애플리케이션 개발 단계는 크게 개발 단계, 테스트 단계, 서비스 단계로 나뉜다. 이때 각 단계의 환경을 통일하기는 쉽지 않다. 하지만 도커를 사용하면 컨테이너에 모든 환경을 구축하기 때문에 환경을 통일하는 것 도커만 설치하면 된다.
③ 상호운용성
Docker는 Google, Amazon, IBM, Microsoft, Red Hat 등 다양한 벤더에서 지원하기 때문에 다양한 벤더의 시스템 및 오픈 소스와 연계하여 사용할 수 있다.
2) 도커의 구조
(1) 이미지
도커로 리눅스 컨테이너를 생성하려면 미리 제작된 이미지가 있어야 한다. 이미지는 여러 개의 레이어로 이루어져 있으며, 각 레이어는 Read Only 상태로 사용되다. 만약 이미지로 컨테이너를 실행하여 파일을 생성하거나 삭제한다면 새로운 레이어를 만들어 내용을 저장한다. 이때 사용하는 방식이 COW(Copy on Write) 와 유사하다.
(2) 저장소
컨테이너를 생성하려면 이미지가 있어야 하고, 이미지는 호스트가 아닌 외부 저장공간에 저장되어 있어 서로 공유할 수 있어야 한다. 이를 저장소라고 하며, 범위에 따라 Public 저장소와 Private 저장소로 나눌 수 있다. 이미지 저장소는 대표적으로 도커 허브가 있으며, 도커 허브에는 Public과 Private 저장소 둘 다 사용할 수 있다. 또한 Habor와 도커 레지스트와 같은 Private 저장소를 만들어 별도로 운영할 수도 있으며, Public 클라우드 서비스는 자체 이미지 저장소를 구성할 수 있다.
(3) 컨테이너
컨테이너는 이미지의 실행 형태이다. 쉽게 말해 이미지가 메모리에 올라가면 컨테이너, 컨테이너가 디스크에 저장되어 있으면 이미지이다. 하나의 컨테이너에는 하나의 애플리케이션만 실행되는 것이 권장되며, 추가로 실행할 수 있지만 유지하는 것은 권장하지 않는다.
3) 도커의 기능
(1) 이미지 생성
도커는 다양한 방법으로 이미지를 생성할 수 있다. 가장 대표적이며 일반적으로 사용하는 것이 Dockerfile이며, 그 밖에 컨테이너를 이미지로 생성하는 docker commit 명령과 컨테이너의 파일 시스템으로 이미지를 생성하는 docker export와 docker import 명령이 있다.
(2) 이미지 공유
도커는 저장소를 사용하여 이미지를 공유한다. 저장소에는 도커 허브뿐만 아니라 다른 프라이빗 이미지 저장소도 사용할 수 있다.
(3) 컨테이너 생성
도커는 컨테이너를 생성하고 관리를 할 수 있는 컨테이너 런타임이다. 컨테이너를 생성하고 네트워크 또는 볼륨과 같은 도커 오브젝트를 생성한 뒤 컨테이너에 연결하여 사용할 수도 있다.
2-2. 도커 설치
공식 홈페이지 - 설치가이드
1) 사전 패키지 설치
아래의 패키지들은 도커 패키지 저장소에 연결하거나 도커를 사용하면서 필요한 패키지들이다.
[devops@docker ~]$ sudo yum install -y yum-utils \
> device-mapper-persistent-data \
> lvm2
2) yum 저장소 설정
yum-config-manager로 docker-ce 패키지 저장소에 연결한다.
[devops@docker ~]$ sudo yum-config-manager \ > --add-repo \ > https://download.docker.com/linux/centos/docker-ce.repo
3) docker-ce 설치
docker-ce 패키지를 설치한다.
[devops@docker ~]$ sudo yum install -y docker-ce docker-ce-cli containerd.io
4) 서비스 실행 및 활성화
패키지가 설치되었으면 서비스를 실행한다.
[devops@docker ~]$ sudo systemctl start docker
서비스가 부팅 이후에도 동작하도록 활성화한다.
[devops@docker ~]$ sudo systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
5) docker 그룹 지정
devops 사용자가 sudo 명령을 사용하지 않더라도 docker 명령을 사용할 수 있게 설정해야 한다.
[devops@docker ~]$ sudo usermod -aG docker $USER
이 설정을 하고 난 뒤에는 로그아웃 했다가 로그인을 해야한다.
docker 그룹에 사용자를 추가하는 작업은 신원이 확실한 사용자가 아니면 권장하지 않는다. 컨테이너를 다루는 권한은 기본적으로 커널을 다루기 때문이다.
6) 도커버전 확인
docker를 설치하고 설정이 끝났으면 docker version 명령으로 버전 및 정보를 확인한다.
[devops@docker ~]$ docker version
Client: Docker Engine - Community Version: 19.03.8 API version: 1.40 Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:27:04 2020 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.8 API version: 1.40 (minimum version 1.12) Go version: go1.12.17 Git commit: afacb8b Built: Wed Mar 11 01:25:42 2020 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.13 GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: 1.0.0-rc10 GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: 0.18.0 GitCommit: fec3683
7) hello world 컨테이너 실행
프로그래밍을 처음 배울 때와 비슷하게 hello-world 컨테이너를 실행해본다.
[devops@docker ~]$ docker run hello-world
Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 1b930d010525: Pull complete Digest: sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e Status: Downloaded newer image for hello-world:latest Hello from Docker!
This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (amd64) 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https://hub.docker.com/ For more examples and ideas, visit: https://docs.docker.com/get-started/