반응형

CPU Usage

CPU 사용량은 시스템 사용률과 사용자 사용률 등을 합친값이다.

시스템 사용률은 운영체제가 사용한 CPU 사용률을 의미하며 사용자 사용률은 응용프로그램이 사용하는 CPU 사용률을 의미한다.

 

System 사용률이 높다면 시스템 사양을 높여야 한다.

USer 사용률이 높다면 시스템 업그레이드 또는 애플리케이션의 분배를 고려해야 한다.

 

CPU Idle

CPU Idle 은 CPU 가 모든 일을 끝내고 쉬는 시간을 의미한다. 일반적으로 CPU Usage 가 높다면 CPU Idle 은 낮을 것이다. 

하지만 I/O Wait 또는 Steal 등의 값으로 인해 이 비율이 항상 일정치 않다.

 

Idle 값이 항상 낮다면 시스템을 업그레이드 해야한다.

 

CPU I/O Wait

CPU가 입출력을 대기하는데 사용한 시간의 비율을 보여준다. 프로세스에 바로 접근 할 수 없는 상황인 경우 I/O Wait 비율은 늘어난다.

iowait 은 cpu 본연의 job이 아닌 다른 장치와의 통신 때문에 cpu job이 일시적으로 waiting 된 상태를 말한다. 예를 들어서 cpu와 hdd간의 테이터 통신이 많다면 (hard disk에 writing 부하가 심하게 올라간다면) iowait이 높아지게 된다.

 

I/O Wait 값이 높다면 하드 디스크를 SSD로 교체하거나 Raid 유형을 바꿔야 한다.

 

CPU Steal %

다른 OS 에 의해서 빼앗긴 CPU 시간의 비율, 가상화되어 있지 않다면 Steal 값은 사용되지 않으므로 항상 0으로 표시된다.

가상머신이 많아지는 경우, 동일한 물리 장비에서 제공되는 환경이다보니,

특정 가상머신이 CPU를 많이 차지하게 되면, 다른 머신들도 따라서 느려지게 되는데,

이 현상을 CPU Steal이라고 한다.

 

 

CPU Load(부하)

CPU Load 는 CPU 에 실행중이거나 대기중인 작업(프로세스) 의 개수를 평균으로 보여주는 값이다.

CPU에 실행중이거나 대기중인 작업이 있는지 100번 확인할 때 2개의 작업이 있다면 CPU 로드는 0.02 이다.

CPU 가 항상 실행중이고 대기중인 작업없이 효율적으로 정확히 일한다면 CPU Load 는 1이다. 코어가 2개라면 대기중인 작업이 없는 상태일 떄 CPU Load 는 2가 된다.

코어가 4개면 4 이다.

부하가 클 수록 CPU Load 의 값이 커지게 된다. CPU Load 는 남아있는 작업까지 표시해 주는 지표이다.

 

코어가 하나인 경우 CPU Load 의 임계값은 0.7 정로도 둔다. 적당한 평균치

CPU Load 가 지속적으로 0.7 을 넘어간다면 시스템업그레이드를 고려해야 한다.

 

참고문헌

brunch.co.kr/@leedongins/75?fbclid=IwAR3Vm-UPfMb3AFqhymelLPphePD8qtZl_wK57_K89YeOuomCeQ0pZZQC2jM [CPU 지표 정리]

 

반응형
반응형

싱글 노드 클러스터 

docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.10.1

 

멀티 노드 클러스터

version: '3.3'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    networks:
      - elastic
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    networks:
      - elastic

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  elastic:
    driver: bridge

메모리가 안되면 자바 옵션을 Xms Xmx를 128 정도로 다 내려주자.

 

Node es01 이 localhost:9200 으로 리슨 하고 있고 es02 와 es03 이 도커 네트워크로 통신하고 있다.

포트 9200 이 모든 네트워크의 인터페이스여서 포트를 열어줘야 한다. 리눅스에서 조정하는 방법은 IPTAVLES로 직접 조정해야 한다. 엘라스틱 클러스터는 공개적으로 접속이 가능하고 잠재적으로는 FIREWall 세팅을 무시한다. 만약 9200 포트를 오픈하기를 원하지 않는다면 reverse proxy 를 사용하면 된다. docker-compose.yml 파일에서 9200:9200 이 부분을 127.0.0.1:9200:9200로 변경해주면, 오직 호스트 머신만 엘라스틱에 접근할 수 있다.

도커 재시작 시에도 데이터를 유지하기 위해 volumes: 를 본인 pc 의 폴더로 설정해준다.

 

실행

docker-compose up

잘 실행한지 확인

curl -X GET "localhost:9200/_cat/nodes?v=true&pretty"

실행 정지

docker-compose down

로컬 데이터 볼륨 까지 삭제

docker-compose down -v

 

실행 후 Docker 대시보드에서 본 모습입니다.

 

엘라스틱 인덱스 추가 및 데이터 추가

curl -X POST "localhost:9200/index_test/_doc/?pretty" -H 'Content-Type: application/json' -d'
{
    "user" : "testuser",
    "post_date" : "2020-06-17T14:12:12",
    "message" : "trying out Elasticsearch"
}
'

추가 한 데이터를 키바나에서 확인해 보자

 

 

키바나 접속

http://localhost:5601

 

위에서 만든 index_test 가 있다.

 

 

참고문헌

https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html [공식 문서]

 

반응형
반응형

1. Redis 이미지 가져오기

docker pull redis

 

2. 신규 Container 생성, 실행

docker run --name redis-container -p 6379:6379 redis

 

도커 컨테이너를 자동으로 재시작하고 싶다면 아래와 같은 옵션을 추가하면 된다.

docker run --name redis-container -p 6379:6379 -dit --restart unless-stopped redis

 

3. 컨테이너에 터미널 접속

docker exec -it redis-container /bin/bash

 

4. 시작/중지/재시작

docker start redis-container

docker stop redis-container

docker restart redis-container

5. 컨테이너 삭제

docker rm redis-container

 

도커 컴포즈 docker compose redis 올리기

version: "3.3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
  redis: 
    container_name: redis 
    hostname: redis 
    image: redis 
    ports: 
      - "6379:6379"

  redis-commander: 
    container_name: redis-commander 
    hostname: redis-commander 
    image: rediscommander/redis-commander:latest 
    restart: always 
    environment: 
      - REDIS_HOSTS=local:redis:6379 
    ports: 
      - "8081:8081"

docker compose 로 작업하면 위의 과정은 생략되고 바로 reids 를 올리고 redis-commander 로 localhost:8081 을 통해 redis 가 정상적으로 뜨는지 클라이언트까지 확인 가능하다.

반응형
반응형

# free -m
                       total        used        free      shared  buff/cache   available
Mem:         257751        1842      254508         105        1400      255327
Swap:          4095           0        4095

1. 리눅스 가용 메모리 확인하기
total - 전체 물리적인 메모리의 크기
used - 사용중인 메모리 크기
free - 사용중이 아닌 메모리 크기로 사용 가능한 메모리 크기
shared - 공유 메모리 크기
buff/cache - 버퍼/페이지로 사용되고 있는 메모리 크기
available  -  실직적으로 사용 가능한 메모리, free 필드값의 메모리가 부족시 해제되는 커널내 메모리 영역 사이즈를 합친 값

2. free 옵션
-m            // 메가 바이트 단위
-g            // 기가 바이트 단위
-k           // 킬로 바이트 단위
-l           // 최고/최저 메로리 상황을 구분하여 출력

-h         // 기가 바이트로 변환 및 소수점 까지 표시

반응형
반응형

도커 젠킨스 이미지 찾기

docker search jenkins

제일 위에 검색되는 jenkins 를 pull 받아보니 설치가 안되어 그 아래 jenkins/jenkins 를 받아본다.

 

docker pull jenkins/jenkins:lts

위와 같이 이미지를 받아도 되고, 

나 같은 경우는 docker compose 로 그냥 실행했다.

 

version: "3.3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
  jenkins:
    image: jenkins/jenkins
    container_name: jenkins
    ports: 
      - "8080:8080"
      - "50000:50000"
    volumes:
      - /Users/유저명/폴더명:/var/jenkins_home

8080 포트는 바꾸면 설정을 따로 변경해 주지 않는 이상 디폴트로 처음에는 8080 으로 bind 시켜줘야 한다.

 

docker 로 jenkins 를 설치해주고 나면

Administrator password 를 입력해주라고 한다.

 

이 비번을 알려면 

docker exec -it jenkins /bin/bash 접속

cd /var/jenkins_home/secrets

cat initialAdminPassword

위 처럼 docker jenkins 에 접속해서 initalAdminPassword 를 조회 하면 된다.

 

 

 

 

비밀번호만 입력해주고 나오는 화면 그냥 클릭만 했더니 jenkins 앱은 올라갔다.

 

 

반응형
반응형

local 에서 docker 를 이용햇 kafka 서버를 구축하자

 

docker search kafka 를 통해 검색해 보면 

wurstmeister/kafka  가 스타가 제일 많다.

https://hub.docker.com/r/wurstmeister/kafka -- 여기에서 kafka docker 관련 옵션 설명 확인가능하다.

 

kafka in docker 구조

도커 카프카 네트워킹에 대한 설명 레퍼런스이다.

github.com/wurstmeister/kafka-docker/wiki/Connectivity 

docker 로 kafka 를 올리면 다음과 같은 구조가 된다.

multiple 카프카 브로커로 설정도 가능하다.

이런식으로 구성해주면 

다음과 같이 9092 단일포트로 브로커가 구성된다.

 

 

단일 카프카 브로커일때는 

# KAFKA_ADVERTISED_HOST_NAME 옵션을 127.0.0.1 로 하겠지만 multiple 로 할때는 외부에서 접근 가능한 ip 를 넣어야 한다.

 

docker-compose-yml 작성

version: '3.3'
services:
  zookeeper:
    image: wurstmeister/zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
  kafka:
    image: wurstmeister/kafka:2.12-2.5.0
    container_name: kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 127.0.0.1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

KAFKA_ADVERTISED_HOST_NAME는 본인의 docker host ip로 수정

multi broker를 사용하지 않고 로컬용이므로, 127.0.0.1로 사용

 

kafka 확인

카프카 툴로 접속 확인

또는 docker 로 접속 후 kafka-topics.sh 를 실행하여 확인가능하다.

# docker container exec -it kafka bash
# kafka-topics.sh --list --bootstrap-server localhost:9092 

kafka 도커에 접속 후 kafka 토픽 리스트를 조회할 수 있다.

 

카프카 공식 문서

kafka.apache.org/quickstart

반응형
반응형

도커의 경우 여러가지 도커를 한번해 실행하기때문에 하나의 도커 컴포즈 파일로 관리를 한다.

 

도커 및 도커 컴포즈를 설치한다.

docker-compose.yml

version: "3.3" # 파일 규격 버전
  mongo:
    image: mongo
    restart: always
    ports:
      - 9017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: user
      MONGO_INITDB_ROOT_PASSWORD: password  

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 9018:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: user
      ME_CONFIG_MONGODB_ADMINPASSWORD: password

다음과 같이 compose 파일 작성 뒤 docker-compose.yml 파일 작성한 경로에서

docker-compose up -d

로 docker 실행해주면 끝이난다.

 

MongoDB

 

몽고디비를 툴로 접속해서 보기 위해 robo 3T 툴로 접속해본다.

다음과 같이 9017 포트로 도커포트 27017 을 연결해줬다.

     

다음과 같이 비번 계정을 적어주면 접속이 된다.

 

Mongo Express

mongo db 만 띄워도 되지만 몽고 익스프로세도 올려서 모니터링도 해준다.

localhost:9018 로 외부에서 도커포트 8081 로 연결해준다.

 

굳이 mongo express 를 설치할 필요는 없다. 몽고 db 툴 로도 충분히 관리가 가능하고, 기능도 더 많다.

 

반응형

'인프라 > docker' 카테고리의 다른 글

[docker] 도커 jenkins 시작하기  (0) 2020.12.18
[docker] kafka docker 시작하기  (0) 2020.11.15
[docker] mysql 을 docker 로 시작하기  (0) 2020.07.05
[docker] 도커 기본 명령어  (0) 2020.07.04
[docker] mac 도커 설치하기  (0) 2020.07.04
반응형

성능을 떠나서 로컬 개발시 도커로 인프라를 구성하면 조금 관리하기 편한 면이 있을 것 같아 docker 로 mysql 을 올려봤다.

간단히 docker 명령어 만으로 mysql을 올려보자.

1. mysql docker 이미지 다운로드

태그에는 MySQL 버전을 명시하며. 만약 태그에 버전을 명시하지 않으면, 최신 버전인 latest를 가져온다.

docker pull mysql:lastest

2. docker 이미지 확인

docker images

3. 저장소 설정

  • 호스트의 /Users/{내계정}/{마운트시킬폴더명} 디렉토리를 컨테이너의 /var/lib/mysql 디렉토리로 마운트
  • docker에 mysql과 같은 DB를 설치하는 경우 컨테이너 삭제와 함께 데이터도 날라가므로, 저장소는 반드시 외부 저장소를 사용한다.

4. docker 실행 명령어

docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password --name jun-mysql -v /Users/사용자명/마운트시킬폴더명:/var/lib/mysql mysql:버젼

위를 보면 docker 실행명령어가 너무 길다.
그래서 docker-compose 라는 docker 기능을 이용하여 docker 를 실행시키자

5. docker-compose 로 실행

아무 폴더경로에, 실행시키고자 하는 파일경로
docker-compose.yml 파일 생성.

version: "3.3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
  db: # 서비스 명
    image: mysql:5.7 # 사용할 이미지\
    container_name: jun-mysql # 컨테이너 이름 설정
    ports:
      - "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    environment: # -e 옵션
      MYSQL_ROOT_PASSWORD: '루트 비밀번호'  # MYSQL 패스워드 설정 옵션
      MYSQL_USER: '계정'
      MYSQL_PASSWORD: '비밀번호'
    volumes:
      - /Users/{계정명}/{마운트할 폴더명}:/var/lib/mysql  

 

위와 같이 docker-compose.yml 이라는 명으로 파일 만든뒤
해당 파일 있는 경로에서 명령어로 파일 실행

  • 백그라운드로 실행시 -d 옵션으로 실행

    docker-compose up -d

6. docker 프로세스 확인

docker ps -a

7. mysql 컨테이너 접속

docker exec -it jun-mysql bash
여기서 jun-mysql 은 도커 컨테이너 명이다.

8. 주의사항

mysql 이 8 버젼 부터는 password 인증방식이 mysql_native_password 에서 caching_sha2_password 로 변경 되어 config 파일 변경 및 docker 실행 후 유저에 대한 인증 방식을 각각 native 로 바꿔줘야 한다.

방법1

config 파일 생성.
$ sudo nano /usr/local/opt/mysql/config/my.cnf
`

파일추가 내용
[mysqld] default-authentication-plugin=mysql_native_password

방법 2

mysql bash shell 접속 후
docker exec -it CONTAINER_ID bash

루트계정으로 로그인.
mysql --user=root --password

각 계정의 패스워드 디폴트 인증방식 변경.
ALTER USER 'username' IDENTIFIED WITH mysql_native_password BY 'password';

두가지 방법으로도 나는 해보지는 않았다.
그냥 매번 새로운 환경마다 docker-compose 로 올리면 수정을 해줘야 해서, 5.7 로 버젼을 명시하고 사용했다.

반응형

+ Recent posts