[부트캠프 - 30일차] 2/2.월 - Docker

developowl·2026년 2월 4일

부트캠프

목록 보기
21/29
post-thumbnail

1. Docker

Container와 가상화

가상화

  • 서버, 스토리지, 네트워크 및 기타 물리적 시스템에 대한 가상 표현을 생성하는 데 사용할 수 있는 (추상화) 기술
  • 가상화 SW는 물리적 하드웨어 기능을 모방하여 하나의 물리적인 컴퓨터에서 여러 가상 시스템을 동시에 실행
  • 가상화를 사용해 물리적 하드웨어 리소스를 효율적으로 사용해서 조직의 인프라를 더욱 효율적으로 관리할 수 있음

가상화 이점

  • 효율적인 리소스 사용
  • 자동화된 IT 관리
  • 신속한 재해 복구

가상화 서비스

  • 서버 가상화
  • 스토리지 가상화
  • 네트워크 가상화
    • SDN(Software-Defined Networking)
      • 물리적 환경의 데이터 라우팅에서 라우팅 관리를 인수하여 트래픽 라우팅을 제어
      • 애플리케이션 트래픽보다 영상 통화 트래픽을 우선적으로 처리하도록 시스템을 프로그래밍 해서 모든 온라인 회의에서 일관된 통화 품질을 보장하도록 할 수 있음
    • 네트워크 기능 가상화
  • 데이터 가상화
  • 애플리케이션 가상화
  • 데스크톱 가상화

가상화 방식

호스트 운영체제 가상화

  • 물리적 하드웨어 위에 설치된 호스트 운영체제 위에 가상화 소프트웨어와 가상머신에 설치된 운영체제(게스트 운영체제)를 움직이는 방식
  • 가상의 하드웨어를 Emulating 하기 때문에 호스트 운영체제에 크게 제약 사항이 없음
  • 운영체제 위에 운영체제가 얹히는 방식이기 때문에 오버헤드가 클 수 있음\

호스트 운영체제 가상화 소프트웨어

  • VMware Workstation

  • Oracle VirtualBox

  • Microsoft Virtual PC

  • 예시

    • mac OS 위에 가상화 툴(VMware, UTM 등)을 깔고 그 위에 리눅스를 올리는 방식
    • 장점 - 기존에 쓰던 OS를 그대로 쓰면서 가상 머신을 띄울 수 있어 매우 편리함
    • 단점 - OS 위에 OS가 올라가다 보니 하드웨어 자원을 소모하는 ‘오버헤드’가 큼

하이퍼바이저 가상화

  • 호스트 운영체제 없이 하드웨어에 하이퍼바이저를 설치하여 사용하는 가상화 방식
  • 한 컴퓨터에 여러 가상 머신을 관리하는 소프트웨어 구성 요소로 각 가상 머신이 할당된 리소스를 얻고 다른 가상 머신의 작동을 방해하지 않도록 함
  • 호스트 운영체제와 별도로 개별 시스템처럼 행동하기 때문에 처리 오버헤드가 존재하지 않음
  • 별도의 호스트 운영체제가 없기 때문에 오버헤드가 적고 하드웨어를 직접 제어하기 때문에 효율적으로 리소스를 사용할 수 없음
  • 자체적으로 머신에 대한 관리 기능이 없기 때문에 관리를 위한 컴퓨터나 콘솔(CLI)이 필요함
  • 서버 가상화 기술에서는 주류 방식으로 사용
  • 하드웨어와 운영체제 사이에서 물리적 시스템의 하드웨어에 직접 설치되는 경우를 베어메탈 하이퍼바이저라고 함
  • 하드웨어 바로 위에 하이퍼바이저(Xen 등)가 올라가는 방식
  • 호스트 OS 라는 중간 단계가 없어서 훨씬 가볍고 강력함.

하이퍼바이저 구현 방식

전가상화(Full-Virtualization)

  • 하드웨어를 완전히 가상화 하는 방식으로 Hardware Virtual Machine 이라고도 함
  • 게스트 운영체제(가상화 된 운영체제)가 하드웨어에 접근하면서 제어를 요구하는데 이때 CPU는 가상화가 지원 가능한지 아닌지를 확인하는데 지원을 하지 않으면 게스트 운영체제는 운영할 수 없으며 지원 가능하면 하드웨어 제어를 요구하고 이후 하드웨어를 제어할 수 있게 됨
  • 하이퍼바이저를 구동하면 DOM0 이라는 관리용 가상머신이 구동되는데 모든 가상 머신의 하드웨어 접근이 이 DOM0 로 이루어짐
  • 하드웨어는 완전히 가상화하기 때문에 게스트 운영체제의 별다른 수정이 필요 없음
  • 하이퍼바이저가 모든 명령을 중재하기 때문에 성능이 비교적 느림
  • VMware ESC Server, MS Hyper V 가 대표적인 전가상화 소프트웨어

전가상화(Full Virtualization)

  • 방식
    • 게스트 OS는 자신이 가상 환경에 있는지 모름. 하드웨어를 완벽하게 흉내내기 때문.
  • 성능 저하 원인
    • 게스트 OS가 하드웨어에 명령을 내리면, 하이퍼바이저가 이를 가로채서 번역(Binary Translation)하는 과정이 필요.
    • 이때 CPU의 가상화 지원 기능(Intel VT-x 등)이 번역 성능을 높여주지만, 여전히 번거로운 과정

반가상화(Para-Virtualization)

  • 전가상화의 가장 큰 단점인 성능 저하 문제를 해결하기 위해 하이퍼콜(Hyper Call)이라는 인터페이스를 통해 하이퍼바이저에게 직접 요청을 보냄
  • 반가상화는 게스트 운영체제들에게 자원을 어떻게 분배할지 같은 관리적 문제만 다루는 방식으로 이렇게 하면 기존에 하이퍼바이저가 하던 번역 일은 게스트 운영체제 자체에서 수행하고 하드웨어로 전송하는데 게스트 운영체제의 커널을 수정하여 이러한 역할이 가능하도록 만드는 것이 반가상화와 전가상화의 차이
  • 하이퍼바이저에게 Hyper Call 요청을 할 수 있도록 각 운영체제의 커널을 수정해야 하므로 오픈소스 운영체제가 아니면 반가상화를 이용하기가 쉽지 않았는데 윈도우에서 Xen에서 제공하는 툴로 가능해 짐
  • 모든 명령을 DOM0를 통해 하이퍼바이저에게 요청하는 전가상화에 비해 성눙이 빠름
  • Xen, KVM이 대표적인 반가상화 소프트웨어

반가상화(Para-Virtualization)

  • 방식
    • 게스트 OS가 스스로 가상 머신임을 인지하고 있음
  • 하이퍼콜(Hypercall)
    • OS가 하드웨어를 직접 제어하려 하지 않고, 하이퍼바이저가 알아듣는 전용 언어(하이퍼콜)로 요청
  • 결과
    • 번역 과정이 생략되므로 전가상화보다 성능이 훨신 좋음
    • 다만, OS의 소스 코드를 수정해야 한다는 번거로움

Container 가상화

  • 호스트 운영체제 위에 Container 관리 소프트웨어를 설치하여 논리적으로 Container를 나누어 사용
  • 애플리케이션 동작을 위한 라이브러리와 애플리케이션 등으로 구성해서 각각 개별 서버처럼 사용
  • 장점
    • Container 가상화는 오버헤드가 적어 가볍고 빠른 장점이 있음
  • 단점
    • 다양한 운영체제를 사용할 수 없고 보안적으로 완전히 격리되지 않음
  • 컨테이너 가상화 소프트웨어
    • OpenVZ
    • LXC
    • Linux VServer
    • Docker
    • Oravle Solaris Zones

컨테이너 가상화(Container Virtualization)

  • 컨테이너는 하드웨어를 가상화하는 것이 아니라, 호스트 운영체제(OS)의 ‘프로세스’ 를 격리하는 방식
  • 구조
    • 호스트 OS 위에 컨테이너 관리 소프트웨어(도커 등) 를 설치하고, 그 위에 애플리케이션 실행에 필요한 라이브러리(Dependencies)코드만 묶어서 실행
  • 특징
    • 게스트 OS가 따로 없음.
    • 애플리케이션 인터페이스가 호스트 OS와 직접 연결되므로 추가적인 레이어가 없어 리소스 낭비가 거의 없음

Container

  • 각 애플리케이션에는 운영체제가 아닌 의존성 요소만 포함됨
  • 애플리케이션 인터페이스는 호스트 운영체제와 직접 연결되며 게스트 운영체제 같은 추가 레이어가 없기 때문에 성능은 향상되고 리소스 낭비되지 않고 Image 파일 크기도 작음
  • Container의 경우 호스트 운영체제의 프로세스 수준에서 격리하는데 Container 들이 의존성 요소를 공유하지는 않음
  • Docker 엔진에서는 Container 용 Linux 네임스페이스와 컨트롤 그룹을 생성해 이를 처리하는데 Docker의 보안이 Linux 커널 프로세스 격리를 기반으로 하는 이유이기도 하며 이런 솔루션은 충분히 검증됐지만 가상 머신이 제공하는 전체 운영체제 기반 격리보다는 덜 안전하다고 여겨지기도 함
  • 장점
    • 하이퍼바이저와 게스트 운영체제가 없기 때문에 가벼움(수십 메가바이트)
    • 경량이기 때문에 만들어진 Image 복제, 이관, 배포가 쉬움
    • 게스트 운영체제를 부팅하지 않기 때문에 애플리케이션 시작 시간이 빠름
    • 가상 머신보다 경량이므로 더 많은 애플리케이션을 실행할 수 있음

컨테이너의 장단점

  • 장점 - 가볍고 빠르며 효율적이다
    • 초경량 (Lightweight)
      • 게스트 OS가 없어서 이미지 크기가 수십 MB 단위로 작음
      • 덕분에 복제와 배포가 매우 쉬움
    • 광속 실행
      • OS 부팅 과정이 생략되므로, 명령어를 치는 즉시(초 단위) 애플리케이션이 시작됨
    • 고밀도
      • VM보다 리소스를 훨씬 적게 사용하기 때문에, 똑같은 사양의 서버에서 훨씬 더 많은 애플리케이션을 동시에 돌릴 수 있음
    • 이식성
      • 환경 자체를 컨테이너로 감싸버리기 때문에, 어느 컴퓨터에서나 프로그램 실행 가능
  • 단점 - 제약 사항이 존재
    • OS 선택의 제한
      • 호스트의 커널을 공유하므로, 리눅스 호스트 위에서 윈도우 전용 앱을 컨테이너로 돌리는 식의 작업은 불가능 (VM에서는 가능)
    • 보안 격리 수준
      • 커널의 취약점이 발견될 경우, 호스트와 모든 컨테이너가 위험에 노출될 가능성이 VM보다 높음

로컬 서버 vs 가상 머신 vs Container

애플리케이션 배포 방식의 변화

Docker

  • 컨테이너형 가상화 기술을 구현하기 위한 상주 애플리케이션과 이 애플리케이션을 조작하기 위한 명령행 도구로 구성되는 애플리케이션
  • 같이 사용되는 프로그램과 데이터를 격리시키는 기능을 제공하는 애플리케이션 - Container 가상화
  • Container 와 Docker 엔진
    • 개인용 컴퓨터 또는 서버 상의 환경을 조립형 창고 같은 작은 방으로 분할해서 독립된 영역에 데이터나 프로그램을 두는 것으로 이 독립된 영역을 Container 라고 하고 이 Container 를 다루는 기능을 제공하는 소프트웨어 중 하나가 Docker
    • Docker 를 사용하려면 Docker 소프트웨어의 본체인 Docker 엔진을 설치해야 하고 Docker 엔진을 사용해 Container를 생성하고 구동시킬 수 있음
  • 특징
    • 마이크로 서비스 전환은 물론 DevOps, Testing 등 다양한 분야에서 활용

Docker는 Linux를 사용

  • Linux 운영체제가 필요
  • 윈도우나 Mac 운영체제에서도 Docker를 구동할 수는 있지만, 이 경우 내부적으로 Linux가 사용되며 Container 에서 동작시킬 프로그램도 Linux용 프로그램
  • Docker가 Linux 운영체제에서 사용하는 것을 전제로 만들어졌기 때문이며, 윈도우나 Mac 운영체제에서 Docker를 사용하는 경우에도 내부적으로는 Linux 운영체제를 사용

LFC(Linux Container)

  • 운영체제 수준의 가상화 구현
    • 단일 Linux 커널을 사용하는 제어 호스트에서 여러 개의 격리된 Linux 시스템(Container) 실행
  • Linux 커널에서 제공하는 주요 기능
    • chroot(change root)
      • 특정 디렉토리를 최상위 디렉토리인 root로 인식하게끔 설정하는 Linux 명령
        • 유저 격리
        • 파일 격리
        • 네트워크 격리
    • cgroups (컨트롤 그룹)
      • 자원(CPU, 메모리, 블록I/O, 네트워크 등)을 제한하고 격리시키는 Linux 커널 기능
      • 자원을 배분
    • Namespace
      • 프로세스를 독립시켜주는 가상화 기술(Linux 커널 리소스의 분리)
      • 운영 환경에 대한 애플리케이션 보기의 완전한 분리를 허용
      • 프로세스 트리, 네트워킹, 사용자 ID 및 마운트 된 파일 시스템 포함

데이터나 프로그램을 독립된 환경에 격리하는 이유

  • 대부분의 프로그램은 프로그램 단독으로 동작하는 것이 아니라 어떤 실행 환경이나 라이브러리 또는 다른 프로그램을 이용해 동작
  • Docker Container를 사용해 프로그램을 격리하면 여러 프로그램이 한 서버에서 실행되면서 발생하는 문제를 대부분 해결할 수 있음

동작 원리

  • Container 안에는 운영체제와 유사한 것이 있음
  • 윈도우와 Mac 운영체제에서 Docker 구동 - Linux 운영체제를 끌어들여서 사용

Image 와 Container

  • Image는 Container를 만들어내는 설계도(클래스) 역할을 수행하는 것으로 하나만 있으면 동일한 Container(인스턴스)를 여러 개 생성할 수 있음
  • Container로도 Image를 생성할 수 있음.
    • 기존 Image를 수정헤서 새로 만드는 것이 가능

Docker 엔진 간에 이동이 가능

  • 동일한 Container 를 여러 개 만들지 않더라도 다른 물리 서버에 설치된 Docker 엔진으로 Container를 이동시킬 수 있음
  • Container는 Docker 엔진만 설치되어 있으면 구동이 가능하므로 다른 서버나 컴퓨터에 Docker 엔진을 설치하고 새로운 Docker 엔진에 Image를 이용해 동일한 Container를 생성하면 되는데 Container 자체가 이동하는 것은 아니지만 Image를 통해 Container가 이동한 것과 같은 효과를 얻을 수 있음

Docker Hub 와 Docker Image

  • Image는 주로 Docker Hub에서 구하게 되는데 Docker Hub는 공식적으로 운영되는 Docker Registry (Docker Image를 배포하는 서비스)의 이름으로 공개된 Container Image가 모여 있는 곳

  • 도커 이미지의 종류

    • 운영체제와 유사한 것
    • 소프트웨어가 포함된 이미지
    • 소프트웨어가 여러 개 포함된 이미지

다양한 형태로 조합이 가능한 Container

  • Docker를 사용할 때의 원칙 중 하나로 한 Container에 한 프로그램이라는 것이 있음

  • 하나의 프로그램만 담긴 Container를 사용한다는 의미로 보안 및 유지 관리 측면에서 유리하기 때문에 많이 쓰이는 정책

  • 워드프레스를 사용하려면 아파치(웹 서버 소프트웨어), MySQL 같은 DBMS, 워드프레스로 세 가지 소프트웨어가 필요한데 Docker를 사용해 워드프레스를 구축하는 방법은 이들을 각각 별도의 Container로 구성할 수도 있고, 한 컨테이너에 모두 집어넣는 방법도 있음

  • Docker Container는 쓰고 버리는 일회용품

  • 데이터 저장

    • Container를 폐기하면 데이터도 소멸됨
    • Docker가 설치된 물리적 서버의 디스크를 마운트해서 데이터를 저장하는 것이 가능

Docker의 장점과 단점

  • 장점

    • 애플리케이션 배포에 특화돼 있기 때문에 애플리케이션 개발 및 운영을 Container 중심으로 할 수 있음
    • 가상화 소프트웨어보다 더 가볍게 동작
    • Docker는 이식성이 뛰어나서 로컬 머신의 Docker 환경에서 실행하던 Container를 다른 컴퓨터에 있는 Docker 환경에 배포하거나 반대로 다른 서버의 Docker 환경에서 동작하던 Container를 로컬로 가져올 수 있는데 개발 환경과 운영 환경을 거의 동등하게 재현할 수 있음
    • 물리적 환경의 차이나 서버 구성의 차이를 무시할 수 있음
    • Container 간의 연동이나 클라우드 플랫폼 지원 등 여러 면에서 장점이 있음
  • 단점

    • Docker Container의 내부는 Linux 계열의 운영체제와 같은 구성을 취하는 것이 많은데 Container는 운영체제의 동작을 완전히 재현하지는 못하기 때문에 좀 더 엄밀한 Linux 계열 운영체제의 동작이 요구되는 가상 환경을 구축해야 한다면 기존 방법대로 VMWare나 VirtualBox 같은 가상화 소프트웨어를 사용하는 것이 나옴
    • FressBSD 같은 비 Linux 환경이 필요한 경우에도 Docker가 적합하지 않음
  • 가상 머신 (단독주택 느낌)
    • 호스트와 게스트의 커널이 완전히 분리되어 있음. (ex: 윈도우 위에 리눅스 커널 설치 가능)
  • 컨테이너 (아파트 느낌)
    • 모든 컨테이너가 호스트 리눅스의 커널을 공유

→ VM은 심장부터 발끝까지 완전히 새로운 생명체를 하나 더 만드는 것이지만, 컨테이너는 호스트 리눅스의 심장(커널)을 빌려 씀.

“운영체제의 동작을 완전히 재현하지는 못한다” 의 의미

  • 커벌 버전의 종속성
    • 호스트 커널의 버전에 종속되기 때문에, 호스트 커널 버전 이상의 기능은 사용하지 못할 수도 있음
  • 커널 모듈 및 드라이버 제어
    • 운영체제 레벨의 아주 깊숙한 설정(네트워크 하부 프로토콜 수정, 하드웨어 드라이버 직접 제어 등)이 필요한 경우, 컨테이너는 호스트 커널의 보호를 받기 때문에 이를 마음대로 수정할 수 없음
  • 시스템 콜(System Call)의 한계
    • 컨테이너는 호스트 커널이 허용하는 범위 내의 시스템 콜만 사용할 수 있으므로, 아주 정밀한 운영체제 수준의 실험을 하기에는 제약이 따름

Docker의 주요 도구

  • LXC를 이용한 Container 구동
    • containerd 는 Linux 및 윈도우용 데몬으로 Image 전송 및 스토리지에서 Container 실행 및 감독, 네트워크 연결까지 호스트 시스템 전체 Container의 라이프 사이클을 관리
  • 통합 Buildkit
    • 도커 이미지를 만드는 도구
  • Docker CLI
    • Docker 명령을 수행하는 기본적인 도구

도커의 주 용도

  • 도커의 주 용도는 PaaS 서비스를 가능하게 하는 소프트웨어 개발 환경을 제공하는 것인데 Container 서비스에 대한 자동화된 관리, 트래픽 라우팅, 로드 밸런싱 등을 쉽게 하려면 오케스트레이션 기능이 추가로 요구됨

Docker의 주요 구성 요소

  • Docker Client
    • 도커에 명령을 내릴 수 있는 CLI
  • Docker Host
    • 도커가 설치된 Server 또는 가상 머신
  • Docker Engine
    • 애플리케이션 실행 환경을 제공하는 핵심 요소
  • Docker Hub
    • 도커 이미지를 공유하기 위한 클라우드 서비스
  • Docker-Compose
    • 의존성 있는 독립된 Component에 대한 구성 정보를 yaml 코드로 작성을 해서 일원화된 애플리케이션 관리를 가능하게 하는 도구
  • Docker Registry
    • 도커 컨테이너 이미지를 push/pull 할 수 있는 레지스트리 구축에 사용하는 도구
  • Docker Swarm
    • 여러 도커 호스트를 클러스로 구축하여 관리할 수 있는 도커 오케스트레이션 도구

Docker Engine 설치

  • 도커는 운영체제가 64bit 인 경우에만 동작
# 기존 버전 제거
sudo apt remove $(dpkg --get-selections docker.io dockercompose docker-compose-v2 docker-doc podman-docker containerd runc |
cut -f1)

# Docker 에서 제공하는 공식 GPG(GNU Privacy Guard) key 추가
sudo apt update

# 보안 웹 통신(인증서 관리)과 데이터 다운로드를 위해 필수적인 두 가지 도구 설치
sudo apt install ca-certifications curl

# GPG 키(소프트웨어 저장소의 신뢰성을 확인하는 디지털 열쇠)를 안전하게
# 보관할 전용 디렉토리 생성
sudo install -m 0755 -d /etc/apt/keyrings

# 디지털 서명(GPG 키)을 다운로드하여 내 컴퓨터에 저장하는 명령
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

# GPG 키를 시스템의 모든 사용자가 읽을 수 있도록 권한을 조정하는 설정
sudo chmod a+r /etc/apy/keyrings/docker.asc
  • Linux(Ubuntu)에서 설치
# Docker CE 설치
sudo apt install docker-ce docker-ce-cli containerd.io dockerbuildx-plugin docker-compose-plugin

# 설치 확인
sudo docker version

# 서비스를 시작할 때 수행되도록 설정
sudo systemctl enable docker

# 데몬 확인
sudo systemctl status docker

# Docker 그룹에 현재 사용자 등록 / 등록을 안 하면 sudo를 매번 입력해야 함
sudo usermode -aG docker $(whoami)
sudo chmod 666 /var/run/docker.sock
sudo service docker start

Docker 기본 사용

# Image 다운로드
docker pull hello-world

# Image 확인
docker images 

# Image를 Container로 생성
docker run hello-world

# Container 확인
docker ps -a

# 도커 버전 확인
docker version

도커 버전 확인

  • 설치된 도커 엔진은 클라리언트와 서버로 구분
  • 클라이언트는 도커 명령을 받고 결과를 출력하는 역할을 수행하고, 서버는 도커 엔진 즉, Docker Daemon 을 이용해 Container 시작, 운영, 정지 등을 담당
  • 도커 버전 정보에 나타나는 클라이언트와 서버의 상호 실행 원리
    • 클라이언트는 도커 명령을 수행하는 명령줄을 제공
    • 수행된 도커 명령은 서버의 도커 데몬으로 전달
    • 도커 데몬은 docker-socket이 보유한 Docker API를 이용해 Container 생성
    • 수행된 Container에 포함된 서비스 결과를 클라이언트에 전달

시스템에 설치된 Docker 구성 정보 - docker info

  • 커널 정보, 현재 Container 수 및 Image 수를 출력
  • 사용 중인 스토리지 드라이버에 따른 풀 이름
  • 데이터 파일, 메타 데이터 파일, 사용된 데이터 공간, 총 데이터 공간, 사용된 메타 데이터 공간, 메타 데이터 공간 정보

디스크 사용량 확인 - docker system df

  • 자세히 보고자 하는 경우 -v 옵션을 추가

도커 발생 이벤트 확인

docker system events
  • 롤링 로그이며 한 번에 1000개의 이벤트를 보유

  • 별도의 터미널에서 실행 시켜둠

  • 하나의 터미너에서 실행 시켜둠

  • 하나의 터미널에서 docker system events를 실행

  • 다른 터미널에서 docker run -dti -p 80:80 —name=web nginx

  • docker stop webapp

  • filter 옵션

    # 이미지 관리 이벤트만 확인
    docker system events —filter ‘type =imag’
    
    # 컨테이너 중지 이벤트만 확인
    docker system events —filter ‘event=stop’
    
    # 특정(webapp) 컨테이너만 확인
    docker system events --filter 'container=webapp'
    
    # 중복 옵션도 가능
    docker system events --filter 'container=webapp' --filter 'event=stop'
    
    # 지난 24시간 동안의 로그를 출력
    docker system events --since 24h
    
    # JSON 형식으로 로그 출력
    docker system events --format '{{json .}}'

컨테이너를 실행하자 마자 터미널을 이용해서 접속

# -it 옵션
docker container run -it ubuntu

# 쉘 명령 수행(hostname, date)
/ # hostname
29b4f4344443
/ # date
Thu Oct 10 04:34:28 UTC 2024

현재 실행 중인 컨테이너 확인

docker ps

docker container ls

컨테이너에 터미널을 이용해서 접속

# 컨테이너에서 실행 중인 프로세스 확인
docker container top 컨테이너ID

# 컨테이너의 상세 정보 확인
docker container inspect 컨테이너ID

# 컨테이너의 로그 정보 확인
docker container logs 컨테이너ID

도커 초기화

# 모든 컨테이너 종료 및 삭제
docker container rm -f $(docker container ls -aq)

# 도커 이미지 삭제
docker image rm $(docker image ls -aq)
  • 이미지는 컨테이너 사용 중이면 삭제가 되지 않음

2. Docker Command

Docker Registry

  • Image를 배포하는 장소가 Docker Registry
  • Private Registry 를 직접 생성할 수 있으며 CSP의 Registry 이용 가능
  • Repository는 Registry를 구성하는 단위

Docker Container Application Service Development Flow

  1. 애플리케이션 코드 개발
  2. 베이스 이미지를 이용한 Dockerfile 작성
  3. Dockerfile build를 통한 새로운 이미지 생성
  4. 생성된 이미지를 이용한 컨테이너 실행
    1. Docker Compose를 이용한 다중 컨테이너 실행
    2. 마이크로서비스 테스트
  5. 컨테이너 애플리케이션 서비스 테스트
  6. 로컬 및 원격 저장소에 이미지 저장(push)
  7. 깃허브 등을 활용한 Dockerfile 관리
  8. 동일 환경에서의 지속적 애플리케이션 개발 수행

Docker 명령어 사용

  • Docker의 작업 명령어는 docker 로 시작
  • 기본 형식
    • docker 명령어 옵션 대상 인자
    • 이미지 다운로드
      • docker image pull penguin
    • 이미지 실행
      • docker container run penguin
    • 컨테이너 시작
      • docker container start penguin
    • 컨테이너를 백그라운드에서 시작
      • docker container run -d penguin -mode=1
  • 커맨드는 상위 커맨드(앞의 명령어)와 하위 커맨드로 나누어지는 경우도 있는데 상위 커맨드를 생략해도 되는 경우가 있음
    • 하위 커맨드에 대한 명령이 상위 커맨드 1개와만 매칭되는 경우
    • run 이라는 하위 커맨드는 container 라는 상위 커맨드 하나와만 매칭이 되므로 container 를 생략하고 docker run 으로 수행해도 됨

도커 명령어의 상위 커맨드

  • container

    • start: 컨테이너를 실행
    • stop: 컨테이너 중지
    • create: 컨테이너를 생성
    • run: 도커 이미지를 확인해서 없으면 내려받고 컨테이너를 생성해서 실행
      • image pull, container create, container start를 합친 명령
    • rm: 정지 상태의 컨테이너를 삭제
    • exec: 실행 중인 컨테이너 속에서 명령어를 실행
    • ls: 컨테이너 목록 출력, ps 명령으로 대체
    • cp: 도커 컨테이너와 도커 호스트 간에 파일을 복사
    • commit: 도커 컨테이너를 이미지로 변환
  • image

    • pull: 이미지를 내려받음
    • rm: 이미지를 삭제
    • ls: 이미지 목록을 출력, images 명령으로 대체
    • build: 도커 이미지를 생성
  • volume (저장소 관련 명령)

    • create : 볼륨 생성
    • inspect : 볼륨의 상세 정보를 출력
    • ls : 볼륨의 목록을 출력
    • prune : 현재 마운트 되지 않은 볼륨을 모두 삭제
    • rm : 볼륨을 삭제
  • network

    • connect : 컨테이너를 네트워크에 연결
    • disconnect : 컨테이너를 네트워크 연결에서 해제
    • create : 도커 네트워크를 생성
    • inspect : 도커 네트워크의 상세 정보를 출력
    • ls : 네트워크 목록 출력
    • prune : 현재 컨테이너가 접속하지 않은 네트워크 삭제
    • rm : 네트워크 삭제
  • 그 외

    • checkpoint : 현재 상태를 일시적으로 저장한 후, 나중에 해당 시점의 상태로 되돌릴 수 있음
    • node : 도커 스웜의 노드를 관리하는 기능
    • plugin : 플러그인을 관리하는 기능
    • secret : 도커 스웜의 비밀값 정보를 관리하는 기능
    • service : 도커 스웜의 서비스를 관리하는 기능
    • stack : 도커 스웜 또는 쿠버네티스에서 여러 개의 서비스를 합쳐 구성한 스택을 관리하는 기능
    • swarm : 도커 스웜을 관리하는 기능
    • system : 도커 엔진의 정보를 확인하는 기능

단독으로 사용되는 커맨드

  • login : 도커 레지스트리에 로그인, 도커 허브에 업로드할 때 로그인이 되어 있지 않으면 이 명령을 수행해서 로그인을 시도
  • logout : 도커 레지스트리에 로그아웃
  • search : 도커 레지스트리를 검색
  • version : 도커 엔진 및 명령행 도구의 버전을 출력

Docker Image Command

Docker Image

  • 컨테이너 형태로 소프트웨어를 배포하기 위해서 필요한 모든 요소를 실행하 수 있는 포맷으로 컴파일 및 빌드한 패키지
  • 독립적이기 때문에 의존성을 고려할 필요가 없으며 경량화된 패키지이므로 비교적 작은 용량으로도 제 역할을 수행할 수 있음
  • 특정 시점의 Container의 Snapshot
  • 동일한 이미지를 이용해서 여러 개의 컨테이너를 생성할 수 있음
  • 이미지는 여러 개의 Layer(명령어)로 구성
  • 레지스트리에 저장해서 관리
  • 도커 이미지를 검색
  • 도커 레지스트리에 등록된 이미지를 조회할 수 있음
  • 기본 형식
docker search [옵션] 검색키워드

# mysql 검색
docker search mysql

# 개수 제한 검색
docker search --limit 5 mysql

# 이미지 내려받기
docker [image] pull [option] name[:TAG | @IMAGE_DIGEST]
	# name 뒷 부분을 생략하면 :latest 가 자동으로 붙음
	
# 태그를 포함해서 다운로드: 이미지 이름은 jenkins
docker image pull jenkins/jenkins:lts

# 태그를 생략해서 latest 버전을 다운로드 이미지 이름은 debian
docker image pull debian
  • 다운로드 성공했을 때 나오는 결과

    • Digetst : 이미지의 분산 해시 값으로 하나의 이미지는 여러 개의 Layer로 구성이 되는데 그 중 핵심 정보를 바이너리 형태로 제공하는 이 값을 가지고 이미지를 구분
    • Status : 로컬에 이미지를 저장했다는 표시
    • docker.io/jenkins/jenkins:lts: docker.io 는 도커 허브에서 받았다는 의미인데 별도의 registry 에서 가져오면 그 registry 의 정보가 앞에 붙음
  • docker serach → [옵션]

    • -a , --all-tags : 저장소에 태그로 지정된 여러 image응 모두 다운로드
    • --disable-content-trust : 이미지 검증 작업을 건너뛰는 것으로 기본값은 yes
    • --platform : 플랫폼을 지정하는 것으로 —-platform=linux 형태로 설정
    • -q , --quiet : 이미지 다운로드 과정에서 나타나는 상세 출력 숨김

이미지 다운로드

  • debian의 최신 버전을 docker hub에서 다운로드

    • docker pull debian:latest / 버전 정보 설정
    • docker pull docker.io/library/debian / 저장소 설정
  • docker hub 에서 다운로드 하는 것이 아니면 반드시 레지스트리 이름을 붙여야 함

Image 정보 확인: docker images, docker images ls

  • 관련 정보
    • REPOSITORY : Image 이름
    • TAG : 버전 정보로 Image를 내려받을 때 따로 지정하지 않으면 latest(최신 버전)를 내려받는데, 특정 버전을 설치하고자 하는 경우는 Image_이름:버전_넘버 형태로 설정
    • IMAGE ID : Image 식별자로 본래는 64글자이지만, 앞에서부터 12글자만 출력
    • CREATED : Image 생성 후 경과된 시간
    • SIZE : Image 의 전체 용량
profile
Don’t get mad at the computer.

0개의 댓글