본문 바로가기
스터디/블록체인 OJT

블록체인 세미나 3일차 : Docker,Node.js,Go,Git 등

by 맑은청이 2021. 1. 26.
728x90
반응형

Docker  

 

도커는 리눅스 기반의 소프트웨어 플랫폼이다. 

-> 그럼 윈도우에서는 안 돌아가나? 도커 데스크톱이라는 윈도우에서 설치 가능한 게 나오는데 그건 어떻게 돌아가나. 윈도우에는 HyperV라는 Demon같은 게 존재함. 여기서 리눅스 명령어를 끌고 옴. C그룹의 커맨드를 사용함. 

 

실행 중인 환경에 관계없이 언제나 동일하게 실행됨

도커 이미지를 컨테이너가 실행시키는 구조인데 실행에 필요한 모든 것을 올리기 때문에 다른 컴퓨터에서도 이미지를 다운 받고 올리면 된다.

-> 다른 컴퓨터라는 말은 조금 비약함. '환경'이라는 부분을 정확히 알고 있어야함. 도커의 가장 큰 특징은 'OS dependency'가 없다. 즉 자바의 JVM과 유사한 느낌으로 돌아감. 하지만 도커에 가장 큰 문제점은 'architecture dependency'는 존재함. 컴퓨터에서(AMD 계열) 돌리던거를 라즈베리파이(ARM계열)에서 돌리면 안 돌아간다. 그러면 나중에 빌드를 따로 해서 올려야함. 

 

 

-> 도커가 항상 VM에 비해서 좋은 걸까?

하나의 커널을 공유하는 형태라서 보안에서 문제가 발생할 수 있다.

 

-> 별도의 Guest OS가 필요없는 근본적인 이유가 무엇일까?

 OS 수준의 가상화(맞는 말) 

커널은 OS에 필수적인 항목.

각각의 애플리케이션 다른 OS를 써도 된다. 즉 다른 OS가 필요가 없음. 도커 내에서는 커널을 공유하기 때문에, 그러므로 Guest OS 가 필요없음. 마운팅이 되있기 때문에 굉장히 빠르다. Clustering 도 많음. 서비스를 배포할 때는 컨테이너가 확실히 좋으나 산출물이나 결과물을 낼 때는 가상머신을 사용해야한다. 아마존에서도 가상머신 서버 혹인 컨테이너 서버를 다르게 제공할 때가 있다. 그곳에 장단점이 나와 있으니깐 읽어보기. 

 

유지관리 효율 : OS가 하나이기 때문에 OS 수준에서 업데이트 또는 패치 작업을 하면 변경 사항이 모든 컨테이너에 적용됨 

-> 말이 이상함. 도커가 가벼워서 유지관리 효율이 좋은 거임

 

컨테이너 한 컴퓨터에서 여러 프로세스를 독립적으로 실행하는 형태 , 성능 문제 X

-> 성능 문제가 사라지지 않음. 수정이 필요

 

 

-> 도커의 단점으로 다양한 OS 환경을 운영할 수 없다는 거에 대한 이해

 가상머신은 Host OS 위에서도 Guest OS 를 따로 할 수 있지만 도커는 Host OS 에 의존적이니깐 

-> 다양한 OS 환경보다는 자유로은 OS 환경이라고 이야기 하는 게 맞음. 도커가 Host OS 에 더 가깝기 때문에 덜 자유롭다라고 이야기 할 수 있다. 또한 도커의 장점도 가볍고 빠른 실행 속도인 이야기는 커널을 공유하기 때문이다. 예를 들어 VM 머신을 사용해서 무엇갈 보낼 때 커널을 두 번 거쳐야하고 이게 많으면 복잡해진다. 하지만 도커는 프로세스처럼 돌아가기 때문에 오버헤드가 작아서 엄청 빠르게 돌아가고 하지만 커널을 공유하기 때문에 커널 컴파일이나 이러한 작업이 불가능 함. 

 

Docker Hub라는 저장소에 Docker Image 를 업로드하고 내려받을 수 있음

-> Docker Hub 가 아니라 Remote Repository 만 있으면 업로드 및 내려기가 가능, Docker Hub 는 그냥 Public한 저장소라는 의미 

 

Node.JS

 

싱글쓰레드 => 하나의 쓰레드가 혼자서 일을 처리하는 방식

CPU 부하가 큰 작업에는 적합하지 않음

-> 구분이 명확해야함. 어떻게 진행이 되는건지. 

-> 자바스크립트는 바이너리 파일로 컴파일링 하는 게 있나? 자바스크립트는 컴파일 하지 않음. 웹 엔진 위에서 돌아감. (사파이어, 아마존 등등) 크롬 자체도 크로미옴이라는 베이스로 개발돼서 돌아감. nodejs는 이 크로미옴 베이스로 돌아감. 문제는 프론트만 쓰고 백엔드에서 못 씀. 바이너리가 없기 때문에. 이를 쓰기 위해 nodejs를 사용하는 것. 즉 플랫폼은 아님. 런타임 환경이라고 할 수 있음. 커널 위에 바이너리 형태로 있고 자바스크립트를 받아서 바이너리 형태로 돌릴 수 있게 해주는 런타임 환경이라고 할 수 있음. 

 

-> 이벤트 기반 같은 특징은 자바스크립트 이기 때문에 오는 거임. '하나의 스레드가 일을 처리하는 방식' 은 틀린거임. '하나의 스레드가 일을 받아서 다른 스레드에 넘기는 것' 혼자서 일을 분배하기 때문에 빠름. 하지만 얘가 죽으면 멈춤. 그래서 스레드를 올려서 한 개가 죽어도 합의 알고리즘 관계로 죽지 않음. 그래도 속도는 느려짐. 하지만 노드 js 는 무조건 싱글 스레드이기 때문에 빠름. functional language 에 특징.

 

CPU 부하가 큰 작업에 적합하지 않음

(TC)

npm

 

-> 패키지들이 저장되어 있는 저장소 개념이 아니라 기본 패키지 관리자라고 말할 수 있음. JAVA, JAVA BOOT, PYTHON, RUBY 를 백엔드에서 많이 사용되고 있음. 새롭게 시작하는 스타트업은 SPRING BOOT 나 GOLANG이나 NODEJS 를 많이 씀. 왜냐면 npm 에 패키지가 많음. 그래서 nodejs 가 많이 씀. 하지만 크기나 규모나 JAVA 에 비할 게 아님. 여기서 쓰레기나 필요없는 걸 빼고 검증 시켜놓은게 SPRING 임.

 

 

GoLang

고는 안드로이드 앱, IOS 앱 개발 가능, 웹, 서버 개발에도 사용가능

-> 각각이 어떻게 이야기 인가. 안드로이드는 kotlin 이나 React 나 flutter 로 사용 IOS는 Swift JS 사용. Go 로 앱으로 사용이 되나? 백엔드에 많이 사용이 됨. 도커와 같은 도구로 많이 사용이 됨.

 

-> 장단점이 Offical 하지 않다. 지원하지 않는 문법이 많은 것은 많지만 일부러 없앤 것이다. C++ 은 structure 나 class 가 있다. 하지만 이 둘은 둘 중 하나만 있어도 개발이 가능. Go는 다 통일시킨거. 키워드를 다 통일. for문만 쓰고 while 없앤거. 키워드가 적기 때문에 코드가 간결하고 가독성이 높음. 장점이자 단점으로 Convention 이 강함. GoLang 은 주석이 필수. 코드 상에 룰을 강하게 정해놓음. Goformatter 도 따로 지원. 간결한 문법은 아니라고 할 수 있음. 컴파일 속도가 엄청 빠른 건 맞음. 가비지 컬렉션을 지원하는 게 맞지만 Go의 장점은 아님. 요새 나오는 언어는 다 지원이 됨. 개발자가 메모리를 직접 관리할 상관은 없으나 변수는 관리해야함. run time 상태에서 가비지 컬렉션에서는 하지만 바이너리 상태에서는 사용이 없기 때문에 안쓰는 건 명시를 해줘야함. 

GoRoutine 이 경량 스레드가 맞다. 하지만 여기서 채널을 사용해서 해야한다. Golang 의 큰 장점은 비동기 동시 처리가 가능하다는 것. Go 언어의 타깃은 C언어. 다 통일 시킴. 축약어를 쓰면 안되고(ID 나 데이터베이스 정도) 모던 파스칼로 통일. 이게 장단점이지만 GoLang 을 많이 다루면 가독성이 엄청 높음. 

 

Git

 

->Git 의 특징이 보다는 SVM과의 비교같아 보임. SVM은 local repository 가 없음. 병렬 개발이 힘듦. git이 서버 장애가 있어도 개발이 가능하다는건 local 에서 commit 이 가능하기 때문에. 

->언제든지 Checkout 할 수 있는 건 아님. 

->용어나 개념이 많아 배우기 어렵다. 이는 주관적인 거임. SVM 보다 배우기 훨씬 편함.

 

실습 파트 

->도커에 포트 바인딩은 꼭 알고 있어야함. 프라이빗한 네트워크를 분배하고 거기 안에 올린 게 들어갈 것. 포트 포워딩을 안 하고 nodeJS 에서 Ping 을 날리면 마리아DB에서 안될거임. 동일한 네트워크를 도커 내에서 하면 가능할것. 포트 포워딩은 호스트에서 받아서 처리할때만 쓰게됨. 백엔드와 DB가 따로 떨어져 있지 않은 이상 포트 포워딩을 절대 쓰지 않음. 이러한 경우에도 다른 걸 활용하여 사용하게 됨. 

 

-> 도커 컴포즈 도구 필수, 여러 개 관리 하기 힘드니깐 한 번에 하는 것. 

 

-> 밴더를 사용해야함. 1.13 부터 지원을 하게 함. Go 는 무조건 1.14 이상 부터 다루어야함.

 

 

 

 


두번째 발표 

 

Go

-> sudo vi/etc/profile 에 넣으면 안되고 자기가 쓰는 쉘 스크립트에 맞춰서 넣어줘야함. 

->PATH 는 $GOROOT:$PATH 로 해야한다. 

->PATH 는 앞에서 부터 찾아보기 때문에 우선 순위를 정할 수 있음. GOPATH 가 먼저 오는 게 맞는 거 같음

-> projects/go 이제 단일 언어를 사용하는 일이 없어질 거기 때문에 추천하지 않는 디렉토리 명.

-> GoLang 안에는 세가지 디렉토리가 꼭 들어가야함. (TC)

 

Node.js

->node.js 를 사용할 때 type script 를 쓰는 버릇을 드는 게 좋음. java script 에 정적인 면의 한계가 명확함. 

 

Express

->MVC 형태의 구조를 Express에서 지원하지는 않음. 웹 자체에서 요새 다 MVC 패턴으로 제공을 함. 

 

Spring Boot

->Spring Beans, AOP, Servlet, ORM 개념 파악하기 

 

->톰캣이 왓슨은 아님. 

-> Spring boot 는 Maven 과 Gradle(추천) 지원, 언어는 Groovy 와 Kotlin(추천)를 지원. Gradle 를 꼭 다뤄봐야함. 자바는 X

 

Shell Script 

-> 컴파일 단계가 없기 때문에 빠른 실행을 하는 게 아니라 빌드가 없는 거. 쉘 자체가 스크립트라서 빠른거임. 

 

728x90
반응형