티스토리 뷰

Server

Docker & Kubernetes 개념 총 정리 2

마시멜로co. 2025. 1. 3. 17:22

1.도커란?

도커는 컨테이너라고 부르는 운영체제 수준의 가상화 방식으로 소프트웨어를 배포하는 방식으로 사용하는 PaaS 제품입니다. 쉽게말해 도커를 사용하면 다양한 개발 환경에서 컨테이너를 이용해 소프트웨어를 편리하게 배포할 수 있습니다.

오픈소스로서 누구나 무료로 사용할 수 있는 소프트웨어입니다.

 

 

도커를 활용한 어플리케이션 실행은 위 그림과 같습니다. 운영체제 위에 도커가 설치되고 도커는 컨테이너 단위로 어플리케이션을 실행합니다. 컨테이너들은 서로 격리되어있으므로 독립성을 보장합니다. 각 컨테이너는 어플리케이션을 실행하는데 필요한 최소한의 바이너리, 라이브러리를 포함합니다.

 

도커에서는 가상화 시스템을 사용합니다. 가상화란 컴퓨터에서 활용하는 리소스를 추상화하는 개념을 의미합니다. 가상화를 활용해 여러 개의 가상머신을 생성함으로써, 단일 컴퓨터 자원을 여러 개의 논리적인 자원으로 나누어 동작시킬 수 있습니다. 

 

2. 컨테이너란?

컨테이너는 소프트웨어를 배포할때 필요한 코드, 라이브러리, 환경 설정 파일들을 모아 격리시킨 후 실행가능한 패키지로 만든것을 의미합니다. 서로 다른 컨테이너는 격리된 환경에서 작동되므로 서로 충돌하지 않는다는 장점이 있습니다. 이러한 컨테이너의 개념은 소프트웨어 시스템을 구축할 때 최소 구성 요소로 분할하여 구축하는 방식인 마이크로서비스 아키텍처의 기반이 됩니다. 

격리된 서로 다른 컨테이너들끼리 통신을 주고 받을 수 있습니다. 이는 컨테이너가 동일한 운영체제 위에서 작동하기 때문에 가능합니다. 이러한 작동 원리는 가상머신과 비교해 리소스 소모량이 적으므로 효율적을 리소스를 관리 할 수 있습니다. 

 

도커 클라이언트는 docker-cli라고 부릅니다. 도커 클라이언트는 우분투에서 실행하는 터미널과 유사합니다. 

도커 클라이언트는 명령어 행으로 dockerd API를 할용해 build, pull, run과 같은 명령을 내립니다. 또한 도커 클라이언트는 도커 데몬과 통신합니다.

 

도커 데몬은 dockerd라고 부르는데 백그라운드에서 실행되는 데몬 프로세스에 해당합니다. 도커 데몬은 도커 API요청을 수신하고 도커 이미지, 컨테이너 등과 같은 도커와 관련된 객체를 관리합니다.

 

containerd는 컨테이너 실행과 관리에 필요한 기능을 수행하는 오픈소스 컨테이너 런타임입니다. containerd는 컨테이너 생명주기를 모두 관리합니다. 생명주기란 도커 이미지 전송, 컨테이너 실행 , 스토리지, 네트워크 등을 포함합니다. 컨테이너 실행만 담당하는 runc과는 다른 역할을 하며 고수준 컨테이너 런타임에 해당합니다.

 

runc는 컨테이너 실행과 관련된 작업을 수행하는 저수준 컨테이너 런타임입니다. containerd는 실행 이외에도 컨테이너 관리를 위한 다양한 역할을 하지만, runc는 실제 컨테이너 실행만 담당합니다.

 

containerd-shim은 containerd와 runc 사이에ㅓ 작동하는 중간 프로세스에 해당하는데, 컨테이너 실행을 조정하는 역할을 합니다. conainerd는 runc와 통신함으로써 컨테이너를 실행합니다. containerd-shim이 containerd와 runc 사이에서 중개자 역할을 수행합니다. 

 

 3. 도커 설치

https://docs.docker.com/engine/install/ubuntu/

 

Ubuntu

Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.

docs.docker.com

 

 

1장에서 설치한 virtualbox의 가상서버를 실행합니다.

 

sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc


echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") 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-buildx-plugin docker-compose-plugin

 

 

도커가 정상적으로 동작하는지 테스트합니다.

docker
systemctl status docker

 

 

sudo usermod -aG docker $USER

 

위 코드를 실행하여 도커 명령어를 사용자 드에서도 사용할 수 있도록 합니다. 

 sudo docker run hello-world

 

접두어 docker는 도커 관련 명령어를 실행하기 위해 붙이는 명렁어입니다.

run은 컨테이너 실행을 의미하며 hello-world는 컨테이너 이름입니다.

 

실행결과 hello-world 이미지를 다운로드하지 않았으므로 hello-world라는 이미지를 찾을 수 없다는 메시지가 나타나는 것을 확인 할 수있습니다.

 

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Increase your reach and adoption on Docker Hub With a Docker Verified Publisher subscription, you'll increase trust, boost discoverability, get exclusive data insights, and much more.

hub.docker.com

 

도커이미지는 위 사이트에 접속하여 다운로드합니다.

docker pull hello-world

 

 

만약 Digest를 다운로드하고 싶으면 아래의 명령어를 사용하면 됩니다.

 

docker image pull 이미지 이름@DIGEST

 

4. 도커 작동 방식

도커의 전체 구조는 도커 클라이언트, 도커 호스트, 도커 레지스트리로 구성됩니다.

도커 클라이언트는 도커에 명령을 내릴 수 있는 CLI (Command Line Interface) 도구를 의미합니다. 

도커 호스트는 도커를 설치한 서버 혹은 가상머신입니다. 물리서버 또는 가상 서버로 나눌 수 있습니다.

도커 레지스트리는 도커 이미지를 저장하거나 배포하는 시스템입니다. 도커 레지스트리는 크게 공개와 개인 레지스트리로 나눌 수 있는데, 도커 허브는 가장 유명한 공개 레지스트리입니다. 이 도커 허브에서 이미지를 다운로드하거나 업로드 할 수 있습니다. 

 

도커 클라이언트에서 명령어를 입력하면 도커 호스트의 도커 데몬이 명령을 받습니다.( 도커 데몬이란 도커와 관련된 리소스를 관리하는 백그라운드 프로세스입니다.) 도커 호스트에 이미지가 존재하지않는다면 도커 레지스트리에서 다운로드합니다. 

 

도커 이미지란 컨테이너 형태로 소프트웨어를 배포하기 위해 필요한 요소를 실행 할 수 있는 포맷으로 컴파일 및 빌드한 패키지입니다. 도커 이미지는 독립적이기 때문에 의존성을 고려할 필요가 없으며 경량화된 패키지이므로 비교적 작은 용량으로도 실행 가능합니다. 또한 도커 이미지는 특정 시점의 도커 컨테이너 상태를 담은 스냅숏이라고 할 수 있습니다.

따라서 도커 이미지를 통해 동일한 환경을 가진 여러 개의 컨테이너를 생성 할 수 있습니다.

 

도커 이미지는 여러 개의 레이어로 구성되어 있고, 도커 허브와 같은 중앙 저장소에 저장되어 관리됩니다.

도커 이미지는 도커 허브에 업로드하거나 다운로드 할 수 있습니다. 

 

도커 컨테이너란 도커 이미지를 실행 할 수 있는 인스턴스를 의미합니다. 도커 컨테이너는 도커 이미지로부터 생성되며, 도커 컨테이너에 대해 실행, 중지, 재실행, 삭제 등의 명령을 내릴 수 있습니다.

 

컨테이너는 자체적으로 파일 시스템을 가지고 있으며, 각 컨테이너는 독립적으로 실행됩니다. 컨테이너 내부에는 자체적으로 운영체제 전부를 포함하지 않기 때문에 가볍습니다. 컨테이너 내부의 자체 운영체제 위에 돌아가는 가상머신과 같은 개념이 아니라 도커 엔진과 운영체제를 공유합니다. 도커 엔진이 설치되어있는 호스트 운영체제를 이용하며, 컨테이너 내부는 프로그램을 실행시키기 위해 최소한으로 필요한 바이너리, 라이브러리와 같은 구성 요소로 이루어져 있습니다.

 

5. 도커 명령어

 

▶ 컨테이너 실행 명령어

docker container run 이미지명

 

 

컨테이너 실행 명령어를 입력하면 도커 호스트의 데몬이 실행 명령을 요청받고, 도커 호스트에 있는 이미지를 컨테이너 형태로 실행합니다.

 

▶ 컨테이너 내부 접속

docker container run -it 이미지명

 

 

새 터미널 창을 띄워서 컨테이너 목록 조회

 

net-tools가 설치된 ubuntu 컨테이너 생성

 

도커 이미지 생성

 

내부접속하여 확인합니다.

 

▶ 컨테이너 종료

docker container stop 컨테이너ID

 

docker container kill 명령어는 즉시 종료 명령어로 안전성 면에서 stop 명령어 사용을 권장합니다.

 

 

▶ 실행중인 컨테이너 목록 확인

docker container ls

 

실행중인 컨테이너와 정지상태인 컨테이너 모두를 확인 하려면 -a 옵션을 추가합니다.

 

 

hello-world라는 컨테이너를 실행했지만 종료 상태인 이유는 컨테이너 내부 프로세스가 모두 종료되었기 때문에 종료상태로 처리됩니다.

 

▶ 컨테이너 삭제 명령어

docker container rm 컨테이너ID

 

▶ 이미지 목록 조회

docker image ls

 

▶ 이미지 다운로드 명령어

docker image pull 이미지명

 

▶ 이미지 삭제 명령어

docker image rm 이미지ID

 

6. 도커 스토리지

컨테이너가 삭제되면 컨테이너 내부에 존재하는 파일도 삭제된다. 컨테이너 실행 여부와 상관없이 컨테이너에서 생성되는 데이터를 보존하는 방법으로 도커 스토리지를 사용한다.

도커 스토리지에는 bind mount, volume, tmpfs의 3가지 종류가 있습니다.

bind mount 방식의 경우 도커 호스트 디렉터리를 직접 공유하는 방식입니다. 

volume은 도커를 활용해 볼륨을 생성한 후 컨테이너의 디렉터리와 공유하는 방식입니다. 

tmpfs방식은 도커 호스트 메모리에 파일이 저장되는 방식인데, 컨테이너를 삭제하면 해당 파일도 함께 삭제됩니다. 

 

볼륨을 이용하여 데이터를 유지해보겠습니다.

docker volume create 도커 볼륨명

 

postgreSQL 컨테이너를 실행합니다. 생성한 볼륨과 컨테이너 내부 경로 /var/lib/postgresql/data를 연결해서 실행합니다.

 docker container run  -e POSTGRES_PASSWORD=mysecretpassword --mount type=volume,source=volume01,target=/var/lib/postgresql/data -d postgres

 

컨테이너 내부에 접속합니다.

docker container ls
docker container exec -it fc202466c412 /bin/bash

 

데이터를 생성합니다.

# psql -U postgres
psql (17.2 (Debian 17.2-1.pgdg120+1))
Type "help" for help.

postgres=# create user user01 password 'user01' superuser;
CREATE ROLE
postgres=# \du
                             List of roles
 Role name |                         Attributes
-----------+------------------------------------------------------------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS
 user01    | Superuser

postgres=# \q
root@fc202466c412:/# cd /var/lib/postgresql/data/
root@fc202466c412:/var/lib/postgresql/data# ls
base    pg_commit_ts  pg_hba.conf    pg_logical    pg_notify    pg_serial     pg_stat      pg_subtrans  pg_twophase  pg_wal   postgresql.auto.conf  postmaster.opts
global  pg_dynshmem   pg_ident.conf  pg_multixact  pg_replslot  pg_snapshots  pg_stat_tmp  pg_tblspc    PG_VERSION   pg_xact  postgresql.conf       postmaster.pid
root@fc202466c412:/var/lib/postgresql/data# exit

 

컨테이너를 삭제합니다.

user@ubuntu-24:~$ docker container ls
CONTAINER ID   IMAGE      COMMAND                  CREATED          STATUS          PORTS      NAMES
fc202466c412   postgres   "docker-entrypoint.s…"   13 minutes ago   Up 13 minutes   5432/tcp   unruffled_grothendieck
user@ubuntu-24:~$ docker container stop fc202466c412
fc202466c412
user@ubuntu-24:~$ docker container rm fc202466c412
fc202466c412
user@ubuntu-24:~$  docker container run  -e POSTGRES_PASSWORD=mysecretpasswrd --mount type=volume,source=volume01,target=/var/lib/postgresql/data -d postgres

 

다시 컨테이너에 접속하여 데이터가 유지된 것을 확인합니다.

user@ubuntu-24:~$ docker container ls
CONTAINER ID   IMAGE      COMMAND                  CREATED         STATUS         PORTS      NAMES
881808450a5c   postgres   "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   5432/tcp   gallant_merkle
user@ubuntu-24:~$ docker exec -it 881808450a5c /bin/bash
root@881808450a5c:/# psql -U postgres
psql (17.2 (Debian 17.2-1.pgdg120+1))
Type "help" for help.

postgres=# \du
                             List of roles
 Role name |                         Attributes
-----------+------------------------------------------------------------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS
 user01    | Superuser

postgres=# \q
root@881808450a5c:/# exit

 

도커 호스트에서 inspect 명령어를 사용하면 볼륨의 정보를 조회할 수 있습니다.

user@ubuntu-24:~$ docker volume inspect volume01
[
    {
        "CreatedAt": "2025-01-06T06:44:12Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/volume01/_data",
        "Name": "volume01",
        "Options": null,
        "Scope": "local"
    }
]

 

root로 접속하여 저장된 데이터 확인을 합니다.

root@ubuntu-24:~# cd /var/lib/docker/volumes/volume01/_data/
root@ubuntu-24:/var/lib/docker/volumes/volume01/_data# ls -al
total 136
drwx------ 19  999 systemd-journal  4096 Jan  6 07:17 .
drwx-----x  3 root root             4096 Jan  6 06:44 ..
drwx------  5  999 systemd-journal  4096 Jan  6 07:03 base
drwx------  2  999 systemd-journal  4096 Jan  6 07:18 global
drwx------  2  999 systemd-journal  4096 Jan  6 07:03 pg_commit_ts
drwx------  2  999 systemd-journal  4096 Jan  6 07:03 pg_dynshmem
-rw-------  1  999 systemd-journal  5743 Jan  6 07:03 pg_hba.conf
-rw-------  1  999 systemd-journal  2640 Jan  6 07:03 pg_ident.conf
drwx------  4  999 systemd-journal  4096 Jan  6 07:22 pg_logical
drwx------  4  999 systemd-journal  4096 Jan  6 07:03 pg_multixact
drwx------  2  999 systemd-journal  4096 Jan  6 07:03 pg_notify
drwx------  2  999 systemd-journal  4096 Jan  6 07:03 pg_replslot
drwx------  2  999 systemd-journal  4096 Jan  6 07:03 pg_serial
drwx------  2  999 systemd-journal  4096 Jan  6 07:03 pg_snapshots
drwx------  2  999 systemd-journal  4096 Jan  6 07:17 pg_stat
drwx------  2  999 systemd-journal  4096 Jan  6 07:03 pg_stat_tmp
drwx------  2  999 systemd-journal  4096 Jan  6 07:03 pg_subtrans
drwx------  2  999 systemd-journal  4096 Jan  6 07:03 pg_tblspc
drwx------  2  999 systemd-journal  4096 Jan  6 07:03 pg_twophase
-rw-------  1  999 systemd-journal     3 Jan  6 07:03 PG_VERSION
drwx------  4  999 systemd-journal  4096 Jan  6 07:03 pg_wal
drwx------  2  999 systemd-journal  4096 Jan  6 07:03 pg_xact
-rw-------  1  999 systemd-journal    88 Jan  6 07:03 postgresql.auto.conf
-rw-------  1  999 systemd-journal 30777 Jan  6 07:03 postgresql.conf
-rw-------  1  999 systemd-journal    36 Jan  6 07:17 postmaster.opts
-rw-------  1  999 systemd-journal    94 Jan  6 07:17 postmaster.pid

 

 

bind mount 방식은 도커 호스트 디렉터리와 컨테이너 디렉터리를 연결시켜 데이터를 보관하는 방식입니다.

도커 호스트의  /home/work/ex01과 컨테이너 내부의 /home/work를 연결합니다.

docker container run  -e POSTGRES_PASSWORD=mysecretpassword --mount type=bind,source=/home/work/ex01,target=/home/work -d postgres

 

 

컨테이너에 내부 접속하여 연결한 폴더에 디렉터리를 생성합니다.

 docker container ls
 docker container exec -it 6c80f9c8dde6 /bin/bash
 cd /home/work
 mkdir test

 

새 터미널을 열어 생성된 디렉터리를 삭제한다.

 cd /home/work/ex01/
 rm -rf test

 

내부데이터에 연결된 터미널에서 삭제됨을 확인한다.

ls -al

 

tmpfs mount는 volume mount, bind mount와는 다르게 중요한 데이터를 일시적으로 도커 호스트 메모리에 저장하고 싶을대 사용한다. 또한 컨테이너 간 데이터 공유를 지원하지 않는다.

실행 중인 컨테이너를 정지시키면 tmpfs mount도 삭제된다.

 

7. YAML 기초개념

YAML은 YAML은 Ain't Markup Language(YAML은 마크업 언어가 아니다)의 줄임말입니다. 도커 컴포즈를 사용할 때 YAML 파일을 활용하며, 쿠버네티스에서도 YAML 파일을 사용합니다. 

YAML 파일의 확장자는 .yaml과 .yml을 사용합니다. 두 확장자 모두 기능 차이는 없습니다. 

 

간단한 YAML을 생성해봅니다.

vi pratice_yaml.yaml
dockerVersion : 27.4.1
kind: Pod
metadata:
  name : nginx
spec :
  containers:
    - name: nginx
      image : nginx:lastest
    - name : ubuntu
      image : ubuntu:lastest

 

 

8. 도커 컴포즈

도커 컴포즈는 도커를 활용해 다수의 컨테이너 형태의 애플리케이션을 실행할 수 있는 도구입니다. 실행하고자 하는 애플리케이션의 설정 내용들을 YAML 파일로 작성하는 방법으로 도커 컴포즈를 활용할 수 있습니다. YAML 파일의 작성을 완료하면 간단한 명령어만으로 YAML에 포함되어 있는 모든 서비스를 한번에 실행할 수 있습니다. 

 

 도커 컴포즈를 이용하여 다수의 컨테이너를 쉽게 실행하고 관리할 수 있습니다.

하나의 컨테이너를 실행할 때도 다양한 옵션을 사용하는데, 이럴때에도 도커 컴포즈를 사용하면 효율적입니다. 

sudo apt-get update
sudo apt-get install docker-compose-plugin
docker compose version

 

예시 파일입니다.

version: "3"

services:
  djangotest:
    build: ./myDjango03
    networks:
      - composenet01
    depends_on:
      - postgrestest
    restart: always

  nginxtest:
    build: ./myNginx03
    networks:
      - composenet01
    ports:
      - "80:80"
    depends_on:
      - djangotest
    restart: always

  postgrestest:
    build: ./myPostgres03
    networks:
      - composenet01
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: mysecretpassword 
      POSTGRES_DB: postgres
    volumes:
      - composenet01:/var/lib/postgresql/data
    restart: always

networks:
  composenet01:

volumes:
  composenet01:

 

작성한 파일을 빌드합니다.

docker compose up -d --build

 

컨테이너를 정지시키기 위해 아래 명령어를 실행합니다.

docker compose down
WARN[0000] /home/work/ex10/docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion
[+] Running 4/4
 ✔ Container ex10-nginxtest-1     Removed                                                                                                                                                                     0.0s
 ✔ Container ex10-djangotest-1    Removed                                                                                                                                                                    10.2s
 ✔ Container ex10-postgrestest-1  Removed                                                                                                                                                                     0.2s
 ✔ Network ex10_composenet01      Removed

 

도커에 대한 기본 사용법을 정리해봤습니다.

 

다음글에서는 쿠버네티스에 대하여 작성하겠습니다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크