
안녕하세요, 오늘은 Docker, Docker-Compose 에 대해 정리해 보았습니다.
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)));
}
}
실패율