2019년도가 되면서 새롭게 VS Code의 업데이트된 주요 기능들이다.




"No reload on extension install " 이 기능은 이전에 Extention Plugin을 설치하거나 업데이트 할때마다, 다시 Plugin을 로드해주어야 했었는데, 이번에 개선되어서, 설치 또는 업데이트만 하면 자동으로 리로드가 된다.

알렴서 사용하기 때문에 조금 불편하다고 생각했었는데, 이번 1.31버전에서 개선되었다.


"Main menu updates"는 새롭게 "Go(이동)" 메뉴가 추가 되어서 파일또는 패널의 이동을 도와줄수 있도록 기능들을 모았다. 이전에는 줄간 이동을 위해서 "Ctrl-G"만 사용하였는데, 유사한 기능들이 추가 되었다.


그리고, VS Code에서 사용하고 있던 nodejs ver 8.9는 nodejs ver 10.2 로 업데이트 되었다.

 

Realtime으로  IDE의 색상 테마를 변경할수 있는 기능도 추가 되었는데, 색상은 Dark테마로만 사용하고 있어서 잘 사용할 것 같지는 않다. 그외에 IDE사용에 추가된 가능들은 사용하면서 필요할때 다시 볼 생각이다.



WRITTEN BY
행복상자
행복한 마음으로 매일을 살고 싶은 개발자 입니다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret



스프링프레임워크를 사용해서 Restful API를 개발할때, RequestHeader 정보를 가져오는 방법이다.

요즈음에 대세가된 SpringBoot를 이용할 경우에 다른 설정은 크게 필요하지는 않다.

 

"@RestController"를 이용하여, 컨트롤러를 선언해주고, "@GetMapping" 어노테이션을 이용하여, "http://localhost:8080/headerinfo" 라고 호출하였을때, 실행되도로 정의했다. 이때 호출되는 RequestHeader값은 "@RequestHeader" 어노테이션을이용하여 "headers"라는 변수를 통해서 넘겨받을 수 있다.

package net.happyzoo.happzoo;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.http.HttpHeaders;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

import java.util.Map;

@SpringBootApplication
@Slf4j
public class HappzooApplication {

@RestController
public static class GetControllerPractice
{
@GetMapping("/headerinfo")
Mono<Map<String, String>> getHeaderInfo(@RequestHeader HttpHeaders headers)
{
log.info(headers.toSingleValueMap().toString());

return Mono.just(headers.toSingleValueMap());
}

}


public static void main(String[] args) {
SpringApplication.run(HappzooApplication.class, args);
}

}

위는 Sample 코드이며, Lombok을 이용하여 @Slf4j를 선언해주면, 로그를 남길수 있도록 했는데, Lombok를 사용하지않으면, 선언에서 제외하면 된다.


실행 결과는 다음과 같이 Map의 형태로 반환해서 Mono로 전달하면 Client에서 결과값을 받을수 있다.

return Mono.just(headers.toSingleValueMap());


Terminal에서는 

  curl -X GET http://localhost:8080/headerinfo

와 같이 명령을 실행해서 호출하거나, Chrome 브라우져에서 실행해보면 확인할 수 있다.

IntelliJ에 내장된 Rest Client를 이용해서 호출한 결과이다. Json의 Object형태로 결과를 받아왔다.





WRITTEN BY
행복상자
행복한 마음으로 매일을 살고 싶은 개발자 입니다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

나는 SF영화를 좋아한다. 

현실적이지 않기 때문에 상상력을 동원할수 있어서이기도 하고, 미래의 모습을 영화를 통해서 예측할 수 있어서 이기도 하다. 누군가의 상상을 또는 예측을 스크린을 통해서 이해할수 있어서 이기도 하다.

 

"트랜스포머"가 2007년도에 한국에 개봉을 하면서, 어렸을때 보았던 로봇 애니메이션과 만화속의 이미지를 그대로 스크린을 통해서 보게되었다. 이는 로봇영화에 대한 소년기 남자들 로망을 어른이 되어 있는 나에게 충족시켜 주었었다.

상상을 통해 그려보던 모습을 마치 살아 있는양 스크린 속의 변신 로봇의 모습은 거침없이 뛰어다녔었다. 


근래 10년동안에서 가끔씩 나오는 "트랜스포머" 시리즈는 처음의 감동은 아닐지라도, 향수와 추억을 머금고 있어서인지, 시리즈가 나올때마다 만나야 되는 영화가 되었다. 그러나, 새로운 이야기가 영화로 나올때마다, 스케일과 물량은 커졌지만, 이야기 측면에서는 커다란 감흥을 주지는 못해왔다. 상업적인 영화이기 때문이지만, 다음 영화에 대한 기대감이 점차 사라졌기 때문에 시리즈에 대한 위기감이 컸다.


지난주에 보았던 범블비는 이전에 보았던 트랜스포먼와는 다른 형식의 영화이다. 트랜스포머의 "프리퀄"이라고 이야기 하고 싶지는 않다. 이야기의 처음은 전쟁중에 지구로 오게된 "범블비"의 여정의 과정을 보여주지만, 트랜스포머의 기원과 오토봇과 디셉티콘의 전쟁에 대한 오랜 이야기의 시작을 말해주지는 않는다. 


80년대를 살아본 사람에게는 추억과 이야기 거리를 줄 수 있는 영화이다.




"범블비"는 한소녀와의 우연한 만남을 통해서 서로 자극 받고 성장하는 성장 드라마와 같았다. 

이전에는 동물 또는 다른 사람과의 만남을 통해서, 다른 사람 또는 매개체를 통해서 갈등과 트라우마를 극복하는 영화들이 많았기에, 이야기의 플롯은 너무나도 심플하기만 하다.


갈등의 관계도 가족간의 이해를 바탕으로 한꺼플씩 오해를 벗으면서, 어느덧 이야기는 마무리가 된다.

그리고, 새로운 이야기의 시작을 알리면서 영화는 종료된다.


선과 악의 관계도 명확하고, 아군과 적국의 관계도 명확하게 보여주어서, 이전의 "트랜스포머"의 복잡해지 상호관계를 단순하게 만들어 주었다. 이러한 단순한 관계는 "범블비"를 "트랜스포머" 시리즈중에도 역대급으로 만들어 주었다.






WRITTEN BY
행복상자
행복한 마음으로 매일을 살고 싶은 개발자 입니다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

어제는 어렸을 때 보았던 TV 시리즈의 기억을 되살리면서, 영화 '아쿠아맨'을 보았다.

그런데, 예전의 TV에서 보았던 내용과는 다른 탄생의 기원으로 시작한다. 물탱크와 연구실의 수족관에서 생활하는 잘생겼던 주인공인데, 물이 없는 환경에 오래 노출되면, 약해지는 캐릭터였다.

WIKI를 찾아보니, DC상의 여러버전의 '아쿠아맨'의 탄생 이야기가 있다. (내가 기억하는 내용은 이중에 하나인듯...)영화속 주인공의 탄생은 내가 알던 내용과는 다른데, 영화속의 탄생 스토리가 '아쿠아맨'을 영웅화하는데는 더 나아 보인다. 



 

'아쿠아맨은'은 '등대지기'인 인간이 어느날 바닷가에 떠 내려오는 아클란티스의 공주를 구해주면서, 사랑의 빠지게 되고, 탄생을 하게된다. 


영화 '토르'가 망치를 손에 들고 나타났을때와 같이 '아쿠아맨'도 전설의 삼지창을 찾기위해 '메라'공주와 비밀의 단서들을 풀며, 여행을 떠나고 단다.


인간세계와 수중세계간의 전쟁의 위기에서 이 위기를 극복하는 과정에서 '아쿠아맨'은 영웅으로서의 자질과 면모를 보여주며, 존재감을 드러내게 된다.

'DC 코믹스'의 최강 수중 캐럭터로서의

'아쿠아맨'은 이전에 실패한 DC의 다른 영화보다는 기대감을 높인 영화이다.

그 이유는 '컨저링'과 '분노의 질주: 더 세븐'을 만들며, 그만의 재능과 감각으로 사람들의 기대감 이상으로 항상 자신의 능력을 입증해 왔던 "제임스 완" 감동이 메가폰을 쥐었기 때문이다. 


DC는 이전에 발표한 영화들에서 여러차례 망작들은 내놓았기 때문에, 사실 그들의 세계관과 히어로 캐릭터에 대한 매력을 기대하기 어렵다.

DC의 캐릭터들이 성숙하기도 전에 '아이언맨의'과 '토르'의 성공에 기반한 영화 '어벤져스'를 따라가려했던 미완의 'DC 세계간'과 '히어로'간이 벨런스 조절의 실패가 DC 영화에 대한 흥미와 매력 반감시켜왔다.

(어떻게 슈퍼맨과 배트맨이 같은 레벨로 싸우나구....)


이전의 'DC' 영화중에서는 '원더우먼'이 가장 탄생과 성장이 측면에서 사람들의 관심과 흥미로움을 끌어내기에는 훌륭한 영화라고 생각 되는데, DC의 다른영화처럼 복잡하지 않기 때문이다.

'아쿠아맨'도 누가봐도 명확한 선과악의 대립관계를 단순하게 표현하기에, 영화에만 집중할 수 있다. 만약 주인공의 갈등과 복잡한 심리를 표현하려 한다면, 영화는 또 산으로 갔을거다.


이와 더블어 '아쿠아맨'도 매력적인 영화속의 캐랙터와 더불어서 새로운 재미를 이끌기 위한 포석으로서의 역활을 잘 해 놓을 것으로 생각된다.

영화속의 캐릭터 중에 '메라'공주는 다음 영화를 기대하게 만드는 중요한 캐릭터이다. 이는 `아이언맨`의 `페퍼 포츠`의 역활을 기대하기도 하지만, 독자적인 히어로 영화로 만들어져도 멋질 것으로 생각이 된다.


영화의 마지막에는 쿠키 영상이 있는데, '아쿠아맨'의 적으로 떠오른 '블랙 만타'와 '신' 박사의 궁합이 궁궁하다. 그러나, '블랙 만타'만으로는 적의 역량은 다소 부족해 보인다.

이를 어떻게 풀어갈지 다음 영화에 대해서 기대해 . 



WRITTEN BY
행복상자
행복한 마음으로 매일을 살고 싶은 개발자 입니다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

늘은 이것 저것 생각하다가, 예전일이 생각이 났다.


내가 nodeJS 처음으로 사용하기 시작한 것은 2년전 어느 이른 봄으로 기억이 된다.

당시의 나는 쏟아져 나오는 새로운 기술들과 Cloud기반의 서버 기술들을 들여다 보면서, 어떤 것을 공부를 해야할지 수 개월째 맴돌고 있었던 시기로 기억된다. 


하루가 다르게  쏟아져 나오는 새로운 기술들이 눈과 귀를 즐겁게 하였지만

   "무엇을 공부해야할까?" 

   "무엇을 배워야 할까?"

 

대해서 나름 심각하게 고민하고 스스로에게 물어 보는 시간이 많았다.

AI와 머신러닝, ReactJava, Java 8, Lamda, 함수형 프로그래밍,  V8 엔진을 기반으로한 Javascript 기반의 서버 프로그래밍 등등 말이다


이러한 고민의 시작은 사실, 90년대에 서버 클라이언트 프로그래밍을 시작으로 2000년대 초반에는 3 Tier기반의 서버 개발로 할 때는, 모든 서버의 설치와 구성 및 설정을 위해 개발자는 당연하게  사전에 검토와 분석을 기반으로 설계를 하고 개발을 하고 운영까지 하였다. 그리고 당연하게 개발을 위한 소프트웨어 스택과 라이브러리에 대한 기능도 세세하게 검토하고, 버전을 확정한후에 개발을 시작하였다.


하지만, 현재의  AWS와 같은 Cloud 환경과 Spring과 같은 휼륭한 Framework를 사용하거나 완성도가 높은 오픈 소스를 사용하게 되면, 수개월에 걸쳐서 검토하고 기능을 익혔던 과정은 불필요한 작업이 되었다.

내 생각을 덧붙이자면, 누구나 쉽게 개발할 수 있는 환경이 된 것이다. 

이전에 MSDN CD 또는 DVD를 통해서 학습했던 내용들은 인터넷을 이용하면 바로 바로 이용가능한 예제와 설명들을 찾을 수 있다. 


새로운 시대가 도래한 것이다.

그런데, 어떻게 나는 무엇부터 시작을 해야 할지, 알수가 없었다. 몇몇 사람들과 이야기를 나누어 보았는데, 나와 비슷한 고민을 하는 사람들이 있었다. 

알파고의 파도가 지나간지 얼마 되지 않았기에 AI를 공부하고 싶다는 생각이 들었지만, 나는 엔지니어적인 관점에서 접근하고 싶었다. 내가 DB엔진을 만지지않고, DB를 사용하는 것과 마찮가지로 AI와 머신러닝이 어는 정도 성숙된 이후에 공부하고 싶었다. (요즘이 그 때인것 같다.) 


이러 저러한 여러 가지 생각을 하다가, 아무것도 시작을 못하고 있었는데,  

그러다가 내린 나의 생각은 이랬다.  

 

결론은


무엇이 되었던, 일단 한가지씩 시작해 보는 것이다


별다른 고민을 하지 않고, 크지 않은 새로운 과제에 nodeJS 사용해 보기로 하였다

마침 VS Code를 사용하면서, NodeJS와도 궁합이 잘 맞는다는 것을 알았기 때문에, 바로 사용을 할 수 있었던 것 같다. 


꼭 NodeJS 사용해서 원하는 작업을 해야만 하는 것은 아니었다. 

Perl 또는 Python 또는 Groovy 이용해서 Batch 스크립트를 만들어도 되는 간단한 작업 이었기 때문에,
그리고, 새로운 언어를 하나 더 배울 수 있다라는 측면과 호기심에서 시작을 하게 되었다.

아~ 갑자기 생각났다. 그때 AWS에 새로운 가능으로 Lamda가 추가되었는데, 지원하는 언어중에 하나가 바로 NodeJS 였다.   


그때 해야 했던 작업은 배치작업을 만들어야 했는데, RestAPI 정기적으로 호출해서 DB 테이블에 비어 있는

필드를 채워서 테이블을 확인하고 업데이트 하는 것이었다.

NodeJS의 비동기적인 동작에 대해서 잘 알지 못하는 상황이어서, Async와 I/O Non-Blocking에 대해서 작업이 필요한 상황이었다. (지금이라면, 굳이 NodeJS를 사용하지 않습니다. ) 


작업순서는 다음과 같았다.

먼저 AWS S3 에서 로그를 다운로드 받는다. 다운로드 받은 로그를 약간의 분석을 위해서 메모리에 Map형태로 잘 말아서 올린다. 그리고, DB Table 비어 있는 필드를 찾아서 업데이트 하는 작업과 Rest API를 호출해서 DB상의 테이블의 구멍난 부분을 찾아서 채워는 작업이었다.


기본적으로 배치로 돌기 때문에, 시간적으로는 제한을 받지 않기 때문에 기존의 Sync 작업으로 진행해도 되었지만, NodeJS 사용한다라는 것은,  Async 대한 기본적이 고민이 선행될 필요가 있다. (물론, 지금이라면 await async 키워드를 이용하거나, Promise 사용하면 되겠지만...)


비동기 처리는 

내가 원하는 작업 순서에 따라서 로그를 찍지 않는다, 파일을 읽어 올때나, DB에서 쿼리를 실행해 결과를 가져올

때나, 서버로 부터 API 호출하고 Response를 받을때도, 비동기로 찍어주는 로그는 내 예상과 다른 순서와 시점에 로그를 까만 화면에 번쩍이면서 찍고내고  있었다.


사실 비동기 프로그램은 비주얼 베이직에서 이벤트를 받아 처리하거나, 콜백 함수를 이용한 메소드의 실행 측면으로 이해한다면, 이해적인 측면에서 쉬울 수 있지만, 순차에 따른 호출을 하고 싶은 경우에는 중복된 콜백 메소드의 호출을 보게된다.  call-back hell이라고 부르는 그것을 말이다. 


Call-Back Hell을 피하기 위해서 메시지 루프와 같은 형태로 Event를 처리하는 방법을 사용해서 피해보기도 하였으나, 마음에 들지 않는 방식이었다. 


그러다가, 네트워크 작업과 DB 쿼리가 비동기로 호출되는 상황에 대해서 고민을 하면서만들어 솔루션은 

 Task 큐에 넣고, 호출하고, 결과를 비교하는 콜백 함수를 이용하는 방식으로 마무리 하였.

 
그리고, 동기처리가 필요한 작업순서를 지정하기 위한 방식으로 Perl 이용했었다.

순전히 Call-Back을 중첩하여 사용하기 싫어서 사용한 방법이었는데, 나름 메시지 큐를 만들고, 들어오는 결과를 처리하는 방식이어서, 간단하지만 좋은 방식이었다.


만약, 지금이라면 다른 방식으로 해결할 것인데, 공부하는 측면에서는 도움이 많이 되었다.

NodeJS는 장점도 많지만, 단점도 많다, 하지만 장점이 워낙 커서 단점을 가릴 정도로 훌륭하다.




WRITTEN BY
행복상자
행복한 마음으로 매일을 살고 싶은 개발자 입니다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

VS Code는 회사에서도, 집에서도 많이 사용하는 IDE이다.

오늘은 간단하게 테스트할 것이 있어서 띄웠는데, MacOS에는 nodeJS가 설치가 되어 있지 않았다.

간단하게, "nodeJS"를 설치하고, 내친김에 Express를 설치하려고 한다.


NodeJS는 "https://nodejs.org/ko/" 또는 "https://nodejs.org/en/" 에서 다은 받아 설치하면, 된다. 
브로우저가 설치되어 있는 OS에 따라서 다운해서 설치할 바이너리가 달라진다. 



위 화면에 두개의 버전이 있는데, "10.14.2 LTS" 버전을 설치하기로 한다.

윈도우즈와 MacOS 버전 모두 바이너리 버전으로 설치하기 때문에, 다운 받아서 실행하면 바로 설치가 가능하다. (다른 방식으로 cli 명령으로 설치도 가능한데, 오늘은 쉽게 가기로 한다.)


설치가 완료되었으면, 설치 버전을 확인해 본다. nodeJS설치할때 같이 설치되는 패키지 매니져인 npm의 버전과 nodeJS의 버전을 아래과 같이 확인해 본다.

mymac$ npm -v

6.4.1

mymac$ node -v

v10.14.2


이번에는 nodeJS를 이용하여 웹을 개발할때 사용하는 Express 라는 Framework을 설치할 차례다.

Express는 "https://expressjs.com/ko/starter"에 나오는 순서대로 설치하면 된다.


아래와 같이 npm을 이용하여 express 패키지를 설치한다.  만약 설치시 권한문제로 설치가 단되면 sudo 명령을 사용해서 "sudo npm install express"와 같이 실행하면 된다.

mymac$ sudo npm install express

...


mymac$ sudo npm install express-generator -g 

...


자 이제 마지막으로, express를  이용하여 web 프로젝트를 생성해 본다.

아래의 "- e" 옵션은 templet엔진을 "ejs"를 사용하겠다는 옵션이다.

mymac$ express -e showdata

   create : showdata/

   create : showdata/public/

   create : showdata/public/javascripts/

   create : showdata/public/images/

   create : showdata/public/stylesheets/

   create : showdata/public/stylesheets/style.css

   create : showdata/routes/

   create : showdata/routes/index.js

   create : showdata/routes/users.js

   create : showdata/views/

   create : showdata/views/error.ejs

   create : showdata/views/index.ejs

   create : showdata/app.js

   create : showdata/package.json

   create : showdata/bin/

   create : showdata/bin/www


프로젝트가 생성이 되었으면 실행을 해보자.

아래와 같이 "showdata" 디렉토리로 이동해 들어가서, npm을 이용하여 기본 패키지를 설치하고, "npm start" 명령으로 서버를 동작시킨다.

mymac$ cd showdata

mymac$ npm install

mymac$ npm start


기본 포트는 3000번 포트를 사용하므로, 브라우저에서 "http://localhost:3000"을 치면 다음과 같은 화면이 나타나게 된다. 


만약, 실행 포트를 바꾸고 싶다면, "showdata/bin/www" 파일을 열어서 변경하면 된다.


 


  


 


WRITTEN BY
행복상자
행복한 마음으로 매일을 살고 싶은 개발자 입니다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

Visual Studio Code의 새로운 Release(November 2018, Ver 1.30)가 나왔다.

기능적인 주요 Feature들은 다음과 같다.




최근에 사용하는 기능중에는 Search 관련 기능들이 많이 개선되고 있는데, 이번에는 "Multiline Search"에 대한 기능이 소소하게 개선 되었다. 기존에 Regular Expression 을 사용하여 여러라인에 걸처져 있는 Text를 검색하던 것을 "Shift + Enter" 키를 이용하여 Line을 구분하여 주면 찾아올 수 있는 기능이다. 

(개인적으로는 자주 사용할 것 같지는 않다. ) 


아래와 같은 파일이 있을 경우에, 


Window버전의 경우는 "Control + Shift + F"를 눌러 검색 창을 띄우거나, 또는 

MacOS의 경우에 "Shift + Command + F"를 눌려 검색 창을 띄우고, 검색어로 "latest" 를 치고 "Shift + Enter" 를 치고 "Untagged"를 입력한다. 그리고 "Enter"를 치면 멀티라인 검색이 된다.


결과는 다음과 같다.


"Choose extension version"는 개인적으로 있었으면 했던 기능이었는데, Extention Plugin에 대한 설치 버전들을 보고 이전 버전을 설치 할수 있는 기능이다. 설치된 Plugin이 문제가 있을 때 유용할 것 같다.


설치가 되어 있는 Extention Plug인의 오른쪽에 설정 버튼(톱니바퀴모양)을 누르면, 아래와 같이 Pop-UP 메뉴가 나타난다. 메뉴중에 "Install Another version..."을 선택하면 된다. 



현재 설치가 되어 있는 버전들과 이전에 만들어진 설치 가능한 버전들이 나타난다. (아래 화면 참조) 


이중에 한개의 항목을 선택하며, 이전 버전으로 변경하거나, 새로운 버전으로 선택해서 바꿀수 있다.



WRITTEN BY
행복상자
행복한 마음으로 매일을 살고 싶은 개발자 입니다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

지난번에는 MacOS에 도커(Docker Desktop)을 설치하고, 컨테이너에 nginx도 올리는 것도 해보았는데, 밤도 늦고 해서 컨테이너를 정리하지 않고 그냥 내버려두었다.


컨테이너 이미지를 실행하는 것을 복습할겸해서 다시 정리한다. 

사실 설치와 리소스를 정리하는 내용은 "docker.com"에 있는 Getting started를 참조하면 바로 알수 있다.

  

    Getting Started : "https://docs.docker.com/docker-for-mac/#explore-the-application"



지난번에 했던 내용을 복습하는 측면에서 정리를 해보면, 먼저 버전을 확인한다.

"docker", "docker-compose", "docker-machine"의 버전을 아래과 같이 Terminal에서 확인할 수 있다.

mymac$ docker --version

Docker version 18.09.0, build 4d60db4

mymac$ docker-compose --version

docker-compose version 1.23.2, build 1110ad01

mymac$ docker-machine --version

docker-machine version 0.16.0, build 702c267f


또는 상단에 떠 있는 "Docker Dasktop" 의 고래 아이콘을 클릭하면 뜨는 메뉴창중에 "About Docker Desktop" 메뉴를 클릭하면 

다음과 같은 화면이 나타난다. 

설치되어 있는 시스템 모듈의 버전들이 보인다.


 지난번에 설치해서 실행한 컨테이너는 "hello-world"와 "eginx" 였다.

mymac$ docker run hello-world

mymac$ docker run -d -p 80:80 --name webserver nginx


Local Repository에 설치되어 있는 이미지가 있다면, 그대로 사용하고, 없다면 공용 Repository에서 최신버전을 다운받아서 실행을 하게 된다. 여기까지가 지난번에 수행했던 작업이다.


"docker run"을 실행할때 옵션 정보를 알려면 "docker run --help"를 터미널창에서 실행하면 된다.

여기서 "-d" 옵션은 background에서 실행하라는 옵션이다 (컨테이너 ID를 화면에 찍고).

그리고, "-p" 옵션은 컨테이너의 port와 호스트의 port를 매핑해 주는 옵션이다. 위에서는 80포트를 80 포트로 매핑하는 역할을 한다. 

-d, --detach                   Run container in background and print container ID

-p, --publish list             Publish a container's port(s) to the host


실행되고 있는 컨테이너의 리스트는 "docker container ls" 명령으로 아래가 같이 가져올수 있다.

mymac$ docker container ls

CONTAINER ID   IMAGE  COMMAND                  CREATED            STATUS           PORTS                         NAMES

5301571351c7      nginx  "nginx -g 'daemon …"   9 minutes ago   Up 9 minutes   0.0.0.0:80->80/tcp   webserver


세부적인 명령에 대한 도움말은 "docker container --help" 를 이용해서 볼 수 있다.

도움말을 보년 "a"옵션은 전체를 보여주라는 옵션인데, 실행하면 아래와 같은 내용을 볼수 있다.

mymac$ docker container ls -a

CONTAINER ID   IMAGE         COMMAND               CREATED          STATUS              PORTS                NAMES

5301571351c7    nginx     "nginx -g 'daemon…"   17 minutes ago   Up 17 minutes       0.0.0.0:80->80/tcp   webserver

29094fd263cf   hello-world   "/hello"                20 minutes ago   Exited (0) 20 ...                                  quirky_ptolem


 

위 실행 결과를 보면 삭제하려는 컨테이너와 이미지는 "nginx"와 '"hello-world"인데, "nginx"는 지금 백그라운드에서 실행중이라는 것을 알수 있다.


Terminal에서 "docker container stop webserver"를 입력하여 실행되는 컨테이너을 중단시키고, 그 결과를 조금전에 수행했던 "docker container ls -a"명령을 이용해서 확인해 보면 다음과 같이 나타난다.

mymac$ docker container stop webserver

webserver


mymac$ docker container ls -a

CONTAINER ID        IMAGE               COMMAND                  CREATED                STATUS                      

5301571351c7        nginx               "nginx -g 'daemon of…"   28 minutes ago      Exited (0) 4 minutes ago 

29094fd263cf      hello-world      "/hello"                 31 minutes ago              Exited (0) 31 minutes ago 


이어서 컨네이너와 이미지를 삭제한다.


먼저 컨테이너를 삭제한다. 컨테이너 리스트에서 보았던 "NAMES" 필드값을 이용하면 된다.

mymac$ docker image rm webserver

mymac$ docker image rm quirky_ptolemy


실행된 결과의 확인은 다시 "docker container ls -a"명령을 확인하면 된다.


다음으로는 이미지를 삭제하는 방법인데, 먼저 "docker image ls" 명령을 사용해서 리스트를 가져온다.

mymac$ docker image ls

REPOSITORY      TAG        IMAGE ID         CREATED          SIZE

nginx           latest     568c4670fa80     13 days ago      109MB

hello-world     latest     4ab4c602aa5e     3 months ago     1.84kB


이미지를 삭제하기 위해서는 옵션으로 "IMAGE ID"가 필요하기 때문이다.

"hello-world" 와 'nginx'의 이미지는 다음과 같이 " docker image rm" 명령을 이용하여 삭제할 수 있다. 

mymac$ docker image rm 4ab4c602aa5e

Untagged: hello-world:latest

Untagged: hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788

Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f

Deleted: sha256:428c97da766c4c13b19088a471de6b622b038f3ae8efa10ec5a37d6d31a2df0b


mymac$ docker image rm 568c4670fa80

Untagged: nginx:latest

Untagged: nginx@sha256:5d32f60db294b5deb55d078cd4feb410ad88e6fe77500c87d3970eca97f54dba

Deleted: sha256:568c4670fa800978e08e4a51132b995a54f8d5ae83ca133ef5546d092b864acf

Deleted: sha256:ac0442c0fafd48e24a96fa3099ea7ad20012c8759e1dd03dd387dbfbe382984c

Deleted: sha256:6b9d35d8d75115937cd78da275f527cccef672cbd71f34062dffe2e930fd7e13

Deleted: sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3


이에 대한 실행 결과는 "docker image ls"를 이용해서 확인하면 된다.



WRITTEN BY
행복상자
행복한 마음으로 매일을 살고 싶은 개발자 입니다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

새로운 과제를 위해서 Docker의 사용을 검토하고 있는 와중에, 얼마전에는 Google Cloud 기반의 "Kubernates" 사용을 위한 교육도 참여하였다. 몇년전에 Docker에 대해서 검토할때도 각 Cloud 서비스를 제공하는 업체에서, 지금처럼 지원이 가능한 솔루션들이 많이 없었는데, 현재는 "Kubernates"를 기본 Docker관리 플랫폼으로 사용하려고 듯하다. "AWS", "MS" 그리고 "Google Cloud"에서 "Kubernates"를 지원한다.

구글에서는 컨테이너 기반으로 서비스를 운영하고 있다고 한다.


오늘은 며칠전부터 마음 먹었던 일을 하려고 한다. 개인용 PC에 도커를 설치해 보려고 한다. 집에서 사용하고 있는 MacOS에 설치하려고 한다.


Docker에 대해서는 며칠전부터 책을 보고 있는데, 나무위키에서는 다음과 같이 간단하게 잘 설명해 주고 있다.

도커는 LXC(리눅스 컨테이너)라는 커널 컨테이너 기술을 이용하여 만든 컨테이너 기술 중에 하나이다.


가상화와 관련된 여러 기술들이 있지만, 도커는 리눅스 기반의 기술에서 비롯되었다고 이해하면 된다.


Docker는 "https://www.docker.com"에 접속하면 자세한 정보들을 볼수 있는데, 나는 여기서 오늘은 MacOS에서 구동이 가능한 "Docker Desktop"을 설치하려고 한다.


Docker 웹사이트의 "Products" 메뉴에서 "Docker Desktop"을 찾아가거나 다음의 URL로 직접 접속해서 다운을 받아도 된다. 


Docker Desktop : https://www.docker.com/products/docker-desktop


아래와 같은 화면을 볼수 있을 것인데, 여기서 Mac용 설치 파일을 받으면 된다.





그런데, 바로 다운을 할수가 없다. ^^;;  

로그인을 위한 회원가입이 선행이 되어야 한다.

가입은 로그인 계정에 사용할 id와 인증을 위한 email 계정을 넣으면 쉽게 할수 있다. 인증 email을 받아서 내용을 보면, 아래와 같이 "Confirm Your Email" 버튼이 보이는데, 이를 클릭하면, 인증은 끝나고, 바로 다운로드를 받을 수 있다. 

MacOS 에서는 "Docker.dmg" 파일이 다운로드 받게 되어있다. 

이제 다운로드한 "Docker.dmg"을 Finder를 열고, 더블 클릭을 하게 되면 아래와 같은 화면이 나타나는데, 아래 창에서 보이는 그대로 "Docker" 이미지를 마우스로 드래그 & 드롭해서 "Applications"폴다 이미지에 가져다 놓으면 설치가 진행된다.

설치가 완료되고 실행을 시키면 아래와 같은 화면이 나타난다.

그리고 화면 상단에는 다음과 같이 도커 이미지가 표시가 될 것이다.



위 화면에서 "Next" 버튼을 누르면, 아래와 같이 권한에 대한 요청 메시지를 볼수 있는데, "OK"버튼을 클릭하고, 시스템 관련 Password를 입력하면 된다.

패스워드를 입력하면, 사용할 준비는 끝나게 되는데, 이와 동시에 화면 상단에 로그인 하라는 화면이 아래와 같이 나타날 것이다.

조금 아까 다운로드 받기위해서 만들었던,  id 와 password 를 입력하게 되면, 아래와 같이 사용이 가능하다는 화면이 나타나게 된다.

설치된 Docker Dasktop을 한번 테스트겸 사용해 보자.

간단하게 위의 화면처럼 Terminal을 하나 열고 "docker run hello-world"를 실행해 보자.

그러면 다음과 같이 화면에 표시가 될 것이다.

mymac$ docker run hello-world

Unable to find image 'hello-world:latest' locally

latest: Pulling from library/hello-world

d1725b59e92d: Pull complete 

Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788

Status: Downloaded newer image for hello-world:latest


Hello from Docker!

This message shows that your installation appears to be working correctly.


To generate this message, Docker took the following steps:

 1. The Docker client contacted the Docker daemon.

 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.

    (amd64)

 3. The Docker daemon created a new container from that image which runs the

    executable that produces the output you are currently reading.

 4. The Docker daemon streamed that output to the Docker client, which sent it

    to your terminal.


To try something more ambitious, you can run an Ubuntu container with:

 $ docker run -it ubuntu bash


Share images, automate workflows, and more with a free Docker ID:

 https://hub.docker.com/


For more examples and ideas, visit:

 https://docs.docker.com/get-started/


설치된 Docker의 버전은 "docker --version"을 이용해서 알수 있다.

mymac$ docker --version

Docker version 18.09.0, build 4d60db4


 이번에는 Webserver를 한번 띄우겠다. "docker run -d -p 80:80 --name webserver nginx" 라고 terminal에 입력한다.

mymac$ docker run -d -p 80:80 --name webserver nginx

Unable to find image 'nginx:latest' locally

latest: Pulling from library/nginx

a5a6f2f73cd8: Pull complete 

1ba02017c4b2: Pull complete 

33b176c904de: Pull complete 

Digest: sha256:5d32f60db294b5deb55d078cd4feb410ad88e6fe77500c87d3970eca97f54dba

Status: Downloaded newer image for nginx:latest

08f27af460e9d6d3521104729fdeda7f4fba9ff7b69187bbf7fb588307c4fc71


이미지가 로컬에 없다면, 다운받아서 설치가 될 것이다. 


설치된 이미지와 컨테이너의 동작을 보기 위해서 아래가 같이 "docker container ls" 명령은 준다. 

결과가 잘 나왔다.

mymac$ docker container ls

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES

08f27af460e9        nginx               "nginx -g 'daemon of…"   38 seconds ago      Up 37 seconds       0.0.0.0:80->80/tcp   webserver


이번에는 정상적으로 동작하는지 확인해 볼거다. Terminal에서 "curl -X GET http://localhost:80"을 입력하고 실행해보면 아래와 같이 출력이 될 것이다. 정상적으로 잘 동작하는 것이다. 물론 브라우저에서도 가능하다. 

mymac$ curl -X GET http://localhost:80

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

    body {

        width: 35em;

        margin: 0 auto;

        font-family: Tahoma, Verdana, Arial, sans-serif;

    }

</style>

</head>

<body>

<h1>Welcome to nginx!</h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>


<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>


<p><em>Thank you for using nginx.</em></p>

</body>

</html>



웹브라우저에서 "http://localhost" 또는 "http://localhost:80"을 실행해보면 다음과 같은 화면을 볼수 있을 것이다.




처음으로 docker dasktop을 설치해 보았는데, 설치는 별로 어렵지 않았는데, 로그인을 해야 한다라는 사실이 좀 생소하였다. 이후는 수월하게 설치할 수 있었다.


아참, 아까 띄워놓은 컨테이너는 어떻게하지, 아직도 동작하고 있을 텐데...

오늘은 늦었으니, 내일 다시 마무리 해야겠다.

 




WRITTEN BY
행복상자
행복한 마음으로 매일을 살고 싶은 개발자 입니다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

Visual Studio Code의 단축키들을 정리한 파일들이다. 가끔식 확인이 필요하거나 책상에 프린트에서 붙여 놓으면, 참고하는데 도움이 될 것이다.  VS Code의 메뉴상에서는 "도움말" > "바로가기 키참조"에서 확인 가능하다.


아래는 각 OS별로 작성된 Shortcut 키 매핑에 대한 파일들의 링크와 위치이다.



[MacOS용 Shortcut 파일] 

   https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf






[Windows용 Shortcut 파일

    https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf





[Linux용 Shortcut 파일]

    https://code.visualstudio.com/shortcuts/keyboard-shortcuts-linux.pdf




WRITTEN BY
행복상자
행복한 마음으로 매일을 살고 싶은 개발자 입니다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret