2024.10.28.월.TIL Docker, Docker-Compose

김기남·2024년 10월 28일
post-thumbnail

안녕하세요, 오늘은 Docker, Docker-Compose 에 대해 정리해 보았습니다.

Docker란 무엇인가?

Docker는 애플리케이션을 컨테이너라는 격리된 환경에서 실행할 수 있도록 해주는 플랫폼입니다. 이 컨테이너는 애플리케이션과 그 실행에 필요한 모든 라이브러리, 종속성 등을 포함하고 있어, 어떤 환경에서도 일관되게 실행될 수 있습니다. Docker를 사용하면 개발, 테스트, 배포 과정이 훨씬 간편해집니다.

Docker의 주요 기능

Docker의 주요 기능 중 하나는 이미지와 컨테이너의 개념입니다. 이미지는 애플리케이션의 실행 환경을 정의하는 템플릿이고, 컨테이너는 이 이미지를 기반으로 실행되는 인스턴스입니다. 또한, Docker는 다음과 같은 기능을 제공합니다

  • 버전 관리 : Docker 이미지는 버전 관리가 가능하여, 이전 버전으로 쉽게 롤백할 수 있습니다.
  • 이식성 : Docker 컨테이너는 어떤 환경에서도 동일하게 실행될 수 있습니다.
  • 격리성 : 각 컨테이너는 서로 독립적으로 실행되므로, 하나의 컨테이너에서 발생한 문제는 다른 컨테이너에 영향을 미치지 않습니다.

Docker Compose란?

Docker Compose는 여러 개의 Docker 컨테이너를 정의하고 실행하기 위한 도구입니다. 복잡한 애플리케이션을 여러 개의 서비스로 나누어 관리할 수 있게 해줍니다. Docker Compose를 사용하면 YAML 파일을 통해 서비스, 네트워크, 볼륨 등을 정의할 수 있습니다.

Docker Compose의 사용법

Docker Compose를 사용하기 위해서는 먼저 docker-compose.yml 파일을 작성해야 합니다. 이 파일에는 각 서비스의 설정이 포함됩니다. 예를 들어, 웹 애플리케이션과 데이터베이스를 함께 실행하고 싶다면 다음과 같은 구성을 할 수 있습니다.

yaml
version: '3.9'
services:
web:
image: seosh817/composetest/web
ports:
- "5000:5000"
db:
image: seosh817/composetest:mysql
environment:
MYSQL_ROOT_PASSWORD: example

위의 예제에서 web 서비스는 웹 애플리케이션을 실행하고, db 서비스는 MySQL 데이터베이스를 실행합니다. 이처럼 Docker Compose를 사용하면 여러 서비스를 쉽게 관리할 수 있습니다.

Docker와 Docker Compose의 차이점

Docker는 단일 컨테이너를 관리하는 데 중점을 두고 있지만, Docker Compose는 여러 개의 컨테이너를 동시에 관리할 수 있도록 설계되었습니다. Docker Compose를 사용하면 복잡한 애플리케이션을 구성하는 여러 서비스를 한 번에 시작하고 중지할 수 있습니다.

실제 예제: Docker Compose 설정하기

이제 실제로 Docker Compose를 설정해 보겠습니다. 먼저, docker-compose.yml 파일을 작성한 후, 다음 명령어를 실행하여 서비스를 시작합니다.

bash
docker-compose up

이 명령어를 실행하면 정의된 모든 서비스가 시작됩니다. 만약 서비스를 중지하고 싶다면 다음 명령어를 사용합니다.

bash
docker-compose down

이렇게 간단한 명령어로 여러 서비스를 관리할 수 있습니다.

오늘의 코드카타

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

class Solution {

    public int[] solution(int N, int[] stages) {
        HashMap<Integer, Double> map = new HashMap<>();
        int[] userFailCnts = new int[N + 2];
        int[] userTotalCnts = new int[N + 1];

        for (int stage : stages) {
            userFailCnts[stage]++;
        }

        userTotalCnts[N] = userFailCnts[N] + userFailCnts[N + 1];
        for (int i = N - 1; i >= 1; i--) {
            userTotalCnts[i] = userFailCnts[i] + userTotalCnts[i + 1];
        }

        for (int i = 1; i < userTotalCnts.length; i++) {
            if (userFailCnts[i] == 0 || userTotalCnts[i] == 0) {
                map.put(i, 0.0);
            } else {
                map.put(i, (double) userFailCnts[i] / userTotalCnts[i]);
            }
        }

        List<Integer> list = new ArrayList<>(map.keySet());
        Collections.sort(list, (o1, o2) -> Double.compare(map.get(o2), map.get(o1)));

        return list.stream().mapToInt(Integer::intValue).toArray();
    }
}
import java.util.Arrays;

public class Main {

    public static void main(String[] args) {

        Solution solution = new Solution();

        int[] s1 = {2, 1, 2, 6, 2, 4, 3, 3};
        int[] s2 = {4, 4, 4, 4, 4};

        System.out.println(Arrays.toString(solution.solution(5, s1)));
        System.out.println(Arrays.toString(solution.solution(4, s2)));
    }
}

실패율

profile
새로운 시작~!

0개의 댓글