반응형
클라우드 환경이 나타난 배경
- 기존 : 서버 1개 서비스 1개
- 하드웨어 기반 가상화(virtualbox) : 서버 1개, OS 여러개, 서비스 여러개
- OS 기반 가상화(도커) : 서버 1개, OS 1개, 서비스 여러개
기존 | 하드웨어 기반 | 가상화OS 기반 가상화 | |
특징 |
|
|
마치 별도의 서버인 것 처럼 사용할 수 있게 만든 것
|
예시 | - ubuntu 서버에 웹 서버를 실행한다 - ubuntu 서버에 웹 서버 2개, 메일 서버, opengrok 서버를 실행한다 |
- Virtual Box를 사용해서 Window 호스트 서버에 ubuntu 게스트 OS를 생성한다 -> CPU는 4코어 중 2코어 할당, 메모리는 8GB 중 4GB 할당 - 게스트 OS에 웹 서버 등을 실행한다 |
- Docker를 사용해서 웹 서버를 구축하는데 필요한 httpd image를 만들고 container를 만들어서 httpd 웹 서버를 실행한다 |
단점 |
2) 같은 파일 시스템을 사용해서 다른 앱 간 데이터 덮어 씌우기 가능 |
- 가상화를 위한 자원 할당이 필요함 - I/O 속도가 느림 |
docker?
- 리눅스 컨테이너 + 기능
- 가상 머신과 다르게 성능 손실이 거의 없음
- docker engine, docker와 관련된 모든 프로젝트를 의미.
- docker engine?
- 컨테이너를 생성하고 관리함
docker container 구조
- Host의 OS를 사용함.
- 리눅스 자체 기능인 chroot, namespace, cgroup을 사용.
=> 프로세스 단위 격리 환경 만듦
docker 특징
- 컨테이너 외부 Host의 커널 사용
- 컨테이너 내부에는 앱 실행에 필요한 라이브러리 및 실행파일만 존재.
- 컨테이너를 배포할 때 컨테이너 => 이미지로 패키징해서 전달.
- 마이크로서비스로 구성한다면 기능 별로 컨테이너 분리 가능
- ex) 웹 서비스의 경우 DB 컨테이너/ 웹 서버 컨테이너 분리
- => 컨테이너가 많아질 때 docker swarm이나 k8s를 사용
chroot
: root directory 격리 기술
- 컨테이너 생성 시 실행할 파일을 미리 컨테이너에 저장해두는 용도
위 그림을 기준으로 프로세스 K에서는 /, /B, /C 폴더에 접근할 수 없으니
기존 시스템을 변경하지 않고 프로세스 수행하게 됨.
그래서 /A로 루트를 변경하게 되면 /A에 /처럼 파일시스템을 구성해줘야함.
/A/bin/bash 가 있어야 chroot /A /bin/bash가 실제로 실행됨.
(ldd로 프로그램이 사용하고 있는 라이브러리를 추적해서
/bin/bash가 사용하는 라이브러리도 /A 밑으로 위치 변경해줘야 함)
namespace
: 프로세스를 격리하는 가상화 기술
- 격리되는 자원 : mount, uname, PID, network, IPC, root user
- 시스템 콜 함수 unshare()를 사용해 현재 프로세스를 새로 지정된 네임스페이스에 연결
- 컨테이너는 하나의 커널을 공유해서 사용하기 때문에 각 컨테이너마다 격리된 사용자 환경을 제공
cgroup
: Control group
- 특정 프로세스가 자원을 독점하는 것을 제한
- 프로세스 그룹의 CPU, memory, network, storage 자원 할당과 제어를 하는 커널 기능
iptables
- 패킷 필터링(방화벽 역할)
- NAT : 패킷 포워딩(전달)
도커 엔진 설치
- docker EE : 유료 기업용 솔루션
- docker CE : 무료. 기술 지원이나 서비스 제공 없음. ✅ 무료니까 이거씀
공식 문서를 보자
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# x86_64
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
아래 명령어로 docker 설치 확인할 수 있음
sudo docker info
도커 엔진
- 기본 단위 : image, container
docker image
- image를 기반으로 container가 생성됨.
- 여러 계층으로 된 binary 파일로 돼 있고 컨테이너를 생성하고 실행할 때 읽기 전용을 사용됨
- => 컨테이너가 이미지를 바꿀 수 없다는 말인듯
- 이미지 이름 형식 : <저장소 이름>/<이미지 이름>:<태그>
- 저장소 이름 : 없을 수도 있음. docker 원격 저장소의 이름.
- 태그 : 이미지 버전 관리 or revision 관리에 사용됨. 태그가 없으면 default 값은 latest
docker container
- image에서 컨테이너를 생성
- 컨테이너의 역할에 필요한 파일시스템을 사용(chroot)
- 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립 공간이 생성(namespace)
'개발 > DevOps' 카테고리의 다른 글
docker docs 따라하기 - Docker Registry 다루기 (0) | 2021.08.10 |
---|---|
[정리] prometheus vs graphite (0) | 2021.03.03 |
Docker docs 따라하기 - 4. bind mount를 사용하기 (0) | 2021.02.09 |
Docker docs 따라하기 - 3. DB를 고정하기(named volume 사용) (0) | 2021.02.09 |
Docker docs 따라하기 - 2. online에서 docker 실행하기 (0) | 2021.02.09 |
댓글