2020-11-4 도커 강의정리 도커컴포즈

도커 컴포즈

  • 다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구
const express = require('express');
const redis = require('redis');

const PORT = 8080;

// create redis client
const client = redis.createClient({
    host: "redis-server",
    port: 6379
})


//APP
const app = express();

// 숫자가 0부터 시작
client.set("number", 0);

app.get('/', (req,res) => {
    client("number", (err, number) => {
        client.set("number", parseInt(number)+1);
        res.send("숫자가 1씩 증가. 숫자: " + number);
    });
});
app.listen(PORT);
console.log("Server is running")
  • redis createClient에서 host부분이 도커환경일때와 도커환경이 아닐때가 다르다.
  • 일반환경 : https://redis-server.com
  • 도커환경 : “redis-server”

주의사항

  • 도커를 사용하지 않는곳에서는 레디스 서버가 작동하는 곳에서 host옵션을 url형식으로 넣는다. 하지만 도커 컴포즈를 사용할때는 host옵션을 docker-compose.yml에 명시한 컨테이너 이름으로 넣으면 된다.

Docker 컨테이너간 통신할때 발생하는 에러

  • 스크린샷 2020-10-11 오후 11.49.08

  • 레디스 클라이언트가 동작하려면 레디스 컨테이너가 먼저 동작해야한다.

$docker run redis
$docker run node-test
Server is running
events.js:292
      throw er; // Unhandled 'error' event
      ^

Error: Redis connection to redis-server:6379 failed - getaddrinfo ENOTFOUND redis-server
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:66:26)
Emitted 'error' event on RedisClient instance at:
    at RedisClient.on_error (/usr/src/app/node_modules/redis/index.js:341:14)
    at Socket.<anonymous> (/usr/src/app/node_modules/redis/index.js:222:14)
    at Socket.emit (events.js:315:20)
    at emitErrorNT (internal/streams/destroy.js:92:8)
    at emitErrorAndCloseNT (internal/streams/destroy.js:60:3)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  errno: 'ENOTFOUND',
  code: 'ENOTFOUND',
  syscall: 'getaddrinfo',
  hostname: 'redis-server'
}
  • redis-client와 server 연결이 실패했다. 서로 다른 컨테이너에서 설정을 하지 않으면 서로 접근할 수 없다.
  • 컨테이너간 네트워크를 쉽게해주기 위해 Docker compose를 사용한다.

docker-compose.yml 작성하기

  • YAML : Ain’t Markup language의 약자.

스크린샷 2020-10-12 오전 12.00.47

  • version: "3"
    
    services:
      redis-server:
        image: "redis"
      node-app:
        build: .
        ports:
          - "5000:8000"
    
    
  • version : 도커 컴포즈 버전

  • services : 이곳에 실행하려는 컨테이너들을 정의

  • redis-server, node-app => 컨테이너들의 이름 정의

  • build : 현재 디렉토리에 있는 도커파일 사용(.) 도커파일이 어디에 있는지 정의

  • ports : 포트매핑 => 로컬포트:컨테이너포트

  • docker-compose up 명령어를 입력하면 실행된다. 파일수정 후 다시 실행하려면 docker-compose up –build

  • docker-compose down : 중지명령어

  • docker-compose -d up : detached모드로 백그라운드에서 실행

docker-compose up vs docker-compose up –build

  • docker-compose up : 이미지가 없을때 이미지를 빌드하고 컨테이너 시작
  • docker-compose up –build : 이미지가 있던 없든 이미지를 빌드하고 컨테이너 시작
Written on November 4, 2020