이전 방법에서는 이미지를 빌드하고 해당 이미지를 통해 두 개의 컨테이너를 실행하고 연결하면서 웹 애플리케이션 실행하였습니다.
지금 당장은 두 개의 컨테이너만 있기 때문에 개별적으로 실행하고 연결하였지만 더 많은 컨테이너가 존재한다면 귀찮을 뿐만 아니라 실수를 해서 다시 컨테이너를 실행하는 일을 반복할 수도 있습니다.
이때는 Docker-compose파일을 만들면 됩니다.
docker-compose파일은 여러 컨테이너를 정의하고 해당 파일을 통해 정의된 모든 컨테이너를 실행하게 해줍니다.
이전과 같이 PostgreSQL과 nodeAPI를 연결할 것입니다.
그전에 docker-compose를 작성하는 것을 도와주는 사이트를 알아봅시다.
composerize에 들어가봅시다.
해당 사이트에 들어가면 아래와 같이 나올 것입니다.

docker run ~~ 명령어를 docker-compose.yml파일에 맞는 명령어 형식으로 바꿔주는 사이트입니다.
이전에 실행했던 PostgreSQL컨테이너 명령어를 넣으면 아래와 같이 뜹니다.

nodeAPI컨테이너를 실행하는 명령어도 넣어봅시다.

이제 이 두개를 합치면 되는데
공통된 것을 하나로 묶고 나머지는 지워주면 아래와 같이 됩니다.
name: docker-compose test
services:
postgres:
container_name: postgres-db
environment:
- POSTGRES_PASSWORD=test1234@
volumes:
- postgres-volume:/var/lib/postgresql/data
ports:
- 8001:5432
image: postgres:15.1-alpine
my-node-app:
ports:
- 3000:3000
environment:
- DATABASE_URL=postgres://postgres:test1234%40@postgres-db:5432/postgres
networks:
- my-network
container_name: node-app
image: my-node-app
volumes:
postgres-volume:
external: true
name: postgres-volume
networks:
my-network:
external: true
name: my-network
여기서 수정이 필요한데
my-node-app은 postgres에 의존적입니다.
왜냐하면 my-node-app은 웹서버인데 데이터베이스를 필요로 하기 때문에 데이터베이스가 먼저 존재해야하며 이 데이터에비스가 postgres이기 때문입니다.
그렇기 때문에 depends-on을 통해 postgres가 완성된 이후 my-node-app이 실행되게 만들어야 합니다.
그리고 연결을 위해서는 두 컨테이너를 같은 네트워크에 넣어야 하기 때문에 postgres를 my-network에 추가해줘야 합니다.
아래와 같이 바뀝니다.
name: docker-compose test
services:
postgres:
container_name: postgres
environment:
- POSTGRES_PASSWORD=test1234@
volumes:
- postgres-volume:/var/lib/postgresql/data
image: postgres:15.1-alpine
networks: # 추가
- my-network
my-node-app:
ports:
- 3000:3000
environment:
- DATABASE_URL=postgres://postgres:test1234%40@postgres-db:5432/postgres
networks:
- my-network
container_name: node-app
image: my-node-app
depends_on: # 추가
- postgres
volumes:
postgres-volume:
external: true
name: postgres-volume
networks:
my-network:
external: true
name: my-network
이제 실행해 봅시다.
docker compose up 명령어를 입력하면 됩니다.
docker compose up
주의할 점은 docker compose파일이 있는 디렉터리에서 실행해야 한다는 것입니다.
실행이 완료되었다면 localhost:3000으로 들어가봅시다.

정상적으로 작동합니다.