Docker

Docker & DockerCompose

josolha 2024. 2. 7. 15:46

Docker와 Docker Compose의 차이점

docker와 docker compose의 중요한 차이점은 docker는 명령줄(CLI)에만 의존하는 반면 

docker compose는 YAML 파일에서 구성 정보를 수신한다는 것이다.

 

두 번째 주요 차이점은 docker-compose가 여러 컨테이너를 구성하고 작동할 수 있는 반면 

docker는 단일 컨테이너만 동시에 시작할 수 있다는 것이다.


Docker 사용 예제

Docker를 사용하여 단일 컨테이너를 실행하는 예이다.

예를 들어, nginx 웹 서버를 시작하는 명령어는 다음과 같다.

docker run -d -p 8080:80 nginx

 

한편 docker-compose CLI를 사용하여 다중 컨테이너 애플리케이션을 관리할 수 있다.

 

Docker Compose는 docker-compose.yml 파일을 통해 여러 Docker 컨테이너를 구성하고 실행하는 옵션들을 제공하여,

명령어 줄(CLI)에서 직접 docker run에 입력하는 많은 옵션들을 파일로 옮겨 관리의 편의성을 높일 수 있다.

이는 재사용성과 관리의 용이성을 향상시킨다.

 

docker에서 사용하는 것과 동일한 Docker API의 상단에서 스테이징 영역으로 작동하여 docker 명령과 많은 셸 스크립팅을 활용하여 docker compose가 수행할 수 있는 모든 작업을 수행할 수 있다.

 

Docker Compose 사용 예제

예를 들어, nginx 웹 서버와 mysql 데이터베이스를 함께 실행하는 설정은 다음과 같을 수 있다.

version: '3'
services:
  web:
    image: nginx
    ports:
      - "8080:80"
    depends_on:
      - db
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: example

docker-compose.yml 파일은 두 개의 서비스를 정의한다.

webdb. web 서비스는 nginx 이미지를 사용하고, db 서비스는 mysql 이미지를 사용한다.

 

또한, web 서비스는 db 서비스에 의존하며, db 서비스는 환경 변수로 MYSQL_ROOT_PASSWORD를 설정한다

 

Docker Compose에서 서비스는 실행할 애플리케이션 또는 컨테이너의 구성을 말한다. docker-compose.yml 파일 내에서 서비스를 정의하여 Docker 컨테이너의 이미지, 포트 매핑, 볼륨 마운트, 환경 변수 등을 설정할 수 있다.

 


DockCompose  작성법

컴포즈 파일 (YAML 형식)의 작성 방법

  • 첫 줄에 도커 컴포즈 버전을 기재
    • 주 항목 services, networks, volumes 아래에 설정 내용을 기재
    • 항목 간의 상하 관계는 공백을 사용한 들여쓰기로 나타낸다.
    • 들여쓰기는 같은 수의 배수만큼의 공백을 사용한다.
    • 이름은 주 항목 아래에 들여쓰기한 다음 기재한다.
    • 컨테이너 설정 내용은 이름 아래에 들여쓰기한 다음 기재한다.
    • 여러 항목을 기재하려면 줄 앞에 '를 붙인다.
    • 이름 뒤에는 콜론(;)을 붙인다.
    •  콜론 뒤에는 반드시 공백이 와야 한다(바로 줄바꿈하는 경우는 예외)
    • # 뒤의 내용은 주석으로 간주된다.
    • 문자열은 작은따옴표() 또는 큰따옴표()로 감싸 작성한다.

컴포즈 파일의 항목

  • dependson은 다른 서비스에 대한 의존관계를 나타낸다.
    • 컨테이너를 생성하는 순서나 연동 여부를 정의
    • ex. hellotest 컨테이너의 정의에 'depends_on: -josolha” 내용이 포함됐다면 josolha 컨테이너를 생성한 다음에 hellotest 컨테이너를 만듦 : 워드프레스처럼 MysQL 컨테이너가 먼저 있어야 하는 경우에 컨테이너 생성 순서를 지정
  • restart는 컨테이너 종료 시 재시작 여부를 설정함

 

예시

docker-compose.yml 파일은 Java 애플리케이션, MySQL 데이터베이스, 및 Redis 캐시 서버를 포함한다

version: '3.8'
services:
  app:
    image: openjdk:11-jdk
    volumes:
      - ./app:/usr/src/app
    working_dir: /usr/src/app
    command: javac Main.java && java Main
    depends_on:
      - db
      - cache

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    volumes:
      - db-data:/var/lib/mysql
    restart: always

  cache:
    image: redis:alpine
    restart: always

volumes:
  db-data:

networks:
  default:
    driver: bridge

 

  • 버전(Version): version: '3.8'은 사용하는 Docker Compose 파일의 버전을 지정한다.
    이 버전은 Docker Compose의 기능 호환성을 결정한다.

  • 서비스(Services): 애플리케이션 구성 요소를 정의한다.
    • app: Java 애플리케이션 서비스이다.
      openjdk:11-jdk 이미지를 사용하여 Java 환경을 구성한다.
      볼륨 매핑(volumes)을 통해 호스트 시스템의 현재 디렉토리(./app) 내의 코드를 컨테이너의 /usr/src/app 디렉토리에 연결, command를 사용해 Java 파일을 컴파일하고 실행한다.
      depends_on은 app 서비스가 db와 cache 서비스에 의존한다는 것을 나타낸다.
    • db: MySQL 데이터베이스 서비스이다.
      환경 변수를 통해 MySQL의 루트 비밀번호, 데이터베이스 이름, 사용자 및 비밀번호를 설정한다. 데이터 지속성을 위해 볼륨(db-data)을 사용한다.
    • cache: Redis 캐시 서버이다. redis:alpine 이미지를 사용한다
  • 볼륨(Volumes): db-data 볼륨을 정의하여 MySQL 데이터베이스의 데이터를 영구적으로 저장한다.
  • 네트워크(Networks): default 네트워크를 bridge 드라이버를 사용하여 정의한다.
    이는 Docker Compose에 의해 자동으로 생성되는 기본 네트워크 설정이며,
    모든 서비스가 이 네트워크에 연결되어 서로 통신할 수 있다.

이 구성을 사용하면 Java 애플리케이션, MySQL, 및 Redis 서비스가 함께 동작하는 환경을 간단히 설정할 수 있다.
개발자는 이 환경을 사용하여 애플리케이션 개발, 테스트 및 프로토타이핑을 할 수 있다.


Docker Compose 명령어(docker-compose up, docker-compose down 등)를 사용하여

이 환경을 쉽게 시작하거나 종료할 수 있다.


DockCompose  실행 명령어

  • 도커 컴포즈는 docker-compose 명령을 사용
  • -f 옵션을 통해 compose file 경로 지정
  • docker-compose up: 컴포즈 파일에 정의된 컨테이너 및 네트워크와 같은 주변 환경 생성
    • $ docker-compose -f [정의_파일_경로] up [옵션]

 

  • docker-compose down : 생성 된 컨테이너와 네트워크를 종료하고 삭제
    • s docker-compose f [컴포즈_파일_경로] down [옵션]

  • docker-compose stop: 컨테이너를 종료
    • docker-compose-f [컴포즈_파일_경로] stop [옵션]
  • docker-compose [명령어]-d
    • -d 옵션을 붙이고 경로 정의 없이 도커 컴포즈 명령어를 실행하면 현재 작업 디렉터리를 컴포즈용 폴더로 사용할 수 있다.
  • --scale 옵션
    • 같은 구성의 컨테이너를 여러 세트 만들고 싶은 경우 사용할 수 있는 옵션.

 

 

예시

 

서비스 시작: docker-compose up 명령어를 사용하여 정의된 모든 서비스를 시작한다. -d 옵션을 사용하면 백그라운드에서 실행된다.
(특정 파일 시 : docker-compose -f <파일 경로> up -d )

docker-compose up -d

 

 

서비스 중지 및 제거: docker-compose down 명령어를 사용하여 실행 중인 모든 서비스를 중지하고
관련 네트워크, 볼륨과 함께 제거한다.

docker-compose down

 

 

컨테이너 스케일 조정: --scale 옵션을 사용하여 특정 서비스의 인스턴스 수를 조정할 수 있다.
예를 들어,
web 서비스의 인스턴스를 3개로 늘리고 싶다면 다음과 같이 실행한다.

docker-compose up -d --scale web=3

 

 

서비스 재시작: 특정 서비스를 재시작하려면 docker-compose restart 명령어를 사용한다.

docker-compose restart web