[CS 지식] Docker

JUJU·2024년 5월 10일
0

Docker

Docker는 애플리케이션을 컨테이너라는 격리된 환경에서 실행할 수 있게 해주는 오픈 소스 플랫폼이다.

  • 도커는 Virtual Machine과 비슷한 개념이지만, 하드웨어적으로 훨씬 가볍다.
  • Virtual Machine: 내 컴퓨터 위에 완전히 새로운 디바이스(w/OS)를 올림
  • Docker: 컴퓨터 위에 Docker-Engine + 컨테이너를 올림.
    • Docker-Engine은 새로운 운영체제가 아니다.
    • 컨테이너는 하나의 프로세스라고 생각하면 편하다.

■ docker 설치

M1 Macbook 기준

curl -Lo docker.tgz https://download.docker.com/mac/static/stable/aarch64/docker-24.0.6.tgz
tar xzvf docker.tgz
sudo cp docker/* /usr/local/bin/

■ docker-compose 설치

docker-compose는 아래의 명령어를 통해 설치할 수 있다.

DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
mkdir -p $DOCKER_CONFIG/cli-plugins
curl -SL https://github.com/docker/compose/releases/download/v2.21.0/docker-compose-darwin-aarch64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
sudo mv $DOCKER_CONFIG/cli-plugins/docker-compose /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

⚠️ v2.27.0에서 v가 반드시 붙어 있어야 한다!!!


■ 왜 사용하는가?

개발자는 자신의 컴퓨터 환경에서 코드를 작성하고 서버에 올린다.
하지만, 자신의 컴퓨터 환경과 서버의 환경은 다르다. 따라서, 종속성 문제가 발생할 수 있다.

Docker는 이를 해결하기 위해 완전히 독립된 환경을 제공한다.

  • Docker File로 나의 어플리케이션에서 필요한 모든 정보를 담는다.
  • Docker Image로 그 환경을 하나의 템플릿으로 만든다.(일종의 클래스 같이)
  • Docker Container는 Image로 찍어낸 하나의 환경이다.
    Docker Contianer 각각은 완전히 독립된 환경이다.
    따라서, 내 컴퓨터던 서버던 똑같이 동작하는 것을 보장해준다.

■ 사용방법

동료가 Dockerfile과 docker-compose.yml을 작성해서 보내주면, 다음과 같이 실행하면 된다.

전제: Docker와 docker-compose가 깔려있어야 한다.

  • docker-compose build: docker-compose.yml 파일을 구성 정보로 빌드
  • docker-compose up -d: docker-compose.yml 파일에서 정의된 서비스들에 대한 컨테이너를 빌드

처음 실행하는 경우, Root에서 docker-compose builddocker-compose up -d를 차례대로 입력한다.

이후에 실행할 때는 docker-compose up -d만 입력해서 실행시키면 된다.


■ Dockerfile

Docker 이미지를 빌드하기 위한 명령어들을 작성한 파일이다.

  • 반드시 D는 대문자이어야 한다.
  • 이미지 설정, 의존성 설치, 환경 변수 설정 등 애플리케이션 실행에 필요한 모든 단계를 명시해야 한다.

■ Docker 이미지

Docker 컨테이너를 실행하는 데 필요한 모든 파일과 설정을 포함한 패키지

  • 【 Docker 이미지 - 컨테이너 】 를 【 클래스 - 객체 】 관계로 생각하면 이해하기 쉽다.
  • 이미지는 생성 후 변경되지 않는다. 변경이 필요한 경우 새로운 이미지를 빌드해야 한다.

이미지를 빌드하기 위해서는, Dockerfile이 존재하는 디렉토리에서 다음 명령을 실행하면 된다.

docker build -t [이미지 이름]:[태그] .

빌드한 이미지로 컨테이너를 실행할 수 있다.

docker run -d -p 4000:80 --name mycontainer myimage:tag
// -p 4000:80: 호스트의 4000 포트와 컨테이너의 80 포트를 연결. 
// 이는 외부에서 컨테이너의 80 포트에 접근할 때 사용한다.

■ docker-compose

Docker Compose는 여러 컨테이너를 동시에 구성하는데 사용되는 도구로, docker-compose.yml 파일을 통해 서비스, 네트워크, 볼륨 등을 정의한다.

  • 이 파일에 서비스를 설정함으로써 여러 컨테이너를 함께 쉽게 시작하고 연동할 수 있다.

다음은 현재 개발중인 프로젝트의 docker-compose.yml 파일이다.

services: # 실행할 모든 컨테이너 서비스를 정의한다. 
  postgres: # 첫번째 서비스의 이름
    image: postgres:16 # 이 서비스가 사용할 도커 이미지, Docker Hub에서 제공한다.
    container_name: postgres
    environment: # 컨테이너 내에서 사용할 환경변수
      POSTGRES_USER: cluster23
      POSTGRES_PASSWORD:  cluster23
      POSTGRES_DB: quant-helper
    ports: # 호스트 머신(이 컨테이너를 담고 있는 PC) - 컨테이너간의 포트 매핑
      - "5432:5432"
    volumes: # 데이터를 영구적으로 저장하기 위한 볼륨
      - postgres_data:/var/lib/postgresql/data
    restart: unless-stopped

  api: # 두번째 서비스의 이름
    build: # Docker 이미지를 빌드하기 위한 설정
      context: .
      dockerfile: ./docker/api/Dockerfile
    container_name: api
    ports:
      - "8080:8080"
    depends_on: # api 서비스가 실행되기 이전에 postgres 서비스가 먼저 실행되어야 한다.
      - postgres
    networks: # backend 네트워크에 연결한다.
      - backend
      
networks: # backend network는 driver로 bridge를 사용한다.
  backend:
    driver: bridge

volumes: # postgres_data 볼륨 정의
  postgres_data:

volumes

docker는 가상화 환경인 컨테이너에서 작업을 진행한다.
따라서, 모든 데이터는 컨테이너 내부에만 존재하게 된다.
➜ 컨테이너를 삭제하면 작업한 모든 데이터가 날라간다.

컨테이너가 삭제되어도 데이터를 유지하고 싶은 경우에 사용하는 것이 volume이다.
volume은 데이터를 외부로 링크하는 기능이다.

위의 경우, postgres 서비스의 데이터는 /var/lib/postgresql/data에 저장된다.


network

도커의 네트워크란 Docker 컨테이너 간의 통신을 관리하고 격리하기 위한 기능이다.

profile
개발자 지망생

0개의 댓글

관련 채용 정보