docker compose는 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구입니다.
여러 개의 컨테이너가 하나의 어플리케이션으로 동작할 때 도커 컴포즈 를 사용하지 않는다면, 이를 테스트하 려면 각 컨테이너를 하나씩 생성해야 합니다. 예를 들면, 웹 어플리케이션을 테스트하려면 웹 서버 컨테이너, 데이터베이스 컨테이너 두 개의 컨테이너를 각각 생성해야 합니다.
처음에는 docker image를 하나로 묶어서 docker hub로 push한다고 생각했다. 하지만 이는 틀린 생각이였다. 이미지는 각각 push, pull하고
docker compose up을 하는쪽에서docker-compose.yml파일 작성후 docker compose로 묶어서 실행하면 된다.
우리 프로젝트를 예시로 들자면 5개의 서버를 띄우는데 이 경우에
1. docker hub에 5개 서버의 docker image를 각각 push한다.
2. 이후 ec2 인스턴스에서 5개의 image를 pull받는다.
3.docker-compose.yml파일을 작성한다.
4.docker compose up명령어 실행한다.
위 과정으로 docker compose를 실행한다.
먼저 docker hub에 docker image를 각각 push한다.

ec2 인스턴스에서 docker와 docker compose를 설치한다.
sudo yum update -ysudo yum install docker -ydocker -vsudo service docker startsudo usermod -aG docker ubuntu
// 설치 전 우분투 시스템 패키지 업데이트
sudo apt-get update
// Docker Compsoe를 설치합니다. (설치 버전 : 2.5.0)
sudo curl -L https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
// 다운로드 한 파일에 권한 설정
sudo chmod +x /usr/local/bin/docker-compose
// 설치가 완료되었는지 확인하기 위해 도커 컴포즈의 버전을 확인
docker-compose --version
docker compose 설치가 완료되면 docker command를 사용할 수 있다.
docker-compose.yml 파일에서 필요한 이미지들을 찾아서 빌드한다.
따로 서비스를 지정하지 않으면 모든 이미지가 빌드된다.
docker-compose.yml 파일에서 서비스에 필요한 모든 컨테이너를 생성하고 시작한다. 만약 컨테이너가 빌드되지 않았거나, 혹은 빌드 된 이후 도커파일의 변동으로 다시 빌드되야 하는 경우, 이미지를 빌드한 후 컨테이너를 생성, 시작한다.
만약 모든 이미지를 새로 빌드해서 컨테이너를 생성하고 싶다면, 아래 명령어를 사용한다.
docker compose up --build
일괄로 중단(stop)하고 싶다면 Ctrl + C !!
해당 프로젝트의 컨테이너를 중단하고, 제거한다. network나 volume또한 제거된다. 따라서 단순히 잠시 중단한 뒤 나중에 다시 시작하고 싶다면 docker compose stop 혹은 docker compose 가 실행되고 있는 터미널에서 ctrl + C를 통해 중단해야 한다.
명시한 서비스, 혹은 명시한 서비스가 없다면 전체 컨테이너를 중단한다.
down과는 다르게 단순 중단이므로 start 명령어로 다시 시작할 수 있다.
생성된 후에 멈췄던 컨테이너를 시작하는 명령어. 쉽게 말해 up을 통해 생성되고, 시작한 이후 docker compose stop 혹은 Ctrl + C를 통해 중단된 서비스를 다시 시작할 수 있다.
docker compose stop + docker compose start
만약 build 후 restart를 한다면 직전 생성된 이미지를 사용한다. 따라서 돌아가고 있는 컨테이너의 이미지를 바꿔야 한다면,
docker compose build <service>
docker compose restart <service>
위와 같이 빌드 한 후 재시작하면 된다.
현재 동작하는 컨테이너를 보여준다.
해당 서비스의 로그를 보여준다.
현재 돌아가는 컨테이너에 명령어를 전달해준다.
만약 conatiner_name을 지정해주지 않았다면, docker ps를 통해 container id를 먼저 얻어야 한다.
이것을 활용해서 현재 컨테이너에 터미널을 접속할 수 있다.
-i는 interactive 옵션으로 터미널을 통한 입력이 가능하게 해주고, -t옵션은 컨테이너의 출력을 터미널로 전달해주므로 두 옵션을 함께 사용해 쉘을 열면 된다.
docker exec -it <container_id/name> /bin/bash
이미지에 따라, /bin/bash를 찾을 수 없다고 뜰 수 있다. 특히 alpine이미지에서 이렇게 뜨는 경우가 많은데, 이 때는 /bin/sh를 대신 써주면 된다.
설정 값 등을 보여준다. 환경변수 등이 제대로 들어갔는지 확인하고 싶을 때 사용하면 유용하다.