Vagrant, Docker 및 Arkade를 활용한 일회용 로컬 개발 환경 (feat. MySQL 설치 5번한 좌충우돌 스토리)

  • 코드의 재현성을 높일 수 있다 — 과거에 코드가 제 머신에는 작동하지만 다른 분들 머신에서는 작동하지 않았던 일들이 종종 있었습니다. 주로 missing dependency 이슈 때문이었는데요. 한 머신에 여러 프로젝트를 관리하면 어떤 프로젝트에 어떤 라이브러리와 패키지가 필요한지 관리하기 어려워 집니다. 그래서 저는 프로젝트 당 한 가상머신을 두려고 합니다.
  • 타킷 플랫폼에 코드 테스트를 할 수 있다 — 제가 하고 있는 대부분의 프로젝트는 서버사이드나 인프라와 관련된거라서, 사실 타킷 플랫폼은 리눅스 입니다. 저는 맥북을 사용하지만, 대부분의 시간을 저의 서버들과 같은 OS 를 갖춘 VM들속에서 보내기 때문에, 맥에 있는 데브툴을 각 리눅스 OS 에서 재현합니다.
  • 호스트 OS 를 깨긋하게 유지합니다 — 플랫폼에 구애받지 않는 CLI 툴 같은 프로젝트 작업을 하더라도, 저는 제 워크스테이션을 데브툴과 패키지들로 더렵히지 않으려 합니다. 프로젝트들과 도메인 들은 자주 바뀌기 때문에, 필요한 것들을 바로 호스트 OS 에 다운 받으면 빨리 더럽펴 질수 있습니다.
  • 문제가 생겼을 경우 리커버리 시간을 줄일 수 있다 — 하나의 다목적 머신은 빨리 “스노우플레이크 (눈송이) 호스트”가 됩니다. 문제가 발생했을때 다시 설치 해야하는 목록을 만드는건 어렵습니다.
  • 서버 사이드 / 풀 스택 프로젝트 진행하시는 분들
  • 리눅스 시스템 프로그래밍 하시는 분들
  • Cloud Native stack 을 재미로 다뤄보시는 분들
  • …멋진 CLI 툴을 만들기 위해서!

TL;DR 중요한 포인트

  • Docker 를 사용하는 이유…
  • 툴을 설치하지 않고 실행해보기 위해서
  • 여러 프로그래밍 언어를 실험해보기 위해서
  • docker-compose 로 이것저것 해보기 위해서
  • Vagrant 를 사용하는 이유: 격리될 수 있고, 멈추고 재생할 수 있는 개발 환경을 위해서
  • arkade 를 사용하는 이유: Kubernetes clusters 를 빨리 만들기 위해서

호스트 OS 에 설치해야 하는 것들

  • Docker
  • Vagrant
  • code editors (Vim, Sublime Text, Visual Studio Code, etc.)

도커를 호스트 OS 에 설치한 이유

  • 랜덤한 툴을 설치하지 않고 실행할 수 있다(e.g., alias jq=’docker run -i stedolan/jq’).
  • 프로그래밍 언어의 여러 버젼들을 풀 셋업 없이 실험해 볼 수 있다
  • docker-compose 로 빨리 멀티 컨테이너 플레이그라운드를 만들 수 있다.
  • homebrew —요즘 뭐 설치 하려면 왜 이렇게 오래 걸리나요…
  • rvm, nvm, gvm, etc — 프로그래밍 언어의 여러 버젼들을 관리하기에 괜찮은 옵션이지만, 조심스럽게 다루어야 합니다.
  • Python’s venv — 위와 같지만 파이선 버젼 매니저도 필요합니다. 찾아보려하지도 않았어요;;
  • 컨테이너 안에 개발환경 구축하기 — 해봤지만..개인적으로 컨테이너는 프로젝트를 관리하기에는 너무 일시적인 환경인것 같습니다.

Vagrant 가 사용 되는 방법

$ vagrant plugin install vagrant-vbguest
$ mkdir project-skunkworks
$ cd project-skunkworks
$ vagrant init debian/buster64
# vagrant init centos/7
# vagrant init alpine/alpine64
# etc
  • 새로운 가상머신에 의미있는 이름을 부여합니다.
  • 브리지 애덥터를 통해 호스트와의 네트워크를 연결합니다.
  • 프로젝트 폴더를 머신에 마운트 합니다.
  • CPU 와 RAM 자원을 수정합니다.
  • 기본 패키지 목록이 있는 프로비저닝 도구를 추가합니다.
  • 도커 또는 Podman 브로비져너를 추가합니다 (선택 항목).
Vagrant.configure("2") do |config|
config.vm.box = "debian/buster64"
config.vm.hostname = "skunkworks-01"
config.vm.define "skunkworks-01"
config.vagrant.plugins = ['vagrant-vbguest']
config.vm.network "private_network", ip: "192.168.33.10" config.vm.synced_folder "./", "/home/vagrant/project" config.vm.provider "virtualbox" do |vb|
vb.cpus = 4
vb.memory = "2048"
end
config.vm.provision "shell", inline: <<-SHELL
apt-get update
apt-get install -y curl git cmake tmux vim # ...
SHELL
config.vm.provision "docker" do |d|
d.run "nginx"
end
end

Vagrant 와 Visual Studio Code 원격 개발

Arkade 가 사용 되는 방법

$ curl -sLS https://get.arkade.dev | sudo sh$ arkade --help
$ arkade get kubectl
$ arkade get kind
$ kind create cluster$ arkade install ingress-nginx$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-controller-7d98fb5bd-956fq 1/1 Running 0 38s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller LoadBalancer 10.96.239.161 <pending> 80:31973/TCP,443:31901/TCP 38s
service/ingress-nginx-controller-admission ClusterIP 10.96.11.19 <none> 443/TCP 38s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 84s
...

MySQL 사건의 전말

  • Host: 127.0.0.1
  • user, password 는 MySQL 에 설정한대로 입력
  • Over SSH 접속 옵션 (MySQL Workbench 에서는 SSL 탭)
  • Server 는 Vagrantfile 에 명시한 VM IP 주소 (전 192.168.56.79 였습니다) , Port 는 22
  • User 는 vagrant, password 는 필요 없음
  • SSH key 는 [가상머신프로젝트]/.vagrant/machines/[가상머신호스트]/virtualbox/private_key

--

--

--

r&d blog on architecture, software engineering and inspirations

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
stine

stine

r&d blog on architecture, software engineering and inspirations

More from Medium

Containerization with Podman and Buildah: Linux containers and OCI images explained

Listening process and ports on Mac OS

Dev Blog: Control your iOS device from your browser with a Raspberry Pi (and without Xcode)

Running Redis with resilience in Linux containers on Windows — Part 5