-
배포 - Docker Compose에 대하여Infra/CI-CD 2022. 12. 31. 10:03
docker compose는 다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구이다.
🎯페이지를 새로고침 했을때 숫자0부터 1씩 올라가는 간단한 앱을 만들어 보면서 예시 앱을 만든다.
어플리케이션의 전체 구성
레디스
Redis(Remote Dictionary Server)는 메모리 기반의 키-값 구조 데이터 관리 시스템이며, 모든 데이터를 메모리에 저장하고 빠르게 조회할 수 있는 비관계형 데이터베이스(NoSql)이다.
레디스를 쓰는 이유
메모리에 저장을 하기 때문에 Mysql같은 관계형 DB에 저장하는 것보다 훨씬더 빠르게 데이터를 불러올 수 있으며, 비록 데이터를 메모리에 저장한다고 해도 영속적으로 보관이 가능하다. 그래서 서버를 재 부팅해도 데이터를 유지할 수 있는 장점이 있다.
Node.js 환경에서 Redis 사용 방법
1. 먼저 redis-server를 작동 시켜주어야 한다.
2. redis 모듈을 다운 받는다.
3. 레디스 모듈을 받은 후 레디스 클라이언트를 생성하기 위해서 Redis에서 제공하는 createClient()함수를 이용해서 레디스 클라이언트를 생성해준다.
4. 이때 redis server가 작동하는 컴퓨터와 Node.js앱이 작동하는 컴퓨터가 다른 곳이라면 host 인자와 port인자를 명시해주어야 한다.
(docker로 Node.js와 Redis를 구동하게 되므로 예시에서는 서로 다른 Docker Container환경에서 구동이 되는 것이다.)
redis.createClient() 함수에 인자로 넣는 옵션 객체의 host속성은 redis가 docker 환경에서 구동될 경우와 일반 컴퓨터 환경에서 구동될 경우 넣는 값이 다르다.
Docker 환경이 아닌 redis의 host 옵션
const client = redis.createClient({ host: "https://redis-server.com", port: "6379", });
예를 들어 docker환경이 아니고 Redis 서버가 작동하는 곳이 redis-server.com이라면 Host 옵션 값을 위 예시값이 넣으면 된다. 그리고 레디스의 기본 포트는 6379이다.
Docker 환경에서 redis클라이언트 생성시
const client = redis.createClient({ host: "redis-server", port: "6379", });
도커를 사용하지 않는 환경이라면 createClient() 옵션객에 host값으로 redis가 작동되고 있는 곳의 URL을 넣으면 되지만, Docker Compose를 사용할 때 host 옵션의 값으로 docker-compose.yml 파일에 명시한 컨테이너 이름을 넣으면된다.
실제로 노드앱에 레디스를 이용한 간단 기능 구현
//숫자는 0부터 시작합니다. client.set("redisNumber", 0); app.get("/", (req, res) => { client.get("redisNumber", (err, number) => { //현재 숫자를 가져온 후에 1씩올려준다. client.set("redisNumber", parseInt(number) + 1); res.send("숫자가 1씩 올라갑니다. 숫자:" + number); }); });
image를 build하기 위한 Dockerfile 작성하기
FROM node:10 WORKDIR /usr/src/app COPY ./ ./ RUN npm install CMD ["node","server.js"]
Docker Containers간 통신할때 발생하는 error
어플리케이션 소스와 도커 파일까지 작성을 한 후에 실제로 Docker Container들을 하나하나 실행해본다. 먼저 레디스 킄ㄹ라이언트가 작동하려면 레디스 서버가 켜져있어야 하기 때문에 먼저 레디스 서버를 위한 컨테이너를 실행하고 노드js를 위한 컨테이너를 실행한다.
redis 서버에 연결 불가
이미지를 build한 이후에 run할려고 해도 위와 같은 error가 발생하는 것을 확인할 수 있다. error의 상세 내용은 redis와의 연결이 실패했다는 것이다.
error가 발생하는 이유
nodeApp과 redis 서버는 서로 다른 Docker Contianer에서 구동 중이기 때문이다 즉 서로 격리된 환경에서 구동중이므로 별도의 설정 없이는 connection을 할 수 없다.
그렇다면 어떻게 컨테이너 사이에 통신을 가능하게 할 수 있을까?
멀티 컨테이너 상황에서 쉽게 네트워크를 연결시켜주기 위해서 Docker Compose를 이용하면된다.
'Infra > CI-CD' 카테고리의 다른 글
배포 - Docker compose 컨테이너를 멈추기 (0) 2022.12.31 배포 - Docker Compose 파일 작성하기 (0) 2022.12.31 배포 - Docker Volumes에 대하여 (0) 2022.12.30 배포 - Application소스 변경으로 다시 재build 시 효율적으로 하는 법 (0) 2022.12.25 배포 - WORKING DIRECTRORY 명시해 주기 (0) 2022.12.25