도커는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다.
도커는 다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공해 프로그램의 배포 및 관리를 단순하게 해줍니다. 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 프로그램과 관련된 모든 것들을 컨테이너로 추상화할 수 있고, 클라우드 서버에서도 이를 작동시킬 수 있습니다.
쉽게 말해서… 집에서 Maria db를 설치하고, Maria db port를 33306 같은 느낌으로 변경하고, 구성 정보를 기획한 프로그램에 알맞게 변경했다고 합니다.
이 db를 다른 곳에도 설치를 해야 하는데 만약 도커를 사용하지 않는다면 포트 번호를 33306로 변경하고, 구성 정보도 변경해야하고… 귀찮은 작업을 반복해서 해야하는 것이지요.
이를 해결하기 위해 나온 것이 도커입니다!
1. 장점
가상 머신에 리눅스를 설치한 뒤, 각종 서버와 DB를 설치하고 개발한 애플리케이션이나 웹사이트를 실행하고는 하는데, 이렇게 세팅한 가상 머신의 이미지를 여러 서버에 복사하고 실행하면서 이미지 하나로 서버를 여러 개를 생성해 운용하는 방식입니다.
이러한 도커는 가상머신보다 조금 더 경량화된 방식입니다. Docker 이미지에 서버 운영에 필요한 프로그램과 라이브러리만 격리해서 설치할 수 있습니다.
이렇게 되면 이미지 용량이 크게 줄어 들고, 가상화 레이어가 없기 때문에 파일 시스템, 네트워크 속도도 도커를 사용하는 편이 가상 머신에 비해 월등히 빠릅니다!
2. 이미지
이미지는 컨테이너 실행에 필요한 파일과 설정 값등을 포함하고 있는 것으로, 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행파일 들을 묶는 형태를 이미지라고 부릅니다.
이러한 이미지는 특정 프로그램을 실행하기 위한 모든 파일과 설정값을 지니고 있어서, 별도로 설정 파일을 변경하거나 의존성 파일을 추가적으로 설치하거나 할 필요가 없이 있는 그대로 사용할 수 있는 상태의 파일을 의미합니다.
추가적으로, 컨테이너는 이미지를 실행한 상태를 말합니다.
예를 들어, 우분투 이미지는 우분투를 실행하기 위한 모든 파일들을 가지고 있고, 이 이미지를 실행하게 되면 우분투 컨테이너가 생성되게 됩니다!
특징
1) 이미지는 불변성을 가집니다.
2) 하나의 이미지로 여러 개의 컨테이너를 생성할 수 있고, 컨테이너가 삭제되더라도 이미지는 변하지 않고 그대로 남아있습니다.
3) 도커 이미지는 github와 마찬가지로 버전 관리를 할 수 있으며, DockerHub에서 이러한 서비스를 제공합니다.
4) 다양한 API를 제공하기 때문에 자동화가 가능합니다.
5) 도커는 Dockerfile이라는 파일로 이미지를 만듭니다. 이 Dockerfile에는 소스와 함께 설정 파일 같은 것들을 버전 관리 하기 쉽도록 명시되어집니다.
3. 레이어
레이어란, 기존 이미지에 추가적인 파일이 필요할 때 새로운 이미지를 다시 다운로드 받지 않고 해당 파일을 추가하기 위한 개념입니다.
사실 이미지가 여러 가지 라이브러리로 묶여서 하나의 이미지로 되어 있다고 생각하면 버전 관리를 하기가 어렵겠죠?
애초에 예를 들었던 우분투 이미지를 생각하면, 우분투를 구동하기 위한 라이브러리A, B, C가 있다고 했을 때 이를 레이어A, 레이어B, 레이어C로 구성하여 묶은 것을 이미지로 사용하게 되는 것입니다.
처음으로 만들어진 ubuntu 이미지의 레이어들은 변경할 수가 없습니다(read only)
하지만 nginx라는 라이브러리를 설치한 이미지에는 nginx 레이어가 추가적으로 생성이 된다는 개념으로, ubuntu 이미지에 새로 추가된 레이어를 묶어서 nginx 이미지로 다시 포장할 수가 있습니다.
이때 DockerHub에서 공유된 이미지에서 Pull을 한다면 새로 추가된 nginx의 이미지만 Pull이 될 것입니다.
4. 컨테이너
컨테이너는 이미지를 실행한 상태를 말하며, 컨테이너는 소프트웨어의 실행에 필요한 실행환경을 독립적으로 운영할 수 있도록 다른 실행환경과의 간섭을 막고, 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 말합니다.
이러한 컨테이너는 애플리케이션을 실제 구동 환경으로부터 추상화 할 수 있는 논리 패키징 메커니즘을 제공합니다.
특징
1) 컨테이너는 이미지 Layer에 read-write Layer라는 특정 레이어를 추가하는 것으로 생성됩니다.
따라서 여러 개의 컨테이너를 생성해도 이 read-write Layer에서 기록이 되어서 최소한의 용량으로 사용할 수가 있습니다.
2) 컨테이너가 종료되어도 메모리에선 삭제가 되지 않고 남아 있습니다. 이를 삭제하려면 명시적으로 삭제해야 합니다.
3) 컨테이너를 삭제하는 것은 컨테이너에서 생성한 파일이 사라진다는 것을 의미합니다. 예를 들어, 데이터베이스 스키마를 삭제하면 그 안의 테이블이 모두 사라지는 것처럼요.
4) 한 서버는 여러 개의 컨테이너를 가질 수 있고, 이 컨테이너들은 독립적으로 운용이됩니다.
5) 마지막으로 컨테이너는 커널 공간과 호스트OS의 자원을 공유합니다.
5. Docker 사용 예
컨테이너는 애플리케이션을 환경에 구애받지 않고 실행하는 기술입니다.
예를 들어, 깃랩이라는 도구를 우분투에 설치하려면 깃랩 공식 문서에서는
sudo apt-get update
sudo apt-get install -y curl openssh-server ca-certificates
sudo apt-get install -y postfix
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" apt-get install gitlab-ee
이러한 명령어를 입력하라고 안내를 하는데, cent os를 사용한다면 명령어가 조금 달라집니다.
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ee
하지만 컨테이너 도구인 Docker를 사용한다면 어느 환경이든 상관 없이 다음 명령어를 사용해 깃랩을 실행시킬 수가 있습니다.
docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
사실상 도커 없이도 배포/운영을 할 수 있고, 그것에 대해 큰 불편함을 느끼지 않는다면 굳이 Docker를 사용해야할 필요성이 없겠지만, Docker를 사용하게 된다면 기존에 사용하면서 느껴왔던 문제점들을 조금이나마 해결할 수 있다는 장점이 있습니다.
'Backend&Devops > Docker' 카테고리의 다른 글
[Docker] Docker Compose 문법 정리 (0) | 2021.12.23 |
---|---|
[Dockerfile] Dockerfile express 연동하기 (0) | 2021.12.21 |
[Dockerfile] Dockerfile이란? Dockerfile 옵션 (1) | 2021.12.21 |
[Docker] 도커에 젠킨스 설치, 도커에 젠킨스 연동 (0) | 2021.12.14 |
[Docker] 도커 명령어 정리 (1) | 2021.12.09 |