docker compose는 다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구이다.
레디스와 node.js를 둘 다 사용하는 서버를 만들어보고 docker compose로 실행해보자
도커 클라이언트로 레디스 서버를 위한 컨테이너를 실행시키고 먼저 express 세팅을 해준 뒤
index.js를 다음과 같이 작성한다.
const express = require("express");
const redis = require("redis");
//레디스 클라이언트 생성
const client = redis.createClient({
// url: 'redis://redis:6379'
// or
socket: {
port: 6379,
host: 'redis-container'
}
});
const app = express();
app.get('/', async (req, res) => {
await client.connect();
let number = await client.get('number');
if (number === null) {
number = 0;
}
console.log('Number: ' + number);
res.send("숫자가 1씩 올라갑니다. 숫자: " + number)
await client.set("number", parseInt(number) + 1)
await client.disconnect();
})
app.listen(8080);
console.log('Server is running');
그 다음엔 Node.js를 위한 이미지를 만들기 위해서 Dockerfile을 만들고 다음과 같이 작성한다.
#베이스 이름을 명시해준다.
FROM node:18
WORKDIR /usr/src/app
COPY package.json ./
#추가적으로 필요한 파일들을 다운 받음
RUN npm install
COPY ./ ./
#컨테이너 시작시 실행 될 명령어를 명시
CMD [ "node","index.js" ]
이제 실제로 어플을 살펴보면 node.js + redis client의 컨테이너와 레디스 서버 컨테이너 구조로 되어 있다. 이 때 (레디스 서버를 위한 컨테이너를 실행 한 뒤에) node.js를 위한 컨테이너를 실행 할 때 레디스 서버에 접근 할 수 없다는 에러가 난다. 이런 에러가 나는 이유는 바로 node.js + redis client 컨테이너와 레디스 서버 컨테이너는 서로 다른 컨테이너에 있는데 이렇게 컨테이너 사이에는 아무런 설정 없이는 접근을 할 수 없기 때문이다.
바로 이런 멀티 컨테이너 상황에서 쉽게 네트워크를 연결 시킬 수 있는게 Docker compose이다.
Docker compose를 사용하기 위해서는 docker-compose.yml 파일을 만들어야 한다.
docker-compose.yml에서는 먼저 버전을 지정해주고 각각의 컨테이너를 서비스로 묶어준다. 일단 이렇게 작성하면 되는데
version: "3"
services:
redis-server:
image: redis
container_name: redis-container
restart: unless-stopped
expose:
- 6379
node-app:
depends_on:
- redis-server
build:
context: .
dockerfile: Dockerfile
container_name: node-app
restart: on-failure
ports:
- "5000:8080"
버전 명시 후 서비스에 각각의 컨테이너 이름을 준다. 그리고 컨테이너에서 사용하는 이미지를 적는다. build는 현 디렉토리에 있는 Dockerfile의 경로를 지정해주고 port는 포트 매핑을 해준다. (로컬 포트 : 컨테이너 포트)
그 뒤에 docker-compose up 명령어를 주면 다음과 같이 실행된다.



그러면 새로 고침 할 때마다 숫자가 올라가는 걸 확인할 수 있다. 만약 오타가 있어서 다시 빌드를 하고 싶다면 docker-compose up --build 명령어를 입력하면 처음부터 다시 빌드를 할 수 있다.
공부하면서 정리한 내용입니다. 모든 지적 감사히 받겠습니다:)
'DevOps > Docker' 카테고리의 다른 글
[Docker] 기본적인 도커 클라이언트 명령어 알아보기 (2) (1) | 2023.12.20 |
---|---|
[Docker] 기본적인 도커 클라이언트 명령어 알아보기 (0) | 2023.12.20 |
[Docker] 이미지로 컨테이너 만들기 (0) | 2023.12.20 |
[Docker] 도커 흐름 살펴보기 (0) | 2023.12.19 |
[Docker] 도커란 무엇인가? (1) | 2023.12.19 |