기억의 저장소
도커란? 본문
"원티드 프리온보딩 백엔드 8월 코스" 를 듣고 정리한 글입니다.
처음에 회사에 들어갔을때 다른 사람이 만들어 놓은 메서드를 보고 이해가안간다면 히스토리를 파악하고 구조를 파악하면 이해하는데 도움이됩니다.
도커도 마찬가지로 어떠한 상황에서 만들어졌고 어떠한기반위에서 만들어졌는지 알게되면 좀더 깊게 이해할 수 있다 생각 하여 아래와 같은 구조로 도커를 설명하게 되었습니다.
도커가 왜 나오게 되었을까?
맨 처음에는 사진 제일 왼쪽에 있는 Bare Metal 환경 처럼 서버 OS에 맞는 소프트웨어를 올려 실행하게 되었습니다.
그런데 컴퓨터가 윈도우인데 어떤 프로그램이 리눅스 환경에서만 돌아가는 상황이 생기게 되었고 서버를 나누는 방식이든 어떻게든 해결했을것입니다. 서버를 나누기 싫은 개발자는 가상화 기술이라는것을 적용하게 되었고 이후 2번째 사진과 같이 가상 머신에 GuestOS를 올려 환경이 다른 문제를 해결하게 되었습니다.
그런데 가상 머신이란 방식은 OS를 만들고 OS 성격에 맞게 자원을 할당해주고하는 작업에 의해 정말 무거운 작업이 되었고 이후 OS 없이 필요한 라이브러리만을 가지고 실행하는 방식을 할 수 없을까?란 생각에서 시작되어 컨테이너란 개념이 나오게되었고 이후 컨테이너 기반으로 한 도커가 나오게 된것입니다.
(또한 중복된 Guset OS가 구성되는 문제점도 있었습니다.)
★ 가상화 (Virtualization) 기술이란 무엇일까?
고성능 서버를 조금 더 안정적이고 효율적으로 사용할 수 있을까?에서 나온 개념입니다.
하나의 물리적인 컴퓨터 자원(CPU, 메모리, 저장장치 등)을 가상적으로 분할하여 여러 개의 가상 컴퓨터 환경을 만들어 내는 기술 이를 통해 물리적인 컴퓨터 자원을 더욱 효율적으로 사용할 수 있으며, 서버나 애플리케이션 등을 운영하는데 있어 유연성과 안정성을 제공합니다.
★ 하이퍼 바이저란?
가상 머신(Virtual Machine, VM)을 생성하고 구동하는 소프 트웨어입니다.
OS에 자원을 할당 및 조율하며 OS들의 요청을 번역하여 하드 웨어에 전달 ( 컴퓨터 자원(cpu,memory)이있으면 Kernel(OS)이 자원을 할당받아 프로세스를 돌아가게함 파워포인트든 크롬이든 등등)
하이퍼바이저는 원래 있던 OS위에 있으며 gusetOS들에게 자원을 할당해주는 역할
하이퍼바이저는 Host OS 없이 하이퍼바이저만 있는것이 있고 Host OS 있이 동작하는것도 있다고합니다.
컨테이너 기술이란?
위에 설명드렸다 싶이 가상머신이 GuestOS로 인해 무거워지게 되었고 정말 느린속도라는 큰 문제점이 생기게 되었습니다.그래서 어떻게 이 문제를 해결할지 고민을 하다 해결책으로 나온것이 하이퍼바이저와 GuestOS를 없애고 컨테이너 엔진을 만들어 이를 대체한게 컨테이너 기술입니다. 그럼 컨테이너 기술이란 무엇일까요?
컨테이너 기술이란?
컨테이너기술이란 가상화기술중 하나입니다. 호스트 운영체제 위에 여러개 격리된 환경을 생성하며 각각 생성된 컨테이너 안에 애플리케이션을 실행합니다.(프로세스 단위의 격리 환경)
컨테이너를 실행할때 컨테이너엔진이 OS에게 자원을 할당받고 컨테이너엔진이 컨테이너에게 자원을 할당해서 컨테이너를 실행 하는 방식으로 동작합니다.
참고로 컨테이너는 리눅스 커널의 기능을 사용해서 만들어 졌습니다.
- chroot: 파일 시스템을 격리
- namespace: 프로세스 격리
- cgroup: 하드웨어 자원 격리
- 등의 기능을 가지고 있다.
★ 어떻게 애플리케이션 실행을 OS없이 할 수 있나?
리눅스 운영체제에는 이런 앱 실행방법이 내장되어 있습니다. 이러한 기술을 '컨테이너'라고 부르며
컨테이너 기술을 이용해서 이런 일을 쉽게 해주는 제품이 여러 가지 있지만, 가장 대표적인 제품이 바로 '도커'인 것입니다. (리눅스 컨테이너 기술(LXC) 기반)
Container Engine은 컨테이너를 관리하고 실행하는 시스템이며, 리눅스 커널의 기술을 사용하여 만들어졌다고 생각하시면 됩니다.
도커는 리눅스 컨테이너를 기반으로 하므로, 기본적으로는 리눅스 환경에서 동작하는 애플리케이션만 컨테이너화할 수 있습니다. 따라서 맥OS 기반 앱을 Docker를 이용해 직접 윈도우에서 실행시키는 것은 불가능합니다.(윈도우는 WSL을 통해서 가능)
이를 이해하기 위해서는 Docker의 작동 방식과 컨테이너 기술에 대한 이해가 필요합니다. Docker 이미지는 애플리케이션과 그 애플리케이션이 실행되기 위한 모든 종속성을 포함하고 있습니다. 이 이미지는 호스트 OS에 상관없이 동일하게 실행됩니다.
이미지를 만들 때 사용되는 OS는 실제로 이미지의 "기반"이 됩니다. 예를 들어 Ubuntu 기반 이미지는 Ubuntu OS의 기본 파일 시스템과 라이브러리를 포함하게 됩니다. 이 이미지는 호스트 OS가 무엇인지와 상관없이 Docker가 설치된 모든 시스템에서 실행될 수 있습니다.
이는 Docker 컨테이너가 완전한 가상 머신과는 달리, 전체 OS를 가상화하지 않기 때문입니다. 대신, Docker 컨테이너는 호스트 커널의 특정 기능(예: 네임스페이스, cgroups)을 사용하여 격리된 실행 환경을 제공합니다. 이 때문에, Docker 이미지는 그것을 실행하는 호스트 OS에 대해 "알 필요"가 없습니다. 이미지는 그 자체로 모든 실행에 필요한 것을 포함하고 있고, Docker는 이 이미지를 컨테이너로 변환하여 실행합니다.
따라서 Docker는 호스트 OS가 무엇이든 간에 "동일한 환경"을 보장할 수 있습니다. 단, 이것은 호스트 시스템이 Docker를 지원하고, 이미지가 사용하는 커널 기능을 호스트 커널이 지원하는 경우에만 해당됩니다. 예를 들어, Linux 커널 기능을 사용하는 이미지는 Linux 호스트에서만 실행될 수 있습니다. 이 때문에, Docker를 Windows나 macOS에서 사용할 때는 이런 Linux 커널 기능을 제공하는 가상 머신이 필요합니다.
도커란?
가상화 기술에는 가상머신 방식 컨테이너 방식이 있는데 도커는 컨테이너 방식을 기반으로한 오픈소스 플랫폼입니다.(컨테이너 기술에서 제일 지금 많이 쓰이고 있는것이 Docker입니다)
컨테이너 기반 가상화 도구이며 애플리케이션을 컨테이너 단위로 격리하여 실행하고 배포하는 기능을 가지고 있습니다.
('컨테이너'라는 격리된 환경에서 애플리케이션을 패키징, 실행, 배포)
(격리된 환경 : 독립적인 자원 사용을 보장하는 환경 ,환경간 통신은가능)
( 리눅스 컨테이너 기술인 LXC(Linux Containers) 기반)
도커 장점
- OS없이 필요한 라이브러리만으로 실행이 가능하므로 어플리케이션을 인프라에서 분리해줍니다.
- 인프라를 어플리케이션을 관리하는 것 처럼 관리 할 수 있습니다. (이미지로 필요한 모든 제반사항들을 패키징해서 배포를 하고 이컨테이너를 손쉽게 제어 함으로써 쉽게 관리할 수 있게됨)
도커 구조
어떠한 물건을 사용할때 이게 어떠한 구조로 되어있나 이해하면 문제점이 발생했을때 찾기 쉽고 그 물건에 대해 이해가 더 많이 된다 생각합니다. 그러므로 도커를 사용할때 어떤 구조로 되어있나 이해하고 넘어가는걸 추천드립니다.
Client
도커는 도커를 사용자하는 Client가 있고 이 Client는 위에 적혀있는 docker run 명령어를 통해 도커를 실행,배포하는등의 관리를 하게됩니다. Docker와 상호 작용 ,docker 명령어를 사용하면 Docker daemon으로 보내어 실행
Docker Host
Host는 컴퓨터라 생각하면됩니다. 여기서 중요한것은 Host가 아니고 Host위에 올라가 있는 도커데몬입니다.
도커 데몬이 올라가 있어 Client는 CLI에 명령어를 치게되면 도커 데몬에 요청을 하게되어 이미지를 만들고 이미지를 통해 컨테이너를 만들고 하는 작업을 하게됩니다.
★ 도커 데몬(Docker daemon = dockerd)
- 도커 엔진의 핵심 구성 요소
- 도커 호스트에서 컨테이너를 관리하고 실행하는 역할
- 컨테이너를 생성, 시작, 중지, 삭제하는 등의 작업을 수행
- 컨테이너 이미지를 관리하고 외부에서 이미지를 다운로드하고 빌드하는 작업을 수행
★ 도커 오브젝트 (Docker Object)
도커 데몬에서 어떤걸 관리해주냐 바로 도커오브젝트를 관리해줌 도커오브젝트에는 아래 두가지가 있습니다.
- 도커 이미지 (Docker Image) : 도커 컨테이너를 만들기 위한 읽기 전용 템플릿
- 도커 컨테이너 (Docker Container) : 한 도커 이미지의 실행 가능한 인스턴스 , 애플리케이션을 실행하기 위한 모든 파일과 설정 정보를 포함하는 패키지 (이미지를 통해서 컨테이너를 만들어 내는것)
Registry
도커 레지스트리 (Docker Registries)라고 불리며 도커 이미지 (Docker Image) 를 관리하고 저장하는 곳입니다.
제일유명 Registry는 Docker hub: 디폴트 레지스트리, 누구나 접근 가능한 공개형 저장소 입니다.
Registry는 앱스토어와 비유하면 좋습니다. 앱스토어에서 다운받아 설치하면 프로그램이되고 이걸 실행하면 프로세스가되는거와 마찬가지로 도커허브에서 다운받으면 이미지가 있고 이것을 실행하면 컨테이너가 되는것입니다.
도커는 왜 이런 구조로 만들게 되었을까요?
도커 구조가 왜 이렇게 되있을까? 왜 도커파일이란게 존재하고 이걸통해서 이미지란게 있고 또 이미지란걸 도커허브에서 받아올 수 있는구조로만들고 컨테이너는 왜 이미지를가지고 만들어져 실행하게 되었을까요?
(도커파일 : 컨테이너에 설치해야하는 패키지, 소스코드, 명령어, 환경변수, 설정 등을 기록한 파일 , 도커파일을 빌드하면 이미지가 생성)
제품을 만들때 대량의 제품을 만어야한다면?이란 생각을 해봅시다.
대량의 제품을 만들때 어떤 틀(금형)이 있다면 대량의 제품을 만들기 쉬워질것입니다. 그럼 금형을 만들기 위해선 설계서가 있을 것인데 설계서를 보니 금형을 만들기 위해 필요한 것들이 이미 창고에 보관되어있다면가져다가 쓸 수 있을것입니다. 결론을 말하자면 도커에서는 설계서(Dockerfile)을 통해 금형(image)를 만들때 금형을 만들때 필요한것들이 이미 제작되어있다면 가져다 쓸수 있게 창고를 만들어놓게 된것입니다. (금형을 가지고 있으면 어떠한 환경에서 제품을 생산할 수 있음 (도커 엔진만있다고하면) )
효율을 따지다 보니 이런 구조를 선택하게 된거 같습니다.
⭐ 왜 도커는 인프라를 어플리케이션을 관리하는 것 처럼 관리 할 수 있습니다라는 장점이 있나요?
위 도커 장점 설명에서 인프라를 어플리케이션을 관리하는 것 처럼 관리 할 수 있습니다.라는 장점을 설명 드린적이 있습니다. 도커의 이러한 구조때문에라고 말씀드릴 수 있는데요
프로젝트를 할때 Redis Mysql 등등의 애플리케이션 실행시 필요한것들을 새로운 서버를 생성할때마다 설정해 줘야하는 중복되는 작업으로인해 불필요한 비용이 소모가 되었습니다.
도커를 사용하여 이미지 한개를 잘 생성해 놓으면 새로운 서버가 생성되어도 필요한 이미지들을 만들어 잘 패키징하여 사용하면 필요한 인프라를 애플리케이션을 관리하는거처럼 사용할 수 있게 되는 큰 장점이 있다 생각합니다.
Docker Network
Network Drivers [공식 문서]
- bridge: 기본 네트워크 드라이버, 동일한 도커 호스트에서 컨테이너 간의 통신을 도와줌.
- host: 호스트의 네트워크를 직접 사용할때 이 드라이버 사용
- overlay: 서로 다른 도커 호스트의 컨테이너 간 통신을 도와줌
브리지는 호스트 안에 가상의 네트워크공간이 만들어지고 이 가상의 네트워크공간에 만들어진 컨테이너 끼리 통신하기 위해 만들어놓은 네트워크라고생각한다 브리지 네트워크 그래서 인터넷공유기처럼 다른곳에서 요청이들어오면 브리지네트워크를 통해 해당 컨테이너로 간다 생각한다.
https://yoo11052.tistory.com/208
https://docs.docker.com/network/drivers/
https://seosh817.tistory.com/373
https://velog.io/@jaeyunim/Docker-Network-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0
도커컴포즈 + 네트워크
https://choincnp.tistory.com/71
도커 컴포즈란? 공식사이트
도커 컴포즈란 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구를 말합니다.
왜 도커 컴포즈를 사용할까요?
예시로 애플리케이션을 띄워야하고 mysql도 띄워야하고 redis도 띄워야하고 등등... 띄워야하는 상황이 있다고 할때 컴포즈가 없다면 docker run.. docker run... 계속해서 필요한것들을 띄워야합니다.
도커 컴포즈를 사용한다면 yaml 파일에 내가 필요한것들을 작성하면 docker compose가 docker가 이해할 수 있는 명령어로 바꿔 개발자는 yaml을 한번 실행하면 필요한 모든것들이 컨테이너화 되어 동작하게 됩니다.
https://velog.io/@jaeyunim/%EC%9B%90%ED%8B%B0%EB%93%9C-%EC%B1%8C%EB%A6%B0%EC%A7%80-24-docker-compose
컨테이너 오케스트레이션이란?(feat 쿠버네티스)
도커 컴포즈로 여러개의 필요한것들을 한번에 띄우는것은 가능했지만 프로덕션환경에서 컨테이너들을 관리하는것도 필요했습니다. 그래서 나온것이 바로 컨테이너 오케스트레이션입니다.
컨테이너 오케스트레이션이란?
컨테이너 오케스트레이션은 컨테이너의 배포, 관리, 확장, 네트워킹을 자동화합니다. 오케스트레이션이란 그 말 뜻 그대로 여러 개의 컴퓨터 시스템, 앱, 서비스 등을 조율하고 관리하는 것으로, 여러개의 작업을 함께 연결하여 방대한 work-flow나 프로세스를 실행하는것을 말합니다.
컨테이너 오케스트레이션 툴과 제공하는 업체
- GCP(Google Cloud Flatform)에서 제공
- GKE(Google Kubernetes Engine)
- AWS(Amazon Web Service)에서 제공
- EKS(Elastic Kubernetes Service)
- ECS(Elastic Container Service)
https://choincnp.tistory.com/75
부록
1. 도커의 사이클
이미지를 통해 컨테이너가 created가 되고 run을 해야 컨테이너가 running하는것입니다.
docker run은 create하고 run하는것을 말합니다.
2. 기본 명령어
- pull : 이미지를 도커허브로부터 가져온다.
- docker pull [options] name [:tag|@digest]
- 예: 아파치 웹서버(httpd) 설치 -> docker pull httpd
- run :
- 예: '마운트할_경로'를 httpd의 document root로 마운트하여 아파치 웹서버를 띄우고 싶은 경우 -> docker run -d -p 8888:80 -v 마운트할_경로:/usr/local/apache2/htdocs httpd
- -p : publish. 호스트와 컨테이너의 포트를 연결
- -d : detached. 도커이미지나 도커파일을 백그라운드로 실행
- ps : 도커 이미지 프로세스 확인
- docker ps
- -a : all. 삭제되지 않은 모든 프로세스 확인(stopped 상태의 컨테이너도 확인 가능)
- stop: 도커 프로세스 중단 (종료된 것 아님)
- rm: 도커 프로세스 제거 (종료)
- 예: docker rm [컨테이너id]
- rmi: 도커 이미지 제거
- 예: docker rmi [컨테이너id]
- exec: 컨테이너에 명령어 입력
- docker exec -it [컨테이너id] /bin/sh : 해당 컨테이너 쉘 진입
- sh 는 shell로써 사용자가 글자를 입력하여 컴퓨터에 명령할 수 있도록 하는 프로그램을 말합니다.
bash를 사용할수있는데 shell과 비슷한 프로그램이라 생각하시면됩니다.
3. Node
쿠버네티스에서 node라는 개념이 등장하는데 요약하자면, "node"는 Docker Swarm 클러스터 내의 물리적인 또는 가상의 컴퓨터를 가리키며, "컨테이너"는 Docker에서 실행되는 경량 가상화된 환경을 의미합니다. Docker Swarm을 사용할 때, 여러 노드가 클러스터의 일부로 작동하여 컨테이너화된 애플리케이션을 조율하고 관리합니다.
4. docker compose 에서 --build 의미
build를하면 이미 있더라도 새로운 이미지를 빌드해서 컨테이너를 만든다는것
5. 데몬이란?
"데몬"은 컴퓨터 과학에서 사용되는 용어로, 백그라운드에서 실행되며 특정 작업을 수행하는 프로그램을 나타냅니다.
5. 그냥 프로그램 실행하는 것과 무엇이 다른가요?
일반적으로 "프로그램 실행"은 하나의 컴퓨터에서 특정 프로그램을 실행하는 것을 의미합니다. 이때 프로그램은 해당 컴퓨터의 운영 체제에 맞게 컴파일되어 실행되며, 프로그램이 필요한 라이브러리 및 종속성은 시스템에 설치되어 있어야 합니다. 다른 운영 체제에서 실행하려면 프로그램을 해당 운영 체제에 맞게 다시 컴파일하고, 필요한 종속성을 다시 설치해야 합니다. 이는 환경에 따른 호환성 문제와 개발 및 배포의 복잡성을 야기할 수 있습니다. 반면에 도커는 컨테이너 기술을 사용하여 애플리케이션을 패키징하고 실행하는 것을 말합니다. 도커 컨테이너는 모든 필요한 종속성을 포함하며, 호스트 시스템의 운영 체제와는 별도로 격리된 환경에서 실행됩니다. 이로써 애플리케이션과 그 종속성을 컨테이너 이미지로 패키징하여 동일한 실행 환경을 보장하며, 호스트 시스템의 운영 체제와는 독립적으로 동작합니다. 따라서 도커를 사용하면 애플리케이션을 컨테이너 이미지로 묶어 배포할 수 있으며, 이 이미지는 여러 환경에서 동일한 방식으로 실행될 수 있습니다. 또한 개발, 테스트, 운영 간의 차이를 줄이고, 애플리케이션 배포의 일관성과 안정성을 확보할 수 있습니다. 이것이 도커의 핵심 가치 중 하나입니다.
요약하면, 프로그램 실행은 특정 운영 체제에 맞게 실행되는 것이고, 도커 컨테이너 실행은 컨테이너 이미지를 통해 애플리케이션과 종속성을 포함한 실행 환경을 패키징하여 독립적으로 실행하는 것입니다.
끄적
EKS ECS 둘다 컨테이너 관리 오케스트레이션이지만 EKS는 설정이나 그런게 더 많이해야하는것이고 ECS는 간소화되어 더욱 빠르게 컨테이너 오케스트레이션을 할 수 있는 환경을 말함
ECS는 서비스가 있는데 이 서비스에 스케일링 그런것을 지정해놓고 테스크들을 관리하게 만
참고
https://choincnp.tistory.com/68
https://choincnp.tistory.com/69
https://choincnp.tistory.com/70
https://choincnp.tistory.com/74
https://github.com/drum-grammer/docker-pro-2308
도커파일
https://rampart81.github.io/post/dockerfile_instructions/#run
ECS에서 나온 프로비저
https://web-front-end.tistory.com/104