Docker

달달한단밤·2024년 2월 19일

도커란?

도커(Docker)는 소프트웨어 컨테이너 기술을 제공하는 플랫폼으로, 애플리케이션과 그 의존성들을 격리된 환경에서 실행할 수 있게 해줍니다. 이를 통해 애플리케이션을 효율적으로 개발, 배포, 및 실행할 수 있습니다. 도커는 다양한 운영 체제 및 클라우드 환경에서 동일한 방식으로 동작하므로 개발 환경과 프로덕션 환경 간의 일관성을 제공합니다.

VM vs Docker

VM

  • Guest OS, Hypervisor라는 부분에 만약 윈도우 OS에서 리눅스를 설치하면 위 그림의 빨간 overhead가 한겹 더 생겨 성능 느려지는 가장 큰 원인중 하나이다

Docker

  • 도커는 VM과 달리 격리만 해주는 역할을 하기 때문에 성능 하락이 거이 없다

도커의 특징

확장성/이식성

  • 도커가 설치되어있으면 어디든 컨테이너 실행가능
  • 특정 회사나 서비스에 종속적이지 않다
  • 쉽게 개발서버와 테스트서버를 생성할 수 있다

표준성

  • 도커를 사용하지 않는 경우 ruby, nodejs, go등으로 만든 서비스들의 배포 방식은 제각각 다르다
  • 컨테이너라는 표준으로 서버를 배포하므로 모든 서비스들의 배포과정이 동일하다

설정관리

  • 보통 환경변수로 제어
  • MYSQL_PASS=password와 같이 컨테이너를 띄울때 환경변수를 같이 지정
  • 하나의 이미지가 환경변수에 따라 동적으로 설정파일을 생성하도록 만들어져야 한다.

자원관리

  • 컨테이너는 삭제 후 새로 만들면 모든 데이터가 초기화된다
  • 업로드 파일을 외부 스토리지와 링크하여 사용하거나 S3같은 별도의 저장소가 필요하다
  • 세션이나 캐시를 memcached, redis와 같은 외부로 분리한다

도커의 주요 개념 및 구성 요소

  1. 이미지(Image) : 도커 이미지는 애플리케이션과 그 실행에 필요한 모든 것을 포함하는 가볍고 독립적인 패키지이다. 이미지는 파일 시스템, 라이브러리, 실행 환경 및 애플리케이션 코드 등을 포함하고 있다.
  2. 컨테이너(Container) : 도커 컨테이너는 이미지의 실행 가능한 인스턴스이다. 각 컨테이너는 자체 파일 시스템, 프로세스, 네트워크를 가지며 호스트 및 다른 컨테이너와 격리되어 있다.
  3. 도커 레지스트리(Registry) : 도커 이미지를 저장하고 관리하는 서비스이다. 대표적인 레지스트리로 도커 허브가 있다. 사용잔는 이미지를 레지스트리에서 가져와 사용할 수 있다.
  4. 도커 컴포트(Compose) : 여러 개의 컨테이너로 이루어진 애플리케니션을 정의하고 실행하기 위한 도구이다. docker-compose.yml 파일을 사용하여 애플리케니션의 서비스, 네트워크, 볼륨 등을 정의하고 관리할 수 있다.

한줄 요약

  • 스프링 앱을 배포한다고 가정할 때 빌드 후 빌드 파일을 EC2 환경에 옮겨서 실행시키는건 효율적이지 못하니까 빌드된 파일을 이미지로 만든 후 컨테이너를 만들어 스프링 서버를 실행시킨다.

Docker 설치

  1. 우분투 시스템 패키지 업데이트
    sudo apt-get updaet

  2. 도커 설치에 필요한 패키지 설치

sudo apt-get intall apt-transport-https ca-certificates curl gnupg-agent software-properties-common
  1. Docker 공식 GPG 설치
  • 리눅스 패키지 관리 툴이 이 프로그램 패키지가 유효한지 확인하기 위해 설치 전 gpg키로 검증을 거친다
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  1. Docker의 공식 apt 저장소를 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
  1. 시스템 패키지 업데이트
sudo apt-get update
  1. Docker 설치
sudo apt-get install docker-ce docker-ce-cli containerd.io
  1. 도커 설치 확인
docker -v

Docker 명령어

  • 설치된 이미지 확인
docker images
  • 컨테이너 확인
# 실행중인 컨테이너
docker ps

# 모든 컨테이너
docker ps -a
  • 이미지 다운로드
docker pull {받을 이미지 이름}
  • 컨테이너 로그 확인
docker logs {컨테이너 이름 or ID}
  • 도커 이미지 빌드
    Dockerfile이 있는 위치에서 명령어 입력
docker build -t {이미지 이름}:{태그}
  • 도커 이미지 실행
    - d : 백그라운드 실행
    - in-port : 실제 서버에서 요청을 받는 포트 번호
    - out-port : 도커의 포트 번호
docker run -d -p {in-port}:{out-prot} --name={컨테이너 이름} {이미지 이름}
  • 실행중인 도커 컨테이너 내부 접속
sudo docker exec -it {{container-name}} /bin/sh
or
sudo docker exec -it {{container-name}} /bin/bash

Docker-Compose

도커 컴포즈는 여러 개의 도커 컨테이너를 정의하고 실행하기 위한 도구로, 단일 파일에 애플리케이션의 서비스, 네트워크, 볼륨 등을 설정할 수 있다.

주요 개념

  1. 서비스(Service) : docker-compose.yml 파일 내에서 각 서비스는 하나의 도커 컨테이너를 나타낸다. 서비스 정의에는 이미지, 포트 매핑, 환경 변수, 볼륨 마운트 등이 포함될 수 있다.
  2. 네트워크(Networks) : 서비스 간 통신을 위한 도커 네트워크를 정의할 수 있다. 서비스는 동일한 네트워크에 속하면 서로 동신할 수 있다.
  3. 볼륨(Volumes) : 데이터를 저장하거나 컨테이너 간에 데이터를 공유하기 위해 도커 볼륨을 정의할 수 있다.
  4. 환경 변수(Environment Variables) : 서비스에 환경 변수를 설정하여 동적으로 컨테이너의 동작을 구성할 수 있다.

Docker-Compose 설치

  1. Docker-Compose 설치
sudo curl -SL "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. Docker-Compose 권한 부여
sudo chmod +x /usr/local/bin/docker-compose
  1. Docker-Compose 심볼릭 링크 지정
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  1. 버전 확인
docker-compose --version

Docker-Compose 명령어

  • docker-compose 빌드
sudo docker-compose build
  • docker-compose 실행
sudo docker-compose up
sudo docker-compose up -d
  • docker-compose 중지 및 컨테이너 삭제
sudo docker-compose down
  • 현재 실행중인 서비스 상태 확인
sudo docker-compsoe ps
  • docker-compose 이미지 다운로드
sudo docker-compose pull
  • 사용되지 않는 컨테이너 및 이미지 삭제 + 볼륨 정리
docker volume prune -f

Docker-Compose.yml 작성

version: "4"
services:
  springboot:
    image: {docker-id}/{spring-repository-name} # ex) duckbill413/test-spring:latest
    container_name: {spring-container-name} # ex) test-spring
    ports:
      - "8080:8080"
    networks:
      - {network-name} # ex) test_net
    restart: "always"

  nginx:
    image: {docker-id}/{nginx-repository-name} # ex) duckbill413/test-nginx:latest
    container_name: {nginx-container-name} # ex) test-nginx
    ports:
      - "80:80"
    depends_on:
      - {nginx-upstream-address} # ex) springboot
    networks:
      - {network-name}
    restart: "always"

networks:
  {network-name}:
    driver: bridge

0개의 댓글