Develop/infra

M1 MAC OS Rancher desktop 사용

kudl 2023. 1. 4. 21:45

이전에 docker-compose를 이용하여 ELK를 구성하고 동작하는 예제에 대해 진행했었다. 그때의 예제는 docker-desktop을 이용하여 예제를 진행하였는데 docker-desktop은 현재 기업을 상대로는 유료이다.

2020년 8월 31일부터 도커 데스크톱 이용자를 대상으로 유료 요금제 가입을 유도하기 시작했다. 250명 이상의 직원이 속한 매출 1,000만 달러 이상의 도커 데스크톱 고객은 2022년 1월 31일까지 유료 구독에 등록해야 애플리케이션을 계속 사용할 수 있다.
단 소규모 기업, 개인용, 교육, 그리고 “비상업적 오픈소스 프로젝트” 분야의 고객들은 계속 무료로 이용할 수 있다. 회사에 따르면 무료 대상 고객은 도커 사용자 기반의 약 절반 정도에 해당한다.
원문보기

개인적으로 사용할때는 문제가 없지만(필자도 최근에야 알게되었다는..), 기업에서 쿠버네티스를 사용하거나 팀내에서 도커 이미지를 활용하여 개발할 경우에는 docker-desktop을 사용할 수 없다.
그냥 CLI(Command-Line Interface)로 확인하면 되리라 생각할 수도 있지만, docker-desktop 하나로 다음과 같은 처리가 가능했다.

  • Docker Engine
  • Docker CLI
  • Docker GUI

해서, docker-desktop만큼 잘되어 있지는 않지만, docker와, kubernetes를 반 GUI (GUI를 반만 제공해주는 느낌..) 도움을 주는 Rancher-desktop을 이용하여 기존 docker-desktop제거, rancher-desktop설치, ELK 까지 진행하도록 한다.

Job 1. 기존 docker-desktop 제거

이미 설치되어 있는 docker-desktop을 제거하도록 하자

Step 1. 삭제 스크립트 다운로드

curl -O https://raw.githubusercontent.com/docker/toolbox/master/osx/uninstall.sh

Step 2. 권한 설정 및 실행

sudo chmod 755 uninstall.sh
sudo ./uninstall.sh

Step 3. Brew docker 관련 삭제

brew를 통해 docker를 설치하였다면(brew --cask docker-desktop 등) brew에 남아 있는 docker관련 파일을 삭제

brew list | grep docker

# list remove
brew uninstall docker-x-1
brew uninstall docker-x-2
...

Step 4. Application 확인 및 삭제

brew를 통해 설치 하지 않았거나, 모종의 이유로 제대로 삭제되지 않은 docker가 있는지 확인하고 삭제

ls /Application/Docker*

# list remove
sudo rm -r /Application/Docker.app

Job 2. Docker 수동 설치

docker-desktop으로 자동으로 설치된 docker를, 수동으로 설치

Step 1. docker 설치

brew install docker

Step 2. docker-compose 설치

brew install docker-compose

Step 3. rancher-desktop 설치

brew install --cask rancher

Issue . docker login (docker-hub) 이슈 발생

필요한 image를 pull받으려고 했지만 인증관련 에러가 발생하였다. (관련 에러 로그가 삭제..) docker-desktop을 받았기 때문인지, 원래 docker를 수동설치하면 인증이 따로 필요한건지는 모르겠지만 해당 이슈가 발생하였고 docker-hub 로그인을 위한 인증을 해야만 했다.

Solution

docker-credential-helper 추가 후 로그인

brew install docker-credential-helper

# 이후 image pull 시 user / password 입력 및 로그인 성공

brew docker list

➜  ~ brew list | grep docker
docker
docker-compose
docker-credential-helper

➜  ~ brew list | grep rancher
rancher

Job 3. Rancher-desktop 설정

필자는 kubernetes가 아닌 개인 테스트용 docker만을 사용

Step 1. Disable kubernetes

rancher-desktop -> preferences -> kubernetes -> enable kubernetes 선택해제

Step 2. Select docker engine

rancher -> preferences -> Container Engine -> dockered(moby) 선택

Job 4. ELK 실행

Step 1. docker-compose.yml 실행

기존 예제에서 ELK 관련 docker-compose.yml은 이미 생성했고, rancher-desktop에서 기존 docker 명령어와 호환되니까 다음과 같이 입력하면 잘 되어야 한다.

docker-compose -f ./docker-compose.yml up -d

Issue . Elasticsearch bootstrap check fail

docker-desktop에서는 아무런 문제없이 기동되는 ES가 계속 올라가질 않는다. docker-desktop에서는 GUI로 해당 컨테이너의 로그도 실시간으로 보여주고, 상태값도 알려주지만, rancher-desktop은 이미지 정보만 보여줄 뿐, 컨테이너에 대한 정보를 알려주질 않는다. (이래서 반 GUI라고 함)

설정 자체에 Container 메뉴가 존재하지 않는다.

log 확인

본 docker-compose.yml에서는 es01, es02로 네이밍

docker logs -f es01

로그를 확인해보니 다음과 같은 에러 로그를 발견

bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
..
..
..
ERROR: [1] bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch.

ES를 구동시키기 위해선 서버의 sysctl 설정이 필요한데, 해당 설정을 충족시키지 못해서 구동이 되질 않고 에러를 내뱉고 죽어버렸다.

구글링 - 1

ES를 설치해본적 있는 사람이라면, 많은 문서에 다음과 같이 적혀 있을 것이다.

  • /etc/sysctl.conf 를 수정하면 영구 적용이에요!!
  • sysctl -w vm.max_map_count=262144 를 적용하면 임시 적용이에요 !!

아니, docker image가 일단 구동이 되어야 접속을 해서 고치든 말든 하지, 모든 구글링 문서가 다들 따라하든 똑같이만 적혀 있으면 어쩌 자는건지.. 모두가 한마음 한뜻으로 linux image를 pull 받아서 server를 띄우고 그 서버에서 ES를 받아서 구동했다는 건가??????? 아무도 docker elasticsearch image를 쓰지 않고..?

구글링 - 2

docker-compose에서 sysctl 설정을 변경 할 수 있다고 stack overflow에서 알려준다.

sysctls:
      - 필요 명령어

희망을 가지고 여기에 vm.max_map_count=262144을 넣어봤는데 그런 옵션은 존재하지 않는다고 수행조차 되질 않는다.
찾아보니 docker-compose의 sysctls는 net.*관련 옵션(네트워크)만 수행이 되는듯 하다.
원하는 결과를 얻지 못하였다.

구글링 - 3

docker에서 ES를 띄우기 위해 친절하게 ES공식 홈페이지에서 가이드된것이 있다.
ES홈페이지 가이드

가이드 중 설정 필요 부분 - screen

# macOS with Docker for Mac
# The vm.max_map_count setting must be set within the xhyve virtual machine:
# From the command line, run:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
# Press enter and use sysctl to configure vm.max_map_count:

sysctl -w vm.max_map_count=262144
# To exit the screen session, type Ctrl a d.

screen 실행 결과

Cannot exec '/Users/liam/Library/Containers/com.docker.docker/Data/vms/0/tty': No such file or directory

??? 파일이 어딨지? tty파일이 없어서 다시 구글링을 시도해도 다른 사람들은 permission관련 문의만 올라오고, 정작 없다는 사람은 거의 없다. 막상 없다고 하면 ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/ 이쪽에 보라는데 이것도 없다. 나만 그런건가 ?

구글링 - 4

brew로 docker-machine을 설치하고 ssh로 접근해서 설정을 변경하면 된다고 한다

brew install docker-machine

docker-machine ssh
sudo sysctl -w vm.max_map_count=262144

docker-machine이 없다고 create하란다. create하면 선택한 엔진에 대해서 다른 설치된 것이 없다고 ( ex: virtual box) create가 이루어지지 않는다. 예제는 설치만 하면 동작하는것처럼 되어있는데... 해당 방식은 "도커를 쓰기 위해 이렇게 까지 해야해? 이럴거면 그냥 로컬에 설치해서 사용하는게 낫다"가 되었으므로 하다가 포기하였다.

해결

직장 동료와 해당 이슈를 공유하다가 우연찮게 해결 방안을 발견하였다. 단, rancher-desktop을 재기동( = 재부팅) 하면 재설정을 해줘야 하지만, 가장 깔끔하게 원하는 결과를 얻을 수 있었다.

동영상 링크

debian server

# If you run sysctl on the host system, it will either fail or not be effective
# 호스트 시스템에서 sysctl을 실행하면 실패하거나 효과가 없습니다
sysctl -w vm.max_map_count=262144                                                                         
sysctl: unknown oid 'vm.max_map_count' 

# You actually have to run it in a privileged Docker container
# 실제로는 권한이 있는 도커 컨테이너에서 실행해야 합니다
docker run --rm -ti --privileged -v /proc:/proc -v /sys:/sys  debian /bin/bash
# --rm - 프로세스 종료시 컨테이너 자동 제거
# --it(interactive, tty) - TTY 모드(pseudo-TTY)를 사용하여 컨테이너와 연결(attach)되어 있지 않더라도 표준 입력을 유지
# --privileged - 컨테이너 안에서 호스트의 리눅스 커널 기능(Capability)을 모두 사용
# -v, --volume - 데이터 볼륨을 설정, 호스트와 컨테이너의 디렉토리를 연결하여, 파일을 컨테이너에 저장하지 않고 호스트에 바로 저장
Unable to find image 'debian:latest' locally                                                            
latest: Pulling from library/debian
root@6a8985e18547: apt update
- Print log ...
root@6a8985e18547: apt install procps
- Input 'Y'
- Print log ...
root@6a8985e18547: sysctl -w vm.max_map_count=262144
vm.max_map_count = 262144
root@6a8985e18547: exit

# This actually applies to all Docker container, since the sysctl is global
# sysctl이 글로벌이기 때문에 실제로 모든 Docker 컨테이너에 적용됩니다.

정확하게 이해할 수는 없었지만, linux server인 debian을 통해서 볼륨을 mac과 연결하고, 해당 서버의 sysctl을 변경함으로써,
최초 구글링의 솔루션인 linux서버의 설정을 변경하고 ES를 구동하자와 같은 방식이 되는듯 하다. sysctl이 global이므로 모든 컨테이너가 공유되는 사실을 이번에 처음 알았다.
단, 위의 테스트에서 나아가 컨테이너 삭제를 하지않고, 영구 적용인 sysctl.conf파일을 작성하고 컨테이너를 restart하고 진행해보았지만 똑같은 ES에서 예외가 발생하였다. 해당 방식은 임시적용인 sysctl -w vm.max_map_count=262144만 적용이 되는듯 하고, 재부팅 시 같은 작업이 필요하다.

debian을 꼭 써야할까?

다른 linux계열 ( sysctl을 통해서 vm.max_map_count을 조절할 수 있다면) 사용해도 무방할듯 하다. 위의 예상글처럼 해당 설정을 입력할 만한 컨테이너가 필요했던것이고, Mac이 아닌 Linux 서버에서는 해당 방식을 사용하지 않고 바로 구동이 될 듯하다.

데비안은 패키지 설치와 업그레이드 등 패키지 관리가 편리한 장점이 있어서 해당 예제에서 사용하지 않았나 싶다.

'Develop > infra' 카테고리의 다른 글

Datadog 이란?  (0) 2021.08.23
CDC - debezium 설정  (1) 2021.07.25
Nginx 튜닝, 보안 설정 및 Docker-compose 실행  (0) 2020.12.16
Docker Compose 이용한 ElasticSearch Cluster, Kibana 구성  (0) 2020.12.15
Kubernetes 개념  (0) 2020.11.24