Docker 는 기능 뿐 아니라 가이드 문서도 꾸준히 버전업 하고 있음.
년초를 맞아 Docker 가이드 문서를 다시 살펴볼 수 있는 기회가 있었음.
눈에 띈 내용을 요약함

 

Docker 어플리케이션 개발자를 위한 베스트 프랙틱스

출처: https://docs.docker.com/develop/dev-best-practices/

어플리케이션 데이터를 어디에 저장해야 하나

  • 어플리케이션 데이터를 Docker Storage (컨테이너에 할당된 디폴트 파일 시스템)에 저장하지 마라
  • 대신, 도커 Volumes 를 사용하라
  • 만약 상황이 적절하다면, 도커 Bind mount 도 괜찮다
  • Swarm Service 를 운영할 경우, 민감한 데이터는 Secrets 를 이용하라 (민감하지 않은 데이터는 Configs 를 이용하라)

 

개발환경과 운영환경의 차이

개발환경 운영환경
소스코드를 Bind mount 에 저장해서 이용하라 소스코드를 Volumes 에 저장해서 이용하라
호스트 사이의 시간 오차에 신경 쓸 필요 없다 모든 도커 호스트에 NTP 서버를 설정해서 시간을 맞춰 운영하라

 

도커 네트워크 드라이버 요약

출처: https://docs.docker.com/network/

도커 네트워크 드라이버 요약

Bridge network * 1개 호스트에서 여러개의 컨테이너들 사이의 통신이 필요할 때 적절한 선택
Host network

* 컨테이너 네트워크와 호스트 네트워크가 격리될 필요가 없을 때 적절한 선택

* 네트워크 성능 최적화가 필요할 때 적절한 선택

Overlay network

* 여러개 호스트들 사이에서 컨테이너들 사이의 통신이 필요할 때 적절한 선택

* 여러개의 컨테이너들을 Swarm Service 로 묶어서 운영할 때 적절한 선택

Macvlan network

* VM 방식에서 컨테이너 방식으로 이전할 때 고려할 수 있는 선택

* 컨테이너에 고유한 MAC 주소를 할당함

3rd party network plugins * 기타 다양한 네트워크 플러그인 사용 가능함

네트워크 성능 최적화가 필요한 Hyperledger Fabric 운영의 경우, Host network 모드 사용을 검토해볼만 함

 

어플리케이션 데이터 다루기

출처: https://docs.docker.com/storage/

  • Volumes : 어플리케이션 데이터를 도커가 관리하는 파일시스템 영역에 저장 (가장 권장하는 방식)
  • Bind mounts : 어플리케이션 데이터를 호스트 파일시스템에 저장 (조건만 맞는다면 괜찮은 방식)
  • tmpfs : 어플리케이션 데이터를 호스트 메모리에(만) 저장 (데이터를 호스트 파일시스템에 절대 저장하지 않으므로 기밀성이 좋다)

 

기타 팁

편리한 docker prune 명령 (컨테이너, 네트워크, 이미지, 캐시와 함께 Volume 까지 한꺼번에 정리)

$ docker system prune --volumes
WARNING! This will remove: 
        - all stopped containers 
        - all networks not used by at least one container 
        - all volumes not used by at least one container 
        - all dangling images 
        - all build cache 
Are you sure you want to continue? [y/N] y

 

(이상)

Posted by ingeeC
,

2019.10.19. 개발 계획을 정리함
2019.12.23. 개발을 마치고 소감을 추가/정리함

0. 배경

  • 간단한 Admin 포탈을 개발해야 하는 상황을 맞이함
  • 이에 웹 프론트엔드 개발에 사용할 기술스택을 조사, 그 선택 과정과 결과를 공유함
  • 선택 과정에서 https://bestofjs.org 의 자료가 유용했음

1. 웹 프론트엔드 프레임워크

  • React.js vs. Vue.js 를 고민
  • React.js
    • 페이스북이 개발
    • Virtual DOM 개념을 활용한 빠른 화면 처리 (Virtual DOM 개념의 원조)
    • MIT 라이선스 (페이스북 독자 라이선스 모델이었으나 커뮤니티의 요구로 변경됨)
  • Vue.js
    • 커뮤니티가 개발
    • Virtual DOM 개념을 활용한 빠른 화면 처리 (Virtual DOM 개념 따라쟁이)
    • MIT 라이선스 (상용 사용이 가능한 무료/오픈소스 라이선스)
  • 결론: Vue 선택
    • React.js가 잘 팔린다는 말에 고민했으나 Vue.js 학습 난이도가 낮다는 말에 Vue.js로 결정

Virtual DOM?
브라우저 안에서 DOM-tree 조작 (HTML 요소의 추가/삭제/변경)이 일어나면
이후 Render-tree를 만들고 이를 화면에 출력하는 프로세스가 진행됨.
이는 처리비용이 큰 프로세스여서 DOM-tree 조작을 줄일수록 화면 처리 성능이 개선됨.
Virtual DOM은 별도의 메모리 공간에서 DOM-tree 조작 작업을 수행한 다음
최종 결과만 실제 DOM-tree에 복사해서 브라우저 화면을 갱신하는 방식 (그래서 화면 갱신을 최소화 하는 방식).

==> 2019.12.23. 회고
Vue.js 선택에 후회 없었다. 처음 생각처럼 학습 장벽이 극히 낮아서 쉽게 배워 쓸 수 있었다. Vue.js의 SFC (Single File Component) 개념은 아주 멋졌다. 다음 프로젝트가 있다면 주저없이 Vue.js를 계속 쓸 것 같다.

 

 

2. UI 컴포넌트 라이브러리

UI 컴포넌트 라이브러리?
디자인된 UI 구성요소들(버튼, 콤보박스, 리스트박스 등의 화면 구성요소들)의 모음

  • Bootstrap vs. Vuetify 를 고민
  • Bootstrap
    • 트위터가 개발한 역사와 전통의 UI 컴포넌트 라이브러리
    • 반응형 웹디자인 (모바일 화면과 데스크탑 화면을 적절히 지원)
  • Vuetify
    • 커뮤니티가 개발
    • 구글이 제안한 '머티리얼라이즈 디자인' 제공 (플랫 스타일 디자인)
  • 결론: Vuetify 선택
    • Vue 프로젝트와 궁합이 더 좋을 것 같다고 생각

==> 2019.12.23. 회고
Vuetify 선택에도 후회 없었다. Bootstrap의 Grid System을 거의 그대로 지원한다. 그래서 반응형 UI (Responsive UI)를 만들기 좋았다. 라이브러리의 개념체계가 직관적이어서 Bootstrap보다 사용법이 쉽다고 느꼈다. 특히 문서가 정갈하고 좋았다.

 

 

3. 모듈 번들러

모듈 번들러?
브라우저와 서버 사이의 통신비용을 낮추고 처리속도를 높이기 위해,
브라우저 안에서 실행될 여러개의 JS 파일들을 한개의 파일로 묶어주는 도구

  • Webpack vs. Browserify 를 고민
  • Webpack
    • JS 파일 뿐 아니라 HTML, CSS, 이미지 파일들도 번들링 가능
  • Browserify
    • JS 파일만 번들링
  • 결론: Webpack 선택 (별로 고민할 거리가 없었음)

==> 2019.12.23. 회고
이건 vue cli가 만들어주는 틀을 그냥 따랐던 것이 잘했던 것 같다. 내가 무엇을 선택해서 쓴다는 느낌이 들지 않았다. 모든 것이 자연스러웠다.

 

 

4. 테스트 프레임워크

  • Mocha vs. Jasmine 을 고민
  • 결론: Mocha 결정 (별로 고민할 거리가 없었음)

==> 2019.12.23. 회고
UI를 위한 유닛 테스트를 작성하지 않았다. 이번 개발 범위가 워낙 단촐해서 테스트 코드를 만드는 것이 오버헤드라고 판단했다. 하지만 이 프로젝트가 살아남는다면 반드시 해야 할 일이라고 생각한다 (다음을 기약).

 

 

(이상)

Posted by ingeeC
,

golang 1.13 릴리즈를 통해 "go 모듈 (이후 go mod)" 지원이 강화됨

  • 몇 주 전 (2019-09-03) golang v1.13 이 릴리즈 됨. 이 버전의 가장 큰 특징은 go mod 지원이 강화된 것 (이제 옵셔널 피쳐가 아니라 디폴트 피쳐).
  • go mod 관련 릴리즈 히스토리
    • v1.11 (2018-08-24)
      • go mod 지원 시작 (옵셔널 피쳐로 추가)
      • $GO111MODULE (임시) 환경 변수값에 따라 go mod 지원 방식 결정 (on, off, auto)
    • v1.12 (2019-02-25)
    • v1.13 (2019-09-03)
      • go mod 지원 강화 (go mod 방식이 디폴트 피쳐가 됨)
      • 구글이 운영하는 go module mirror와 go checksum DB를 사용 (디폴트)
  • golang의 강점은 "하위 호환성 보장"
    • 2012년 golang 1.0 출시 이래 지켜져 온 약속
    • go mod 기능도 하위 호환성을 고려함
      • 예전 $GOPATH/src 디렉토리 체계도 지원
      • 예전 vendor 디렉토리 체계도 지원

golang 모듈이란?

  • golang의 모듈이란 버전이 붙은 패키지들의 묶음을 말함 (패키지는 소스코드 파일들의 묶음).
  • go mod 체계의 구성 요소
    • go.mod 파일
      • 의존하는 모듈과 버전을 명시하는 파일
    • go.sum 파일
      • 모듈의 파일이 바뀌지 않았음을 확인하기 위해 저장하는 첵썸 파일
      • go 명령이 go.mod 에 정의된 모듈을 다운로드할 때 각 모듈의 첵썸값을 go.sum 파일에 자동 기록
      • 이를 첵썸 디비(아래 설명)와 대조, 모듈 내용의 변경 여부를 확인
    • module mirror
      • 모듈을 다운로드 하는 서버
      • 모듈의 소스레포가 죽었을 경우 (또는 폐기되었을 경우) 대비 (그런 경우에도 모듈 다운로드 보장)
      • go 명령이 디폴트 참조하는 미러 서버를 구글이 운영 (proxy.golang.org)
      • 관련 명령 : go get, go build, ...
    • check sum DB
      • 모듈이 위/변조 되지 않았는지 확인하는 서버
      • go 명령이 디폴트 참조하는 첵썸 디비를 구글이 운영 (sum.golang.org)
      • 관련 명령 : go get, gosumcheck, ...
    • go.mod 파일과 go.sum 파일은 소스관리 대상

go mod 를 사용하면 무엇이 좋은가?

  • $GOPATH/src 디렉토리 바깥에 프로젝트 디렉토리를 만들 수 있음
  • vendor 디렉토리를 사용하지 않아도 됨
  • reproducible build (언제,어디서나,누구라도 항상 동일한 build 결과를 보장함)

go mod 철학

  • reproducible build
    • 검증된 빌드 / 반복 가능한 빌드
    • go.mod 파일과 module mirror 서비스를 이용하여 처리
  • immutable dependency
    • semantic versioning (SemVer : https://semver.org/spec/v2.0.0.html)
      • 모듈의 버전은 v0.0.0 포맷 버전 체계로 한다 (강제사항)
      • 첫 글자 v 필수
      • 버전 숫자 3개 필수 (major ver, minor ver, patch ver)
    • semantic import versioning
      • major 버전에 따라 import path 를 달리 가져간다 (ex. import "my/thing/v2/sub/pkg)
      • v0, v1은 import path 에 버전을 포함하지 않는다 (기존 import path 그대로)
    • go.sum 파일과 check sum DB 서비스를 이용하여 처리
  • minimal version selection
    • go.mod 에 참조 모듈을 서술할 때 minimum ver 만 명시한다
      • (node.js 의 npm 같은) 다른 패키지 관리자처럼 go.mod 에 incompatibility 를 서술하지 않는다
    • go.mod를 해석하여 참조 모듈을 선택할 때, minimum version 을 선택하는 방식이
      • 모듈 업그레이드로 인한 빌드 실패 발생 확률을 낮춘다 (reproducible/repeatable build 보장)
      • 모듈 업그레이드로 인해 빌드 실패 발생시, golang 커뮤니티가 해결 시간을 더 확보할 수 있다
    • go 명령어를 이용하여 처리 (go get, go build, go test, ...)

go mod 사용 방법

  • 기존 프로젝트를 go mod 체계로 이전하는 방법
    • (golang 업그레이드를 위해) 기존 go 설치물 제거
      sudo rm -rf /usr/local/go/
    • go v1.13 설치
      curl -O https://dl.google.com/go/go1.13.linux-amd64.tar.gz
      sudo tar -C /usr/local -xzf go1.13.linux-amd64.tar.gz
    • 프로젝트 루트에서 go mod 초기화
      cd PROJECT_ROOT
      go mod init
    • go.mod 파일, go.sum 파일 확인
    • build & test 성공 확인
      go build
      go test

추가로 알면 좋은 것들

  • go.mod 샘플

    module "my/thing"
    
    require (
      "google.golang.org/appengine" v1.0.0
      "github.com/google/go-github" v0.0.0-20180116225909-922ceac0585d
    )
  • go.mod 파일을 구성하는 명령 목록

    • module, require, exclude, replace 명령 사용 가능 (4개뿐)
      module "my/thing"
      require "other/thing" v1.0.2
      require "new/thing" v2.3.4
      exclude "old/thing" v1.2.3
      replace "bad/thing" v1.4.5 => "good/thing" v1.4.5
  • go.mod 파일은 직접 작성/수정할 필요 없음

    • go 명령을 통해 자동 작성/수정됨
      go mod init
      # .git, Gopkg.toml, Gopkg.lock 등을 참조하여 go.mod 파일 생성
      
      go get, go build
      # go.mod 파일 업데이트
      # 소스코드에서 import 한 파일 목록을 찾아 
      #  1. go.mod 파일에 추가
      #  2. GOPATH/pkg/mod 디렉토리에 버전별로 설치
      #  3. 프로젝트 루트에 go.sum 파일 생성
      
      go tidy
      # go.mod 파일과 소스코드를 비교/검증하여, go.mod 파일 목록을 (다시한번 단단히) 정리
      
      go mod verify
      # 로컬에 설치된 모듈의 해시 값과 go.sum 파일을 비교하여 검증

ref

다음 2개의 자료를 순서대로 보는 것을 추천함.

(이상)

Posted by ingeeC
,

docker prune 명령 요약

  • docker system prune -f
    • 종료된(exit 상태의) docker container들을 모두 내리고, 쓸모 없는 image (dangling image)들을 제거

  • docker volume prune -f
    • 참조되지 않는 (현재 사용하지 않는) docker volume을 제거
    • volume의 life-cycle과 container의 life-cycle은 별개, 따라서 컨테이너가 종료되어도 컨테이너가 쓰던 볼륨은 스토리지에 남아 있게 된다.
    • 스토리지 공간이 모자라 골치 아픈 시스템 관리자에게 매우 유용한 명령

  • docker network prune -f
    • 현재 사용하지 않는 docker network 제거


마이크로 팁, 끝.


Posted by ingeeC
,

GOPATH와 module 관련 소식

Golang 의존성 관리 규칙이 바뀔 참이라고 한다. 2019년 8월 golang 1.13과 함께 공식 릴리즈 된다고 하니 그때까지는 지켜보는게 좋겠다.

An intro to dep: How to manage your Golang project dependencies

https://medium.freecodecamp.org/an-intro-to-dep-how-to-manage-your-golang-project-dependencies-7b07d84e7ba5
2018-11-26
  • Golang 툴체인에 의존성 관리 기능이 내장됨
  • dep 도구는 Golang의 공식 의존성 관리 도구가 아님

Go Modules in 2019

https://blog.golang.org/modules2019
2018-12-19
  • 패키지 의존성 관리에 관한 커뮤니티 차원의 토론이 있었음. 향후 패키지 의존성 관리를 위해 module 개념을 도입할 것임. module 개념이 GOPATH 사용을 대치할 것임.
  • module 지원 계획
    • go 1.11 (2018년 8월 출시) ~ module 개념 시험 도입 (go.mod 파일 이용)
    • go 1.12 (2019년 2월 출시) ~ module 개념 지원 강화 (go run, go get 명령과 연계)
    • go 1.13 (2019년 8월 예정) ~ module 개념 디폴트 적용

결론

지금은 GOPATH 환경변수만 쓰고, module 개념은 8월가서 공부하기로 함.


Posted by ingeeC
,