Gom3rye 2025. 6. 13. 17:42

Docker

Container의 가상화

가상화

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

가상화 이점

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

가상화 서비스

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

가상화 방식

  • 호스트 운영체제 가상화

  • 물리적 하드웨어 위에 설치된 HOST OS 위에 가상화 소프트웨어와 가상 머신에 설치된 OS를 움직이는 방식
  • 가상의 하드웨어를 Emulating 하기 때문에 호스트 운영체제에 크게 제약 사항이 없다.
  • OS 위에 OS가 얹히는 방식이기 때문에 오버헤드가 클 수 있다.
  • 가상화 소프트웨어
    • VMWare Workstation
    • Virtual Box
    • Virtual PC
  • 하이퍼바이저 가상화
    • 호스트 운영체제 없이 하드웨어에 하이퍼바이저를 설치해 사용하는 가상화 방식
    • 하이퍼바이저는 한 컴퓨터에서 여러 가상 머신을 관리하는 소프트웨어 구성 요소로 각 가상 머신이 할당된 리소스를 얻고 다른 가상 머신의 작동을 방해하지 않도록 한다.
    • 하이퍼바이저 가상화는 호스트 운영체제와 별도로 개별 시스템처럼 행동하기 때문에 처리 오버헤드가 존재하지 않는다.
    • 실제 클라우드 안에서 대부분의 가상화는 이 방법이다.
    • 별도의 호스트 운영체제가 없기 때문에 오버헤드가 적고 하드웨어를 직접 제어하기 때문에 효율적으로 리소스를 사용할 수 있다.
    • 자체적으로 머신에 대한 관리 기능이 없기 때문에 관리를 위한 컴퓨터나 콘솔이 별도로 필요하다.
    • 서버 가상화 기술에서는 주류 방식이다.
    • 하드웨어와 운영체제 사이에서 물리적 시스템의 하드웨어가 직접 설치되는 경우를 베어메탈 하이퍼바이저라고 한다.
    • 구현 방식
      • Full Virtualization (전가상화)
        • 하드웨어를 완전히 가상화하는 방식으로 Hardware Virtual Machine 이라고도 한다.
        • 게스트 OS가 HW에 접근하면서 제어를 요구하는데 이 때 CPU는 가상화가 지원 가능한지 아닌지를 확인하고 지원하지 않으면 게스트 운영체제는 운영할 수 없으며 지원 가능하면 HW 제어를 요구하고 이 후 제어를 할 수 있게 된다.
        • 하이퍼바이저는 구동하면 DOM0라는 관리용 가상 머신이 구동되고 모든 가상 머신의 하드웨어 접근이 이 DOM0로 이루어지는 구조이다.
        • 하드웨어를 완전히 가상화하기 때문에 게스트 운영체제의 별다른 수정이 필요 없다.
        • 하이퍼바이저가 모든 명령을 중재하기 때문에 비교적 느리다.
          • 게스트 OS 뿐만 아니라 Host OS도 처리해줘야 하니까 작업량이 많아서 효율이 떨어질 수 있다.
          • 하이퍼바이저가 중재 이외의 다른 문제들도 처리해야 하기 때문
            • 그래서 등장한 게 반가상화!!
        • VMWare ESX Server, MS의 Hyper V가 대표적이다.
      • Para-Virtualization(반가상화)
        • 전가상화의 단점인 성능 저하 문제를 해결하기 위해서 Hyper Call 이라는 인터페이스를 통해 하이퍼바이저에게 직접 요청하는 방식
        • 모든 명령을 DOM0를 통해 하이퍼바이저에게 전송하는 전가상화에 비해 빠르다.
        • Xen, KVM이 대표적인 반가상화 소프트웨어이다. 
      • Container 가상화
        • 호스트 운영체제 위에 Container 관리 소프트웨어를 설치해 논리적으로 Container를 나누어 사용한다.
        • Container는 애플리케이션 동작을 위한 라이브러리와 애플리케이션 등으로 구성되기 때문에 이를 각각 개별 서버처럼 사용한다.
        • 장점: Container 가상화는 오버헤드가 적어서 가볍고 빠르다.
        • 단점: 다양한 OS를 사용할 수 없고 보안적으로 완전히 격리되지는 않는다.
        • 컨테이너형 가상화 소프트웨어
          • OpenVZ
          • LXC
          • Linux VServer
          • Docker
          • Oracle Solaris Zones
        • 전가상화와 굉장히 비슷하지만 전가상화는 전체 운영체제를 포함한 가상 환경을 생성하는 반면, 컨테이너 가상화는 실행에 필요한 최소한의 기능만 포함하여 가상 환경을 구성한다는 차이점이 있다. 두 방식 모두 가상화를 제공하지만, 전가상화는 무겁고 독립적인 운영체제를 필요로 하는 반면, 컨테이너는 호스트 OS를 공유하여 더 가볍고 빠르다.
        • 애플리케이션 배포 방식의 변화
          • 전통적인 방식은 하드웨어 위에 운영체제를 설치하고 그 운영체제 위에 애플리케이션을 배포한다.
          • 가상화된 방식을 이용해서 배포한다. (컨테이너를 이용해서 배포)
            • 격리도 시켜야 하고 자원의 낭비도 막아야 하니까
          • 컨테이너를 이용해서 배포

Container

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

Docker

Container 형 가상화 기술을 구현하기 위한 상주 애플리케이션과 이 애플리케이션을 조작하기 위한 명령행 도구로 구성되는 애플리케이션

  • 같이 사용되는 프로그램과 데이터를 격리시키는 기능을 제공하는 애플리케이션이다.
  • Container와 도커 엔진
    • 프로그램과 데이터를 격리하는데 이 격리된 영역을 Container라 하고 Container를 다루는 기능을 제공하는 소프트웨어 중 하나가 Docker이다.
    • Docker를 사용하려면 Docker 소프트웨어 본체인 Docker 엔진을 설치해야 하고 Docker 엔진을 사용해 Container를 생성하고 구동시킬 수 있다.
  • 특징
    • 마이크로 서비스 전환은 물론 DevOps, Testing 등 다양한 분야에서 활용된다.
    • Linux Container 구현체의 de-factor이다.
  • Docker는 Linux를 사용한다.
    • Linux 운영체제가 필요하다.
    • Windows나 Mac OS에서도 Docker를 구동할 수는 있지만 이 경우 내부적으로 Linux가 사용되며 Container에서 동작시킬 프로그램도 Linux용 프로그램이다.
  • LXC(LinuX Container)
    • 운영체제 수준의 가상화 구현: 단일 Linux 커널을 사용하는 제어 호스트에서 여러 개의 격리된 Linux 시스템(Container)을 실행한다.
    • LXC 기능을 사용하기 위한 주요 기능
      • Namespace
        • 프로세스를 독립시켜주는 가상화 기술
        • 운영 환경에 대한 애플리케이션 보기의 완전한 분리를 허용한다.
        • 프로세스 트리, 네트워킹, 사용자 ID 및 마운트 된 파일 시스템을 포함한다.
      • cgroups
        • 자원(CPU, 메모리, 블록I/O, 네트워크 등)을 제한하고 격리시키는 Linux 커널 기능
      • chroot
        • 특정 디렉토리를 최상위 디렉토리인 root로 인식하게끔 하는 기능
  • 데이터나 프로그램을 독립된 환경에 격리하는 이유
    • 대부분의 프로그램은 프로그램 단독으로 동작하는 것이 아니라 어떤 실행 환경이나 라이브러리 또는 다른 프로그램을 이용해서 동작한다.
    • PHP로 작성된 프로그램을 실행하려면 PHP 실행 환경이 필요하고 Python으로 작성된 프로그램은 외부 라이브러리를 사용하는 경우가 많고 다른 소프트웨어 역시 단일 프로그램이 아니라 여러 개의 프로그램으로 구성된 경우가 많다.
      • ex. 워드프레스 - MySQL 데이터를 따로 갖추지 않으면 사용할 수 없고 다른 프로그램과 특정한 디렉토리를 공유하거나 같은 경로에 설정 정보를 저장하는 경우도 있어서 프로그램 하나를 업데이트 하면 다른 프로그램에도 영향을 미치고 실행 환경이나 라이브러리 및 디렉토리 설정 파일에서도 이런 현상이 발생할 수 있다.
    • Docker Container를 사용해 프로그램을 격리하면 여러 프로그램이 한 서버에서 실행되면서 발생하는 문제를 대부분 해결할 수 있다.
  • 동작 원리
    • Container 안에는 운영체제와 유사한 것이 들어 있다.
    • Windows 나 Mac OS에서 구동은?: Linux 운영체제를 끌어들여서 사용한다.
      • Windows에서는 WSL2가 이 역할을 수행한다.
  • Image와 Container
    • Image는 Container를 만들어내는 설계도(클래스) 역할을 수행하고 하나만 있으면 동일한 Container를 여러 개 생성할 수 있다.
    • Container로도 Image를 생성할 수 있다.
    • 기존 Image를 수정해서 새로 만드는 것이 가능하다.
    • 동일한 Container를 여러 개 만들지 않더라도 다른 물리 서버에 설치된 Docker 엔진에 Container를 이동시킬 수 있다.
  • Docker Hub와 Docker Image
    • Image는 주로 Docker Hub에서 구하게 되는데 Docker Hub는 공식적으로 운영되는 Docker Registry이다.
    • https://hub.docker.com
    • Docker 이미지 종류
      • 운영체제
      • 소프트웨어가 포함된 이미지
      • 소프트웨어가 여러 개 포함된 이미지
  • 다양한 형태로 조합이 가능한 Container
    • Docker를 사용할 때 원칙 중 하나로 한 Container에 하나의 프로그램이라는 것이 있는데 하나의 프로그램이 담긴 Container를 사용한다는 의미로 보안 및 유지 관리 측면에서 유리하다.
    • 블로그를 빠르게 제작해주는 Wordpress를 사용하려면 Apache(Web Server), MySQL(Database), WordPress 세 가지 소프트웨어가 필요한데 이를 하나의 Container로 구성해도 되고 각각의 Container로 구성하는 것도 가능하다.
  • Docker Container는 쓰고 버리는 일회용품
  • 데이터 저장
    • Container를 폐기하면 데이터도 소멸된다.
    • Docker가 설치된 물리적 서버의 디스크를 마운트해서 데이터를 저장하는 것이 가능하다.
  • 장점
    • 애플리케이션 배포에 특화되어 있기 때문에 애플리케이션 개발 및 운영을 Container 중심으로 할 수 있다.
    • 가상화 소프트웨어보다 더 가볍게 동작한다.
    • 이식성이 뛰어나서 로컬 머신의 Docker 환경에서 실행했던 Container를 다른 컴퓨터에 있는 Docker 환경에 배포하거나 다른 서버의 Docker 환경에서 동작하던 Container를 로컬로 가져올 수 있는데 개발 환경과 운영 환경을 거의 동등하게 재현할 수 있다.
    • 물리적 환경의 차이나 서버 구성의 차이를 무시할 수 있다.
    • Container 간의 연동이나 클라우드 플랫폼 지원 등 여러 면에서 장점이 있다.
  • 추천하지 않는 경우
    • Docker Container의 내부는 Linux 계열 운영체제와 같은 구성을 취하는 것이 많은데 Container는 운영체제의 동작을 완전히 재현하지는 못하기 때문에 좀 더 자세한 Linux 계열 운영체제의 동작이 요구되는 가상환경을 구축해야 한다면 기존 방법대로 가상화 소프트웨어를 사용하는 것이 낫다.
    • 비 Linux 환경이 필요한 경우에도 Docker가 적합하지 않다.
  • 기타
    • Container 가상화는 프로세스 가상화로 Container 엔진인 Docker와 오케스트레이션 도구인 Kubernetes는 호스트 운영체제의 커널을 공유하고 그 위에 실행 파일 및 라이브러리, 기타 구성 파일 등을 Image로 빌드하여 패키지로 배포하는 방식이다.
    • Container는 최신 기술이 아니고 오랜 시간 동안의 변화를 통해서 LXC 기술로 완벽해졌고 LXC 기능을 차용한 Docker를 통해 Container의 생성과 배포를 위한 완벽한 가상화 솔루션이 되었고 Container 표준화로 자리 잡았다.
    • Container는 코드와 모든 종속성을 패키지화 하는 표준 소프트웨어 단위로 애플리케이션이 하나의 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는데 Docker Container Image는 애플리케이션을 실행하는데 필요한 모든 것(코드, 런타임, 라이브러리 등)을 포함하는 경량의 독립형 실행 가능 소프트웨어 패키지라고 할 수 있다.
    • Docker Container Image는 Docker Hub로부터 내려받거나 Dockerfile을 통해 생성해 Docker Engine을 이용해서 실행하면 Container 서비스가 된다.
    • 주요 도구
      • LXC를 이용한 Container 구동: containerd는 Linux 및 윈도우용 데몬으로 Image 전송 및 스토리지에서 Container 실행 및 구동, 네트워크 연결까지 호스트 시스템 전체 Container의 라이프 사이클을 관리한다.
      • 통합 Buildkit: Dockerfile의 설정 정보를 이용하여 Docker Image를 빌드하는 오픈 소스 도구이며 빠르고 정확하게 여러 가지 아키텍쳐 향상 기능을 제공한다.
      • Docker CLI: Docker 명령을 수행하는 기본적인 도구
    • 구성 요소
      • Docker Client: 명령을 수행하는 CLI
      • Docker Host: 도커를 설치한 서버 혹은 가상 머신
      • Docker Engine: Docker를 이용한 애플리케이션 실행 환경을 제공하는 핵심 요소
      • Docker Hub: 전 세계 Docker 사용자들과 함께 Docker Container Image를 공유하는 클라우드 서비스
      • Docker-Compose: 의존성 있는 독립된 Container에 대한 구성 정보를 yaml 코드로 작성하여 일원화된 애플리케이션 관리를 가능하게 하는 도구이다.
      • Docker Registry: Docker Container Image를 push/pull 할 수 있는 레지스트리 구축에 사용하는 도구 (Docker Hub 같은 걸 직접 만드는 것)
      • Docker Swarm: 여러 Docker Host를 클러스터로 구축하여 관리할 수 있는 Docker 오케스트레이션 도구 (쿠버네티스와 비슷하지만 기능이 좀 약한 것)
  • 엔진 설치 Docker에서 제공하는 공식 GPG(GNU Privacy Guard) key 추가
    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
    
    sudo apt-key fingerpring
    
    데비안 계열의 Docker repository 추가 (도커 레포지토리를 레포지토리 목록에 추가)
  • echo \\ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] <https://download.docker.com/linux/ubuntu> \\ $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \\ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update ​

패키지 목록 업데이트

sudo apt update

저장소 확인

apt-cache policy docker-ce

도커 클라이언트와 엔진 설치

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

도커 설치 확인

sudo docker version

서비스 시작

sudo service docker start

현재 로그인 한 유저에게 docker 명령 실행 권한 부여

sudo usermod -aG docker $(whoami)
sudo chmod 666 /var/run/docker.sock
sudo service docker restart

기본 사용

  • 이미지 다운로드
sudo docker pull hello-world
  • 이미지 확인
docker images
  • 이미지를 컨테이너로 생성
docker run hello-world
  • 컨테이너 확인
docker ps -a
  • 도커 버전 확인
docker version
  • 도커 구성 정보 확인
docker info
  • 디스크 사용량 확인
docker system df -v
  • 도커 관련 이벤트 정보를 표시하는 명령
docker system events
  • 도커 서비스 확인하기
    • master 원격 창 2개 띄어놓기
docker system events # 첫 번째 창에서 실행
docker run -itd -p 80:80 --name=weapp nginx # 두 번째 창에서 실행

→ 하면 로그를 확인해볼 수 있다.

  • 도커 중지하기
docker stop weapp

  • 필터 설정하기
docker system events --filter 'type=image'
docker system events --filter 'event=stop'
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 .}}'

이미지 다운 받고 컨테이너 설정 → 지울 땐 컨테이너 지우고 이미지 지우기

  • 모든 컨테이너 삭제
docker rm -f $(docker ps -aq) # $-> 변수가 된다.

  • 모든 이미지 삭제
docker rmi $(docker images -q)

실습 - 원격 창 3개 띄어놓기

docker system events --filter 'type=image' # 창 1
docker system events # 창 2

이미지 다운 받기 (있으면 다운로드 안 받는다.)

docker pull nginx # 창 3

컨테이너 만들기

docker run -itd -p 80:80 --name=weapp nginx

→ 필터 안 걸은 곳(창 2)에서만 로그 찍힘 (창 1은 이미지 로그만 보여달라고 필터 걸었으니까)

  • 컨테이너를 만들면서 내부 접속
    • 내부 접속을 하는 이유는 설정을 변경하기 위해서 또는 설정을 추가하기 위해서이다. (파이썬 다운로드 받으려고 한다. 도커 허브에 없으면 다운로드 받을 수 없다. 리눅스에서 직접 다운 받고 그걸 이미지로 만들기 → shell로 들어가기, ex 내 개발 환경, 테스트 환경을 이미지화 시켜놓고 있다가 필요할 때마다 사용하는 사람들도 있다.)
    • 컨테이너를 백그라운드처럼 실행하고 터미널처럼 보이게 해줘.
docker container run -it diamol/base

→ i 명령 : 포그라운드 상태에서 사용자가 직접 상호작용 가능하게 함

→ t: TTY 할당 (터미널 환경 제공)

## 이렇게 우분투도 다운 받을 수 있다.
docker container run -it ubuntu

  • 현재 실행 중인 컨테이너 확인
docker ps
  • 모든 컨테이너 확인
docker ps -a
  • 컨테이너 내부에서 실행 중인 프로세스 확인
docker container top 컨테이너ID

  • 상세 정보 확인하기
docker container inspect 컨테이너ID

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

→ 나중에 멈추거나 제대로 작동 안 할 때 logs 로 확인해보기

Docker Command

Docker Registry

  • Image를 배포하는 장소
  • Docker Hub는 Docker 제작사에서 운영하는 공식 Docker 레지스트리로 Apache나 MySQL, Ubuntu의 공식 Image 모두 Docker Hub에 참여해 Docker 허브에서 Image를 배포하는데 run 커맨드나 pull 커맨드를 사용할 때 내려받는 Image를 제공하는 사이트이다.
  • Private Registry를 직접 구축해서 사용할 수 있고 CSP의 Registry를 이용할 수 있다.
  • Repository는 Registry 내에서 하나의 이미지를 저장하기 위한 단위이다.

Docker Container Service

  • Docker Container Application Service Development Flow
    • 애플리케이션 코드 개발
    • Base Image를 이용한 Dockerfile을 생성
    • Dockerfile Build를 통한 새로운 이미지 생성
    • 생성된 이미지를 이용한 컨테이너를 실행 (도커 컴포즈를 이용한 다중 컨테이너를 만들고 마이크로 서비스 테스트)
    • 컨테이너 애플리케이션 서비스를 테스트
    • 서비스 테스트가 끝나면 로컬 및 원격 저장소에 이미지를 저장
    • 깃허브 등을 활용한 도커 파일을 관리
    • 동일 환경에서의 지속적 애플리케이션 개발을 수행

 

  • IaC(Infra as Code)
    • 컨테이너 동작에 필요한 모든 내용을 사전에 코드로 작성해 Ansible, Chef, Puppet, Vagrant와 같은 Infra Provisioning 도구로 자동화하게 되면 필요할 때마다 애플리케이션 및 서버 환경을 적은 비용으로 빠르게 개발, 배포, 확장할 수 있는데 이러한 개념이 IaC이다.
    • 개발자는 애플리케이션 개발, 테스트, 배포 시마다 모든 인프라 구성 요소를 하나 하나 수동적으로 체크하거나 맞출 필요가 없고 변경 불가능한 인프라 환경에서 언제든 동일한 환경에서의 개발이 가능해지며, 버전 업이나 패치 등의 작업이 필요하면 기존 Image를 변경하지 않고 해당 작업을 수행한 새로운 이미지를 생성해서 신규 인프라 서버로 사용 가능하다.

Docker 명령어

  • 명령어는 docker로 시작
  • 기본 형식
    • docker 명령어 옵션 대상 인자
    • 이미지를 다운로드
    docker image pull 이미지이름
    
    • Image를 Container로 실행
    docker container run 이미지이름
    
    • 컨테이너 실행
    docker container start 컨테이너이름
    
    • 백그라운드에서 시작
    docker container run -d 컨테이너이름
    
    • container run → container가 상위, run이 하위 명령어이다.
      • 경우에 따라서는 상위 명령어를 생략해도 된다.
  • 컨테이너 관련 명령어
    • container 관련 명령어: 대부분 container를 생략하고 사용해도 된다.
    • start: 컨테이너 실행
    • stop: 컨테이너 정지
    • create: 컨테이너 생성
    • run: 이미지가 없으면 내려 받고 컨테이너를 생성해서 실행
    • rm: 컨테이너 삭제
    • exec: 컨테이너에 명령을 수행 (만들어진 컨테이너에 접속할 때 exec 주로 사용한다.)
    • ls: 컨테이너의 목록을 출력
    • cp: 도커 컨테이너와 도커 호스트 간에 파일을 복사
    • dommit: 도커 컨테이너를 이미지로 생성
  • Image 관련 명령
    • pull: 이미지 다운로드
    • rm: 이미지 삭제
    • ls: 이미지 목록 출력
    • 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: 도커 엔진 및 명령행 도구의 버전을 출력

이미지 관련 명령어

도커 이미지: 컨테이너 형태로 소프트웨어를 배포하기 위해 필요한 모든 요소를 실행할 수 있는 포맷으로 컴파일 및 빌드한 패키지

  • 도커 이미지는 독립적이기 때문에 의존성을 고려할 필요가 없고 경량화된 패키지이므로 비교적 작은 용량으로도 제 역할을 수행할 수 있다.
  • 도커 컨테이너 상태를 담은 Snapshot 이라고도 한다.
  • 하나의 이미지를 가지고 동일한 환경을 가진 여러 개의 컨테이너를 손쉽게 생성할 수 있다.
  • 도커 이미지는 여러 개의 레이어로 구성되어 있고 도커 허브와 같은 중앙 저장소에 저장되어 관리된다.

docker search [options] 검색_키워드

  • 이미지 검색

MySQL 5개만 검색

docker search --limit 5 mysql

docker [image] pull [OPTIONS] name[:TAG | @IMAGE_DIGEST]

  • 이미지 다운로드
  • 이때 TAG를 생략하면 :latest가 자동으로 추가된다.
  • image는 생략 가능

jenkins/jenkins:lts 다운로드

docker image pull jenkins/jenkins:lts

debian:latest 버전 다운로드 → 빠르다. (debian이 linux 기반이고 도커는 리눅스부터 다운로드 받으니까)

docker pull debian

Service 개발

  • 요청 → Controller(필요한 서비스 로직을 호출해서 결과를 반환해서 응답) → Service(비즈니스 로직) → Repository(데이터베이스 연동)
    • Service → Template Method Pattern 적용
      • Interface(모형) → Class(작업 내용)
  • Model(Entity): 데이터베이스 테이블 모양과 동일 (컬렉션)

Entity : Repository에서만 쓰는 거고

Service, Respository에서 왔다 갔다 하면서 써야 하면 DTO

한 곳에서만 쓰는 것: VO

Kafka

CQRS: 읽기와 쓰기를 분리하자!

  • 읽기: 속도가 중요하고
    • mongo db: 데이터 빨리 읽어옴
  • 쓰기: 안정성이 중요
    • rdbms는 강력한 트랜잭션을 제공
  • 마이크로 서비스의 개념: 하나의 서비스는 자기 저장소에만 접근해야 한다. 남의 것 접근하지 말아라 → 쓰기 db에 데이터 들어온 걸 읽기 db에 주는 것은 마이크로 서비스 개념에 어긋난다.
  • 쓰기 db와 읽기 db가 직접적으로 연결되어 있음 → 읽기 db에 장애가 발생하면 쓰기 db의 변경 사항을 읽기 db에 줄 수 없음 (따라서 직접적으로 쓰는 건 안 됌!!)
  • 해결 방법: 비동기로 메시징 큐 사용
    • 넘버링을 해서 한 쪽 시스템이 망가져서 못 받은 데이터들을 시스템이 정상화 되었을 때 순서대로 보내줄 수 있다.
    • 주문 ↔ 배송 서비스도 이와 같은 개념 사용
      • 주문에서 배송 서비스가 하나의 서비스로 묶여버리면 주문은 배송이 끝날 때까지 commit 할 수 없다. (커밋 못 하는 건 굉장히 큰 문제: db에 락이 걸린 것이다.)
      • → 주문을 commit, 배송 안되면 안 되었다고 주문에 commit, 주문 commit 취소
  • kafka의 위치: 앱과 앱의 사이
    • 나한테 구독 신청한 사람들 어디까지 구독하고 있는지 다 기억하고 있어야 하니까 성능이 좋아야 한다. (EC2에서 좋은 거 선택하자.)

 

 

참고)

방화벽 설정을 해놨으니 ssh 접속 하려면 아래의 명령어를 작성해줘야 한다.

(방화벽 기본은 deny all 이니까)

sudo ufw allow 22
728x90
반응형