docker compose
다중 컨테이너 도커 어플리케이션을 정의하고 실행하기 위한 도구
docker compose 명령어
- -f 현재 디렉토리가 아닌 다른 디렉토리의 경로의 파일을 설정파일로 사용한다.
- -d: 백그라운드 실행
- --build: 이미지 빌드
- --no-deps: 링크 서비스 실행하지 않음
docker-compose up
docker compose에 정의되어있는 모든 서비스 컨테이너를 한번에 생성하고 실행 하기 위해 사용한다.
이미지가 없을때 이미지를 빌드하고 컨테이너를 시작
--build 옵션
이미지가 있든 없든 이미지를 빌드하고 컨테이너 시작
docker-compose down
docker compose에 정의되어 있는 모든 서비스 컨테이너를 한번에 정지 시키고 삭제합니다.
docker-compose start
특정 멈춰 있는 컨테이너를 시작시키기 위해 사용합니다.
docker-compose stop
특정 컨테이너를 정지시키기 위해 사용합니다.
docker-compose ps
현재 docker-compose에 정의된 서비스 컨테이너 목록들을 조회 할 때 사용합니다.
docker-compose logs
서비스 컨테이너의 로그를 확인하고 싶을 떄 사용 하며 -f 를 붙이면 실시간으로 로그 확인이 가능합니다.
docker-compose exec
실행중인 컨테이너를 대상으로 명령어를 사용 할 때 사용합니다..
docker-compose run
컨테이너의 특정명령어를 일회성으로 실행 할 때 사용합니다.
docker-compose conifg
docker compose 설정을 확인할 때 사용합니다.
여러개의 설정 파일을 사용할 때 유용합니다.
docker compose를 활용하기 위해서는 docker-compose.yml 의 문서를 기준으로 움직인다.
docker-compose.yml 예시
#버전 설정
version: 3
#서비스 설정
services:
#네트워크 설정
networks
#볼륨 설정
volumnes
docker-compose.yml 작성법
version
docker-compose.yml 파일의 첫줄에는 파일 규격 버전을 적는다.
3이라고 적으면 3으로 시작하는 최신버전을 사용한다.
services
해당 항목 밑에 실행하려는 컨테이너들을 정의한다
version:3
services:
volumnes
기존의 volumne과 같은 옵션으로
도커 컨테이너가 local에 있는 파일 주소를 참조해서 나타낸다.
따라서 볼륨을 사용하면 컨테이너가 내려가더라도 영구적으로 저장및 관리 할 수 있다 .
version:3
services:
build
서비스의 이미지를 빌드하기 위한 dockerfile이 위치하는 경로를 지정한다
. 인 채로 두면 현재 경로를 의미한다.
version:3
services:
node:
build: .
version:3
services:
node:
build:
context:
dockerfile
args:
env:"production"
environment
환경 변수를 정의 한다.
version:3
services:
node:
environment:
- MYSQL_USER=
depends_on
서비스 간의 의존관계를 지정
version:3
services:
node:
depends_on:
- mysql
command
해당 서비스가 올라올때 dockerfile의 cmd 명령문을 무시후 실행할 명령어를 설정하기 위해 사용
version:3
services:
node:
command: node .
image
image repository로 부터 이미지를 내려받아서 사용하는 것
version:3
services:
node:
image: node:12
mysql:
image: mysql
docker redis 컨테이너 <- > docker nodejs 간 통신하기
redis(REmote Dictionary Server)
메모리 기반의 키 -값 구조, 모든 데이터를 메모리에 저장 및 조회하는 비 관계형 데이터베이스
메모리에 저장을 하기 때문에 mysql같은 데이터베이스에 데이터를 저장하는 것과 데이터를 불러오는 속도가 빠르다.
redis-server를 작동시킨다
docker run redis를 통해 redis server를 기동시켜줬다.
redis 모듈을 다운받는다
레디스 모듈을 받은 후 레디스 클라이언트 생성을 위해 redis에서 제공하는 createClient() 함수를 이용해서 redis.createClient로 생성
redis server가 작동하는곳과 node.js 앱이 작동하는곳이 다른곳이라면 host인자와 port인자를 명시해줘야한다.
package.json
{
"name": "nodejs-docker-compose-app",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js"
},
"dependencies": {
"express": "4.17.1",
"redis": "3.0.2"
},
"author": "",
"license": "ISC"
}
server.js
const express = require('express');
const redis = require("redis");
//레디스 클라이너트 생성
const client = redis.createClient({
// 도커 환경에서 docker compose를 이용할 때는 docker-compose.yml 파일에 명시한 컨테이너 이름으로 준다.
host:"redis-server",
port:6379
});
const app = express();
// 숫자는 0 부터 시작합니다.
client.set("number", 0);
app.get("/", (req, res) => {
client.get("number", (err, number) => {
// 현재 숫자를 가져 온 후 1씩 증가
client.set("number", Number(number) + 1);
res.send("숫자가 1씩 올라갑니다. 숫자: ", number);
})
})
app.listen(8080, () => {console.log("this server listening on 8080")});
Dockerfile
FROM node:12
WORKDIR user/src/app
COPY package.json ./
RUN npm install
COPY ./ ./
CMD ["npm", "start"]
먼저 해당 앱을 빌드 시켜준다.
docker build -t loy124/docker-compose-app .
빌드후 실행을 하게 되면
위와같이 오류가 발생한다.
node js 앱과 redis의 client는 서로 다른 컨테이너에 있는데 서로 아무 설정 없이는 접근을 할 수 없다.
이렇게 멀티 컨테이너 상황해서 쉽게 컨테이너 간 연결을 위해서 docker compose를 사용한다.
yml
yaml ain't markup language의 약자이며 구성 파일및 데이터가 저장되거나 전송되는 응용프로그램에서 사용된다
XML이나 json 대비 사람이 읽기 쉬운 포맷으로 되어있다.
docker-compose.yml
해당 yml 파일은 redis-server 의 서버 단과 node-app 두가지로 이루어져있다.
docker-compose.yml
version: "3"
services:
redis-server:
image: "redis"
node-app:
build: .
ports:
- "5000:8080"
그후 docker-compose up 을 통해 실행한다
이렇게 새로고침 할 때마다 redis를 통해 db의 값이 하나씩 증가되는 간단한 node 프로그램을 만들었다.
위 글은 www.daleseo.com/docker-compose/ 의 블로그 글,
해당 강의를 듣고 정리하는 내용입니다.
'Docker, CI' 카테고리의 다른 글
docker , travis, aws 를 활용한 react 자동 배포하기 (2) | 2020.12.29 |
---|---|
Docker 를 활용한 react-nginx 실행하기 (0) | 2020.12.29 |
docker - node.js 어플만들기 (0) | 2020.12.26 |
docker- docker Image 만들기 (Dockerfile 작성및 이미지 생성) (0) | 2020.12.25 |
docker - 기본 명령어 (0) | 2020.12.25 |