[최종프로젝트] Docker Compose

주준호·2024년 4월 11일

개발공부일지

목록 보기
2/5
  • docker compose란?

    docker compose는 단일 서버에서 여러개의 컨테이너를 하나의 서비스로 정의해 컨테이너의 묶음으로 관리할 수 있는 작업 환경을 제공하는 관리 도구입니다.

  • 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 Compose의 과정을 살펴보자

  • 먼저 docker hub에 docker image를 각각 push한다.

  • ec2 인스턴스에서 docker와 docker compose를 설치한다.

    • Docker 설치
    1. ec2 접속 후 인스턴스에 있는 모든 패키지를 업데이트해준다.
      sudo yum update -y
    2. yum으로 docker 설치
      sudo yum install docker -y
    3. 설치한 docker version 확인
      docker -v
    4. Docker 실행
      sudo service docker start
    5. Docker 그룹에 sudo 추가 (인스턴스 접속 후 도커 바로 제어할 수 있도록)
      sudo usermod -aG docker ubuntu
  • Docker compose 설치

// 설치 전 우분투 시스템 패키지 업데이트
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 명령어

1. docker compose build <service>

docker-compose.yml 파일에서 필요한 이미지들을 찾아서 빌드한다.
따로 서비스를 지정하지 않으면 모든 이미지가 빌드된다.

2. docker compose up <service>

docker-compose.yml 파일에서 서비스에 필요한 모든 컨테이너를 생성하고 시작한다. 만약 컨테이너가 빌드되지 않았거나, 혹은 빌드 된 이후 도커파일의 변동으로 다시 빌드되야 하는 경우, 이미지를 빌드한 후 컨테이너를 생성, 시작한다.

만약 모든 이미지를 새로 빌드해서 컨테이너를 생성하고 싶다면, 아래 명령어를 사용한다.

docker compose up --build

일괄로 중단(stop)하고 싶다면 Ctrl + C !!

3. docker compose down <service>

해당 프로젝트의 컨테이너를 중단하고, 제거한다. network나 volume또한 제거된다. 따라서 단순히 잠시 중단한 뒤 나중에 다시 시작하고 싶다면 docker compose stop 혹은 docker compose 가 실행되고 있는 터미널에서 ctrl + C를 통해 중단해야 한다.

4. docker compose stop <service>

명시한 서비스, 혹은 명시한 서비스가 없다면 전체 컨테이너를 중단한다.
down과는 다르게 단순 중단이므로 start 명령어로 다시 시작할 수 있다.

5. docker compose start <service>

생성된 후에 멈췄던 컨테이너를 시작하는 명령어. 쉽게 말해 up을 통해 생성되고, 시작한 이후 docker compose stop 혹은 Ctrl + C를 통해 중단된 서비스를 다시 시작할 수 있다.

6. docker copmose restart <service>

docker compose stop + docker compose start
만약 build 후 restart를 한다면 직전 생성된 이미지를 사용한다. 따라서 돌아가고 있는 컨테이너의 이미지를 바꿔야 한다면,

docker compose build <service>
docker compose restart <service>

위와 같이 빌드 한 후 재시작하면 된다.

7. docker compose ps

현재 동작하는 컨테이너를 보여준다.

8. docker compose logs <service>

해당 서비스의 로그를 보여준다.

9. docker exec <container_id/name> <command>

현재 돌아가는 컨테이너에 명령어를 전달해준다.
만약 conatiner_name을 지정해주지 않았다면, docker ps를 통해 container id를 먼저 얻어야 한다.

이것을 활용해서 현재 컨테이너에 터미널을 접속할 수 있다.
-i는 interactive 옵션으로 터미널을 통한 입력이 가능하게 해주고, -t옵션은 컨테이너의 출력을 터미널로 전달해주므로 두 옵션을 함께 사용해 쉘을 열면 된다.

docker exec -it <container_id/name> /bin/bash
이미지에 따라, /bin/bash를 찾을 수 없다고 뜰 수 있다. 특히 alpine이미지에서 이렇게 뜨는 경우가 많은데, 이 때는 /bin/sh를 대신 써주면 된다.

10. docker exec config <service>

설정 값 등을 보여준다. 환경변수 등이 제대로 들어갔는지 확인하고 싶을 때 사용하면 유용하다.

profile
끊임없이 배우는 백엔드 개발자입니다.

0개의 댓글