Docker의 개요 및 설치

2024. 1. 7. 18:37b정리/rocky8로 도커핵심 이해하기

728x90
반응형

Docker는 운영체제 레벨 가상화를 사용하여  컨테이너라고 부르는 패키지 형태로 애플리케이션을 배포하는 오픈 소스 프로젝트이다. 서버 운영에 필요한 프로그램과 라이브러리만 이미지로 만들어 프로세스처럼 동작시키는 경량화된 가상화 방식이다. 

https://armin.tistory.com/373

도커 이미지와 도커 컨테이너

명칭 설명
도커 이미지 도커 컨테이너를 구성하는 파일 시스템과 실행할 애플리케이션 설정을 하나로 합친 것으로 컨테이너를 생성하는 일종의 틀로 탬플릿이다. 도커 이미지를 줄여서 이미지라고 부른다.
도커 컨테이너 도커 이미지를 기반으로 생성되며, 파일 시스템과 애플리케이션을 구체화하여 실행된 상태이다. 도커 컨테이너를 줄여서 컨테이너라고 부른다.

도커의 기능

  • Build -  Docker Image를 만드는 기능
  • Ship - Docker Image를 공유(ship/share)하는 기능
  • Run - Docker Image를 동작시키는 기능

도커 이미지 만들기(build)

Docker Image는 docker 명령을 사용한 수동방식과 Dockerfile을 사용한 자동방식으로 생성할 수 있다.

도커 이미지는 Dockerfile 사용하여 만들 것을 권장
도커에서는 하나의 이미지에 하나의 애플리케이션만 넣어두고, 여러 개의 컨테이너를 조합하여 서비스를 구축하는 방법 권장

[도커 이미지 생성 예]

CentOS 이미지(BASE Image)
/
| -- dev
| -- etc
| -- sbin
| -- usr
| -- var
| -- .....
Apache 이미지(Application Image)
etc/httpd/conf/httpd.conf
usr/bin/apachectl
usr/sbin/httpd
var/www/html/index.html
var/log/httpd/access_log
........
웹 서버용 이미지(생성된 Docker Image)
/
| -- dev
| -- etc
|    -- httpd
|       -- conf
|         -- httpd.conf
| -- sbin
| -- usr
|      -- bin
|         -- apachectl--
|      -- sbin
|         -- httpd
| -- var
|     -- log
|        -- httpd
|           -- access_log
|     -- www
|        -- html
|           -- index.html
| -- .....

도커 이미지 공유

도커 이미지는 Docker Hub라고 부르는 도커 레지스트리를 이용해서 공유 할 수 있다. 도커 레지스트리는 docker 명령을 사용하여 로그인하고 이미지를 검색, 업로드, 다운로드할 수 있는 공유 저장소이다. Docker Hub는 GitHub 또는 Bitbucket 등과 연계하여 사용할 수 있으며, GitHub 상에 Dockerfile을 관리하고, 거기서 Docker 이미지를 자동으로 생성하여 Docker Hub에 공개하는 것도 가능하다.

도커 이미지 동작

Docker는 하나의 리눅스 커널을 여러 개의 컨테이너에서 공유하고 있다. 컨테이너 안에서 작동하는 프로세스를 하나의 그룹으로 관리하고, 그룹마다 각각 파일 시스템이나 호스트명, 네트워크등을 할당한다. (chroot + namespace + cgroups)

도커 컴포넌트

도커는 클라이언트-서버 아키턱처를 사용한다. 도커 클라이언트는 도커 컨테이너를 빌드, 실행 및 배포하는 작업을 수행하는 도커 데몬과 통신한다. 클라이언트는 동일한 시스템 혹은 원격 도커 데몬에 연결할 수 있다. 유닉스 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용하여 통신한다.

[Docker Component]

명칭 설명
Docker Engine
(docker-ce)
Docker Client 도커 명령줄 인터페이스
Docker API REST API
Docker Daemon 도커 데몬
Docker Object Image/Container. Network, Volumes, Plugins
Docker Registry 이미지 공유 및 공개
Docker Compose 다중 컨테이너 애플리케이션을 정의하고 실행하는 도구
Docker Swarm 클러스터 관리(도커 오케스트래이션)

Docker 기반 기술

도커는 GO 프로그래밍 언어로 작성되었으며, 리눅스 커널의 여러 기능을 활용하여 기능을 제공한다. 도커는 해당 컨테이너에 대한 Namespace Set(chroot+namespace+cgroups)를 생성한다. 

root 디렉터리를 변경하는 기술 (chroot)

운영체제에서 chroot는 현재 실행중인 프로세스와 자식 프로세스 그룹에서 최상위(root) 디렉터리를 변경하는 기술을 말한다. 보통 특정 프로세스의 최상위 디렉터리를 지정하게 되는데, 지정된 최상위 디렉터리를 벗어나 상위 디렉터리로의 접근을 막는 환경을 구축한다. 이런 환경으로 인해 chroot 감옥 이라고도 부른다.

https://www.howtogeek.com/441534/how-to-use-the-chroot-command-on-linux/

 

How to Use the chroot Command on Linux

Go directly to jail and do not pass root. chroot makes it simple to set up ring-fenced environments In Linux.

www.howtogeek.com

https://www.geeksforgeeks.org/chroot-command-in-linux-with-examples/

 

chroot command in Linux with examples - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://www.geeksforgeeks.org/linux-virtualization-using-chroot-jail/

 

Linux Virtualization - Chroot Jail - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

https://www.44bits.io/ko/post/change-root-directory-by-using-chroot

 

컨테이너 기초 - chroot를 사용한 프로세스의 루트 디렉터리 격리

chroot는 프로세스의 루트 디렉터리를 변경하는 리눅스 시스템콜/명령어입니다. 루트를 변경함으로써 아주 기초적인 단계의 컨테이너를 구현해볼 수 있습니다. chroot는 아주 단순한 프로그램입니

www.44bits.io

chroot 명령어와 docker 명령어의 비교

chroot /home/nacyot/new_root /bin/bash
docker run -it ruby:2.5 /bin/bash

루트 디렉터리를 변경하면 특정 프로세스(K)가 상위 디렉터리에 접근할 수 없도록 격리 시킬 수 있습니다. 정확히 이 역할을 하는 것이 chroot 명령어

chroot 입문: 새로운 루트에서 프로그램 실행하기

# 의존성 확인
ldd /bin/bash

cp /lib64/libtinfo.so.6 /tmp/new_root/lib64/
cp /lib64/libdl.so.2 /tmp/new_root/lib64
cp /lib64/ld-linux-x86-64.so.2 /tmp/new_root/lib64
cp /lib64/libc.so.6 /tmp/new_root/lib64
cd /tmp/new_root/lib64/

컨테이너를 구획화하는 장치

리눅스 namespace는 시스템 리소스를 격리하고 가상화하는 리눅스 커널 기능이다. 네임스페이스로 제한된 프로세스는 동일한 네임스페이스의 일부인 리소스 또는 프로세스 간에만 상호 작용할 수 있다.

 

https://www.44bits.io/ko/keyword/linux-namespace

 

리눅스 네임스페이스(Linux Namespace)란?

리눅스 네임스페이스는 프로세스를 실행할 때 시스템의 리소스를 분리해서 실행할 수 있도록 도와주는 기능입니다. 한 시스템의 프로세스들은 기본적으로 시스템의 리소스들을 공유해서 실행

www.44bits.io

릴리스 관리 장치 cgroups, control groups

cgroups는 프로세스 모음의 자원 사용량(CPU, Memory, Dis I/O, network 등)을 제한, 확인,격리하는 리눅스 커널 기능이다. Docker는 cgroups을 사용하여 자원 제한을 제어하고 격리한다. 

  • blkio — 이 서브시스템은 물리 드라이브 (예: 디스크, 솔리드 스테이트, USB 등)와 같은 블록 장치에 대한 입력/출력 액세스에 제한을 설정합니다.
  • cpu — 이 서브시스템은 CPU에 cgroup 작업 액세스를 제공하기 위해 스케줄러를 사용합니다.
  • cpuacct — 이 하위 시스템은 cgroup의 작업에 사용된 CPU 자원에 대한 보고서를 자동으로 생성합니다.
  • cpuset — 이 서브시스템은 개별 CPU (멀티코어 시스템에서) 및 메모리 노드를 cgroup의 작업에 할당합니다.
  • devices — 이 서브시스템은 cgroup의 작업 단위로 장치에 대한 액세스를 허용하거나 거부합니다.
  • freezer — 이 서브시스템은 cgroup의 작업을 일시 중지하거나 다시 시작합니다.
  • memory — 이 서브시스템은 cgroup의 작업에서 사용되는 메모리에 대한 제한을 설정하고 이러한 작업에서 사용되는 메모리 자원에 대한 보고서를 자동으로 생성합니다.
  • net_cls — 이 서브시스템은 Linux 트래픽 컨트롤러 (tc)가 특정 cgroup 작업에서 발생하는 패킷을 식별하게 하는 클래식 식별자 (classid)를 사용하여 네트워크 패킷에 태그를 지정합니다.
  • ns  namespace 서브시스템

https://www.redhat.com/sysadmin/cgroups-part-one

 

A Linux sysadmin's introduction to cgroups

Defining cgroups and how they help with resource management and performance tuning in this first article kicking off a four-part series covering cgroups and resource management.

www.redhat.com

https://access.redhat.com/documentation/ko-kr/red_hat_enterprise_linux/6/html/resource_management_guide/ch01

 

1장. 컨트롤 그룹 (Cgroups) 소개 Red Hat Enterprise Linux 6 | Red Hat Customer Portal

Access Red Hat’s knowledge, guidance, and support through your subscription.

access.redhat.com

https://ko.wikipedia.org/wiki/Cgroups

 

cgroups - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. cgroups(control groups의 약자)는 프로세스들의 자원의 사용(CPU, 메모리, 디스크 입출력, 네트워크 등)을 제한하고 격리시키는 리눅스 커널 기능이다. 구글의 엔지니

ko.wikipedia.org

https://junsoolee.gitbook.io/linux-insides-ko/summary/cgroups/linux-cgroups-1

 

Introduction to Control Groups - linux-insides-ko

Cgroups는 리눅스 커널이 제공하는 특별한 메커니즘으로, 프로세서 시간, 그룹당 프로세스 수, 제어 그룹당 메모리 양 또는 프로세스 또는 프로세스 집합에 대한 리소스 조합과 같은 일종의 '리소

junsoolee.gitbook.io

도커 설치

  • Docker 관련 문서

Docker docs - https://docs.docker.com 

 

Home

Home page for Docker's documentation

docs.docker.com

Install Docker Engine - https://docs.docker.com/engine/install/

 

Install Docker Engine

Learn how to choose the best method for you to install Docker Engine. This client-server application is available on Linux, Mac, Windows, and as a static binary.

docs.docker.com

Install Docker Engine on CentOS - https://docs.docker.com/engine/install/centos/ 

 

Install Docker Engine on CentOS

Learn how to install Docker Engine on CentOS. These instructions cover the different installation methods, how to uninstall, and next steps.

docs.docker.com

저장소 추가할 때 'dnf config-manager' 명령 대신에 'yum-config-manager' 명령어를 대신 사용할 수 있는데 . 이경우에는 yum-utils 패키지를 추가로 설치해야 한다.
# dnf install yum-utils

(1) 설치 개요

록키 리눅스에 도커를 설치할 때 명령행에서 직접 명령을 입력해서 설치하는 방법과 도커 사이트에서 제공되는 스크립트를 이용해 설치하는 방법도 있다.

 

설치 전 기존에 도커를 사용한 적이 있다면 해당 패키지를 제거해야 한다. docker-ce 패키지와 충돌이 발생할 수 있는 runc, podman, buildah 등이 설치되어 있는 경우 삭제해야만 정상적으로 docker-ce를 설치 할 수 있다.

sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine \
                  podman \
                  runc
참고로 Image, containers, volumes, network 등은 /var/lib/docker/ 디렉터리에 저장되어 있는데, 이 안에 있는 것들은 자동 제거되지 않는다

 

충돌 패키지 삭제 예

dnf remove runc

 

(2) 명령으로 설치하기

1. 패키지 데이터베이스 업데이트 확인 및 진행

dnf check-update
dnf update

 

2. 도커의 CentOS(Rocky Linux) 전용 저장소를 추가

dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo

 

3. 추가된 저장소를 확인

dnf repolist

 

4. docker-ce 패키지 설치

dnf install docker-ce

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 

5. 설치된 docker 버전 확인

docker version

start docker/hello-world 뛰어보기

sudo systemctl start docker
systemctl enable --now docker.service
systemctl status docker.service
sudo docker run hello-world
docker container run ubuntu /bin/echo "Hello World"

docker container ps -a
docker container rm [컨테이너 ID]

컨테이너 삭제

docker container rm [컨테이너 ID or 컨테이너 NAME]

더보기

Uninstall Docker Engine

  1. Uninstall the Docker Engine, CLI, containerd, and Docker Compose packages:
  2.  
  3. $ sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras
    
  4. Images, containers, volumes, or custom configuration files on your host aren't automatically removed. To delete all images, containers, and volumes:
  5. $ sudo rm -rf /var/lib/docker
    $ sudo rm -rf /var/lib/containerd
    

You have to delete any edited configuration files manually.

(3) 스크립트를 이용한 설치 과정

설치 스크립트 파일 다운로드/ 스크립트 파일을 이용해서 설치
curl -fsSL https://get.docker.com-o get-docker.sh
sh get-docker.sh DRY_RUN=1

 

Nginx 웹 서버 가동하기

개요

Nginx 웹 서버 이미지를 docker hub 사이트에서 검색하여 이미지를 다운로드한 후에 가동한다.

실습

1. nginx 이미지 검색

docker search nginx
docker search nginx | grep nginx

 

2. nginx 관련 docker 이미지 다운로드

docker image pull nginx

 

3. nginx 관련 docker 이미지 정보 확인

 

4. docker 이미지 목록 확인

docker image ls

 

5. docker 실행 환경 확인

docker system info

6. docker 디스크 사용량 확인

docker system df

 

7. docker 이미지 목록 확인

 

8. docker 컨테이너 프로세스 확인

docker container ps

 

9. nginx 컨테이너 실행

docker container run --name webserver -d -p 80:80 nginx

10. 명령행에서 웹페이지 확인 / 웹 브라우저를 사용해서 확인

 

11. nginx 컨테이너 프로세스 확인

 

12. nginx 컨테이너 모니터링

docker container stats webserver

webserver로 지정된 nginx 컨테이너의 자원 사용량 정보를 실시간으로 확인할 수 있다. 명령을 중지시키려면 ctrl+c를 사용한다.

 

13. nginx 컨테이너 중지

 

14. nginx 컨테이너 재가동하기

 


참조사이트:

https://armin.tistory.com/373

 

[CS overview] Docker container 구성요소 ( 도커 구성요소 )

Docker의 구성도 및 구성요소 가. Docker의 구성도 - Docker 레지스트리 이미지를 통해 원하는 기능의 Container를 생성 나. Docker의 구성요소 구성요소 설 명 도커 데몬 (Docker Daemon) - Docker API 요청을 수신

armin.tistory.com

 

반응형

'b정리 > rocky8로 도커핵심 이해하기' 카테고리의 다른 글

Docker 기반 기술  (0) 2023.12.10