본문 바로가기

Docker, CI

docker - docker compose

반응형

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/ 의 블로그 글, 

www.inflearn.com/course/%EB%94%B0%EB%9D%BC%ED%95%98%EB%A9%B0-%EB%B0%B0%EC%9A%B0%EB%8A%94-%EB%8F%84%EC%BB%A4-ci/dashboard

해당 강의를 듣고 정리하는 내용입니다.

 

반응형