이번 포스팅에서는 지금까지 진행했던 React 프로젝트와 Springboot 프로젝트, 그리고 MySQL DB를 도커라이징하여 컨테이너로 띄우는 과정을 정리하려고 한다.
이 과정에서 여러개의 컨테이너를 띄우기 위해 Docker Compose를 사용할 예정이며 실제로 도커를 이용할 때 Docker Compose를 주로 사용한다고 한다.
간단하게 Docker Compose에 대한 개념과 프로젝트를 컨테이너화하는 과정을 정리해보자
우리가 실제 서비스를 운영하다 보면 하나의 컨테이너만으로는 부족한 경우가 많다.
예를 들어 WordPress를 실행하려면 WordPress 컨테이너와 MySQL 컨테이너가 모두 필요했던 모습을 이전에 확인할 수 있었다.
우리는 지금까지 포스팅을 보면 컨테이너를 띄우기 위해 각 컨테이너를 실행하기 위한 명령어를 각각 입력하는 과정을 거쳤다.
이전 포스팅 - Bind Mount 예시
사실 우리가 실행해야할 컨테이너가 많다면 여러가지로 복잡한 문제가 발생할 수 있다.
그렇다면 어떤 문제들이 발생할 수 있을까?
불편한 경우를 정리하면 다음과 같다.
컨테이너 실행의 불편함
- 여러 번의 명령어 입력 필요
- 컨테이너 간 네트워크 설정 필요
- 환경 변수, 볼륨 설정 등을 매번 입력
- 실행 순서 고려 필요 (MySQL이 먼저 실행되어야 함)
하지만, Docker Compose를 사용한다면 하나의 파일에서 인스펙션이 가능하기 때문에 이러한 설정을 고려하여 한번에 처리할 수 있다!
즉, Docker Compose는 여러개의 컨테이너 실행 명령어를 하나의 파일에 정리한 것을 의미한다.
이는 단일 호스트에서 멀티 컨테이너를 유지하는 환경에 적합하다.
(멀티 호스트 환경에서 멀티 컨테이너를 관리하는 경우 도커 스웜을 주로 사용한다고 한다.)
이제부터 Docker Compose를 사용하는 방법에 대해서 정리해보자
이전에 진행했던 wordpress 컨테이너와 mysql 컨테이너를 활용한 실습을 Docker Compose를 사용해서 다시 수행해보자
우선 Docker Compose 코드는 다음과 같다.
Docker Compose 기본 구조
Sample Code
services: wordpressdb: image: mysql:latest environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_DATABASE=wordpress volumes: - wordpressdb_data:/var/lib/mysql networks: - wp_network wordpress: depends_on: - wordpressdb image: wordpress ports: - 8080:80 environment: WORDPRESS_DB_HOST: wordpressdb:3306 WORDPRESS_DB_NAME: wordpress WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: password networks: - wp_network volumes: wordpressdb_data: {} networks: wp_network: driver: bridge
우선 docker compose 파일은 yaml
혹은 yml
의 확장자를 갖는 파일이라는 것을 기억해두자!
간단하게 서비스라는 구조안에 이미지를 사용하여 컨테이너를 실행시키기 위한 정보를 정의해준다.
위에서는 wordpressdb와 wordpress라는 컨테이너를 실행시키도록 코드를 작성하였다.
우리가 눈여겨봐야할 부분이 여러개가 있는데 이 부분을 한번 정리해보자
Sample Code
wordpress: depends_on: - wordpressdb
여기서 depends_on
이라는 명령어는 컨테이너의 실행 시점을 정의하는 부분이다.
이름에서 알 수 있다시피, wordpress 컨테이너가 실행되기 이전에 wordpressdb가 실행되어야 함을 정의하고 있다.
왜냐하면 DB 서버가 있어야 wordpress를 연결할 수 있기 때문이다.
Sample Code
networks: wp_network: driver: bridge
networks 부분은 이미지를 실행하는 부분과 Docker Compose를 구성하는 큰 단위의 networks 부분을 살펴볼 수 있다.
짐작했겠지만, 이미지를 실행하는 부분에서 정의되는 networks는 어떤 네트워크를 사용할지 정의하는 부분이다.
위 샘플 코드와 같이 외부에서 사용되는 networks:
는 네트워크를 정의하는데 사용할 수 있다.
Sample Code
volumes: wordpressdb_data: {}
networks와 마찬가지로 volume을 지정하는 부분이다.
초기 데이터는 없기 때문에 {}으로 넘겨주고 있으며, Docker Compose 외부에서 정의된 wordpressdb_data를 wordpressdb(mysql 이미지 기반) 컨테이너를 띄울 때 사용하고 있음을 볼 수 있다.
Docker Compose를 구성하는 나머지 명령어 (posts, environment, image)는 기존에 컨테이너를 생성할 때 많이 사용해봤으니 넘어가자
이제 그러면 위에서 작성한 Docker Compose 파일을 실행하여 컨테이너를 띄워보자
◉ 커맨드 - Docker Compose를 사용하여 컨테이너를 detach모드로 띄우기
docker compose up -d
Result View
보다시피 네트워크와 볼륨이 존재하지 않기 때문에 Created
하고 Docker Compose 파일에 정의한 2개의 컨테이너를 Started
했음을 로그를 통해 확인할 수 있다.
직접 컨테이너를 인스펙트 해보면 네트워크도 제대로 들어간 모습을 볼 수 있다.
(현재 디렉토리가 mylab06인데 이걸 Prefix로 사용하는 것 같다.)
이전에 docker compose up -d
를 사용해서 컨테이너를 띄워봤다.
간단하게 다른 명령어를 사용해서 docker compose를 관리해보자
docker compose를 이용해서 띄운 컨테이너들을 종료시키고 싶다면 down이라는 명령어를 사용하면 된다.
◉ 커맨드 - docker compose 컨테이너 다운
docker compose down
Result View
잘 안보일수도 있겠지만, down 명령어를 실행시키면 기존에 생성된 컨테이너를 삭제해버린다.
이전에 실행했던 down은 모든 서비스를 종료하고 삭제했다.
만약, 특정 서비스만 종료하기 원한다면 stop 명령어를 사용하여 수행할 수 있다.
◉ 커맨드 - docker compose stop
docker compose stop [서비스명]
stop은 서비스의 실행을 멈추기만 한다.
만약, 해당 서비스를 지우고 싶다면 rm 명령어를 사용하자
◉ 커맨드 - docker compose rm
docker compose rm [서비스명]
당연히 이 외에도 주로 사용하는 logs, ls, ps 등의 명령어도 동일하게 작동한다는 것을 기억하자!
하나 기억해두면 좋은 옵션은 --scale
이다.
이는 한번에 동일한 서비스를 여러개 띄울 수 있도록 제공하는 기능이다.
◉ 커맨드 - scale out
docker compose up --scale wordpressdb=10
Result View
여기서 하나 주의해야할 부분은 컨테이너가 총 10개가 되도록 띄운다는 것이다.
만약, 컨테이너가 기존에 3개가 있었다면 7개를 더 띄우는 방식으로 동작한다.
당연히 기존에 10개가 있는 상태에서 docker compose up --scale wordpressdb=5
를 입력하면 기존에서 5개를 삭제하는 방식으로 동작한다는 것을 알아두자!
이번 포스팅에서는 docker compose 관련된 내용을 정리해봤다.
여러 개의 컨테이너를 각각의 명령어로 실행하는 것은 번거롭고 실수하기 쉽다. 따라서, Docker Compose를 사용하면 여러 컨테이너의 설정을 하나의 YAML 파일로 관리할 수 있고, 실행 순서나 네트워크 설정 같은 복잡한 요소들도 쉽게 다룰 수 있다는 장점이 있다.
특히 depends_on이나 --scale 같은 기능은 실제 서비스 운영에서 매우 유용하게 사용될 것 같으니 알아두자 👊