나의 개발 일상 기록
[Docker] Docker Compose 본문
Docker Compose
1. Doker Compse란?
docker compose는 다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구입니다.
2. Docket Compose를 이용해서 어플리케이션 만들기
<페이지를 리프레쉬했을때 숫자 0부터 1씩 계속 올라가는 간단한 앱 만들기>
- 앱 구조

- 사전준비(package.json 및 server.js)
package.json
{
"name": "docker-compose-app",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"start" : "node server.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"dependencies": {
"express" : "4.17.1", // node.js
"redis" : "3.1.2" // redis
},
"author": "",
"license": "ISC"
}
server.js
const express = require("express");
const redis = require("redis");
// 레디스 클라이언트 생성
const client = redis.createClient({
//host:"https://redis-server.com", //일반적인 경우 host 지정
host:"redis-server", // docker 환경일 경우 host 지정,
port:6379
})
const app = express();
app.listen(8080);
console.log("Server is running");
* Node.js 환경에서 Reids 사용 방법
- redis-server를 작동 시켜주어야 합니다.
- redis모듈을 다운받습니다.
- Reids 모듈을 받은 후 레디스 클라이언트를 생성하기 위해서 Reids에서 제공하는 createClient()함수를 이용해서 redis.createClient로 레디스 클라이언트를 생성합니다.
- redis server가 작동하는 곳과 Node.js앱이 작동하는 곳이 다른 곳이라면 host인자와 port인자를 명시해주어야 합니다.
* Docker 환경에서 Reids Client 생성시 주의사항
- 보통 Docker를 사용하지 않은 환경에서 Redis 서버가 작동되고 있는 곳의 host옵션을 URL(https://redis-server.com)로 주면 되지만, Docker Compose를 사용할 때는 host 옵션을 docker-compose.yml 파일에 명시한 컨테이너 이름으로 주면됩니다.
- server.js 로직 추가
const express = require("express");
const redis = require("redis");
// 레디스 클라이언트 생성
const client = redis.createClient({
//host:"https://redis-server.com", //일반적인 경우 host 지정
host:"redis-server", // docker 환경일 경우 host 지정,
port:6379
})
const app = express();
// 숫자는 0부터 시작합니다.
client.set("number", 0);
app.get('/', (req, res)=>{
client.get("number", (err, number)=>{
// 현재 숫자를 가져온 후에 1씩 올려줍니다.
client.set("number", parseInt(number) + 1);
res.send("숫자가 1씩 올라갑니다. 숫자 : " + number);
})
})
app.listen(8080);
console.log("Server is running");
client.set() : Redis Client에 <key, value> 값을 Set을 해줄수있습니다.
app.get() : 요청이 루트경로로 들어올때 진입하는 요청을 catch합니다.
- Dockerfile 작성하기
FROM node:10
WORKDIR /usr/src/app
COPY ./ ./
RUN npm install
CMD ["node", "server.js"]
* 레디스 클라이언트가 작동하려면 레디스 서버를 먼저 실행시킵니다.

- 컨테이너 실행 시 오류
docker build -t <이미지네임> ./ 명령어를 통해 이미지를 생성합니다.
이미지 생성 후 docker run <이미지네임> 컨테이너를 실행하게 되면 아래의 그림처럼 오류가 납니다.

서로 다른 컨테이너에 있는데 이렇게 컨테이너 사이에는 아무런 설정없이는 접근을 할 수 없기에 노드 앱에서 레디스서버에 접근을 할 수 없으므로 해당 오류가 발생합니다.
=> 멀티 컨테이너 상황에서 쉽게 네트워크를 연결시켜주기위해서 Docker Compose를 이용하면 됩니다.
- Docker Compose 파일 작성하기
* Docker Compose 파일은 yaml파일인데 yaml이란?
- 일반적으로 구성 파일 및 데이터가 저장되거나 전송되는 응용 프로그램에서 사용되고 원래는 XML이나 JSON 포맷으로 많이 쓰였지만, 좀 더 사람이 읽기 쉬운 포맷으로 나타난게 yaml입니다.
<docker-compose.yml>
version: "3"
services:
redis-server:
image: "redis"
node-app:
build: .
ports:
- "5000:8080"
- version - Docker Compose 버전
- services - 이곳에 실행하려는 컨테이너들을 정의
- redis-server - 컨테이너이름
- image - 컨테이너에 사용하는 이미지
- node-app - 컨테이너 이름
- build - 현 디렉토리에 있는 Dockerfile 사용
- ports - 포트 맵핑 로컬포트 : 컨테이너포트
- 컨테이너 실행
docker-compose up 명령어로 실행합니다.

docker-compose 관련 명령어
- docker-compose build 이미지를 빌드하기만 하며, 컨테이너를 시작하지 않습니다.
- docker-compose up 이미지가 존재하지 않을 경우에만 빌드하며, 컨테이너를 시작합니다.
- docker-compose up --build 필요치 않을때도 강제로 이미지를 빌드하며, 컨테이너를 시작합니다.
- docket-compose up --no-build 이미지 빌드 없이, 컨테이너를 시작합니다.(이미지가 없을시 실패)
브라우저에서 확인

'Docker' 카테고리의 다른 글
| [Docker] Docker를 이용한 간단한 Node.js 어플 만들기_2 (0) | 2021.07.14 |
|---|---|
| [Docker] Docker를 이용한 간단한 Node.js 어플 만들기_1 (0) | 2021.07.08 |
| [Docker] Docker Image 생성 (0) | 2021.05.17 |
| [Docker] Docker를 이용한 Redis 설치 (0) | 2021.05.17 |
| [Docker] Docker 생명주기 (0) | 2021.05.13 |