Windows 10에 Docker를 설치하는 잘 알려진 방법은 "Docker Desktop"을 설치하는 것입니다. 이 방법이 현재 가장 권장하는 방법입니다.
이 방법의 제약은 Windows 10 Professional 이상에 설치 가능하고 Windows 10 Home에는 설치가 안 된다는 점입니다. 레지스트리를 수정하면 할 수는 있는데, 굳이 그렇게까지. 개인적으로 이 방법을 꺼리는데, 설치 패키지 파일 크기가 약 900MB이고 뭔지 모를 파일이 참 많이 생기기 때문입니다.

그래서, Docker를 수동으로 설치하는 방법을 소개합니다. 가장 큰 장점은 Windows 10 Home에도 설치할 수 있다는 점이고, 약간의 장점은 약 100MB 저장공간만 사용한다는 점입니다. 단점은, 이 방식은 Hyper-V와 LCOW(Linux Container on Windows 10)를 이용하여 실행되는데, 이 실행 방식은 컨테이너를 종료할 때(만) 약간 불안정한 느낌이 있다는 겁니다. 하지만 다른 실행 방식도 불안정하긴 마찬가지인 것 같습니다. 아직 Docker for Windows 10은 어느 실행 방식이든, 개발용으로 이용하는게 맞고 안정적인 서비스를 위해 이용하기엔 이릅니다. Hyper-V와 LCOW를 이용하는 실행 방식은 장점도 있습니다. 그건 맨 아래에.

순서는 아래와 같습니다.
1. Windows 10 Home에 Hyper-V와 Containers feature 활성화
2. Docker, lcow 파일 다운로드 및 복사
3. config 파일 준비 및 실행

아래 2가지 설치 명령을 이용합니다. CMD를 관리자 권한으로 실행한 후에 설치 명령을 이용해야합니다.

Windows 10에 Hyper-V feature 설치 (InstallHyperV.bat)

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
pause

Windows 10에 Containers feature 설치 (InstallContainers.bat)

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*containers*.mum >containers.txt
for /f %%i in ('findstr /i . containers.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del containers.txt
dism /online /enable-feature /featurename:Containers -All /LimitAccess /ALL
pause

설치 후 윈도우즈 설정에서 아래 그림과 같이 Hyper-V와 Containers를 활성화된 상태로 둡니다.

windows10_features_containers.pngDocker 최신 개발 버전을 이용합니다. 안정 버전도 좋습니다만, 안정 버전이 별 의미는 없는 것 같습니다.

Docker for Windows 다운로드

아래 파일을 다운로드 받습니다. 묶음을 풀면 안에 docker 디렉토리가 있습니다. 이 디렉토리를 C:\Program files 디렉토리 아래에 둡니다. C:\Program files\docker\dockerd.exe 가 있는지 확인합니다.

https://master.dockerproject.org/windows/x86_64/docker.zip

위 파일 대신 다른 버전의 파일을 이용해도 됩니다.

https://download.docker.com/components/engine/windows-server/19.03/docker-19.03.5.zip

https://download.docker.com/win/static/stable/x86_64/docker-17.09.0-ce.zip

LCOW (kernel, initrd.img) 다운로드

아래 웹 페이지에 방문하여 release.zip 파일을 다운로드 받습니다. 묶음을 풀면 안에 kernel, initrd.img 파일이 있습니다. C:\Program Files\Linux Containers 디렉토리를 만들고 두 파일을 디렉토리 아래에 둡니다. C:\Program Files\Linux Containers\initrd.img 가 있는지 확인합니다.

https://github.com/linuxkit/lcow/releases

dockerd.exe 실행

CMD를 관리자 권한으로 실행한 후에 아래 명령을 이용합니다. UNIX 환경에서 Docker를 실행할 때 /var/lib/docker 에 다양한 파일을 생성하게 됩니다. --data-root는 이 디렉토리를 설정할 때 씁니다. 저는 C:\Program Files\Docker\var-lib-docker 디렉토리로 설정했습니다. 기본값은 C:\ProgramData\Docker 입니다. Docker를 이용하다보면 이 디렉토리에 크고 많은 파일을 두기 때문에 저장공간을 많이 차지 하게 됩니다. --experimental 옵션이 꼭 필요합니다.

set LCOW_SUPPORTED=1
"C:\Program Files\docker\dockerd.exe" -D --data-root "C:\Program Files\docker\var-lib-docker" --experimental

docker.exe 실행

CMD를 관리자 권한으로 실행한 후에 아래 명령을 이용합니다. 출력 내용 중에 Default Isolation: hyperv 가 있는지 확인합니다.

C:\Program Files\docker\docker.exe info

잘 실행되는 것을 확인했으면 dockerd를 종료합니다.

Config file 생성

매번 command line 옵션을 지정하는 건 번거로우니 config 파일을 만듭니다. dockerd를 이렇게 실행하게 됩니다.

"C:\Program Files\Docker\dockerd.exe" --config-file "C:\Program Files\docker\daemon.json"

daemon.json 파일의 내용은 아래와 같습니다.

{
"data-root": "C:\\Program Files\\docker\\var-lib-docker",
"experimental": true,
"debug": false,
"log-level": "fatal"
}

docker pull

이제 원하는 Docker image를 받아 이용합니다. 예를 들면,

C:\> docker pull fedora:32
C:\> docker run -i -t --name fedora32 -p 22:22 -p 80:80 -p 443:443 -p 3000-3009:3000-3009 -p 5900:5900 -p 5901:5901 -v C:\data:/data fedora:32

저는 Fedora를 권장합니다. 위 명령은 22, 80, 443, 3000~3009번 포트를 도커 컨테이너에게 열어줍니다. 저는 Perl 과 Dancer2 를 이용해 웹 사이트를 만들 거라 80, 443, 3000~30009번 포트를 열었습니다. ssh 접속도 할거라 22번 포트를, X Window System과 VNC를 이용할 거라 5900, 5901번 포트를 열었습니다. 윈도우즈와 파일도 주고 받을 거라 C:\data 를 /data 로 마운트 하였습니다.

docker_windows10_20200503.png이 스크린샷은, 컨테이너 안의 GNU/Linux에서 Perl로 그래프를 만들어 /data 디렉토리에 넣은 것을, 호스트인 윈도우즈의 C:\data 디렉토리에서 확인하고 열어본 화면입니다.

sudo 오류 메시지

컨테이너 안에 게스트 운영체제로 GNU/Linux를 쓰다가 sudo 실행 시 오류를 본다면 아래와 같이 설정을 합니다. 무시해도 됩니다.

echo "Set disable_coredump false" >> /etc/sudo.conf

Hyper-V(그리고 LCOW)를 이용하는 실행 방식의 장점

게스트 운영체제로 Windows 10을 사용하는 컨테이너와 Linux를 사용하는 컨테이너를 동시에 만들고 실행할 수 있습니다.

Job to Be Done, Hire, Fire

1950년대, 병원에 전기가 끊기고 심장박동기를 사용 중이던 신생아 환자가 사망.
이에 배터리를 이용하는 심장박동기 상품을 내놓은 메드트로닉.

인도는 심장 질환으로 인한 사망율이 높은 편. 인도에서 메드트로닉의 활동을 보면.

사람들이 제품을 왜 채용하지 않는가? "환자의 의식 부족, 적절한 처방 부족, 금전 부족 등"
대부분의 환자는 일반의를 만나는데 일반의는 하루에 많은 환자를 짧은 시간만 만나기 때문에 심장박동기를 권할 수 없음. 환자는 심장에 대해 잘 알지 못하며 의사의 짧은 평가를 바탕으로 심장박동기 수술을 선택하기는 부담. 그래서 메드트로닉은 심장검진클리닉을 인도 전역에 설치.
환자는 수술 비용 뿐 아니라 관리 비용도 부담. 인도인들은 이런 비용을 가족과 친지들로부터 돈을 모아 해결. 그래서 메드트로닉은 브릿지론(bridge loan, 필요한 자금이 모이는데 시간이 걸릴 것을 보완하기 위한 단기 대출 상품)을 제공. 이 대출을 상담하는 사람들이 셰르파(Sherpa). 메드트로닉은 셰르파가 대출 상담만 하는 것이 아니라 상품에 대한 고객(환자)의 의견을 밀접하게 수렴하도록 함. 이는 생산과 판매에 피드백.

인도의 "만인을 위한 건강한 심장"이라는 메드트로닉의 설계.


리모트몬스터의 실시간동영상전송기술, 방송플랫폼, 통화플랫폼 상품을 잠재적인 고객에게 잘 전달하려면.
더 많은 고객이 상품에 대해 알아야하고. 사람들이 쉽게 체험하게 되는. 예를 들면, 인터넷속도측정 페이지에 영상통화, 실시간방송 항목을 넣는다.
우리의 상품을 고객에게 전달하는 파트너들(메드트로닉에게 의사가 있듯) SI업체들이 고객을 설득하는 것을 짧게 하고. 우리가 반 이상 영업을 해서 넘겨주거나, 반 이상 제품을 만들어서 넘겨주거나. 몇 가지 케이스에 대해 프로토타입을 만들고 UI만 바꿔서 사용할 수 있게.

비용은 현재는 저렴하지만 또는 이용 초기엔 저렴하지만, 지속적으로 이용할 수 있도록 제도를 제공.
메드트로닉에게 심장검진클리닉 운영 비용은 큰 마케팅 비용을 필요로 하고, 더불어 제품의 가격도 올리겠지만. 더 많은 고객을 구하고, 잠재적인 고객과의 접촉을 만들어 낼 것. 물론 제품의 품질이 충분하다는 전제.
공동 사업의 개념으로 수익이 나면 배분하거나, 우리가 원하는 광고를 넣어주면 가격을 낮추어주거나.

인공지능과 WebRTC

이런 주제에 대해 글을 써봐야겠다.

AI in WebRTC
- speech analytics
- Call center agent monitoring
- Transcription
- Translation
- Agent coaching
- Customer engagement
ㄴ Traditional speach analytics
- CallMiner : pretty expensive, available to very large call
- New speach Analytics : most cloud service providers

- voice bots / assistant
- IVR replacement
- Starting meetings
- In-call assistance
ㄴ RTC-Bot Gateway, Wake Word Detector
- computer vision
- Funny hats
- Face detection
- Gestures
- Object detection
- Emotion analysis
ㄴ Object detection over WebRTC with TensorFlow
https://webrtchacks.com/webrtc-cv-tensorflow
ㄴ ML processing moving to the edge, with faster, local processing
https://webrtchacks.com/aiy-vision-kit-uv4l-web-server/
- WebRTC optimization
- Noise suppression
ㄴ Mozilla RNNoise
https://people.xiph.org/~jm/demo/rnnoise
- Echo cancellation
- Error correction
- Route optimization

getaddrinfo EAI_AGAIN

If you see these words "getaddrinfo", "EAI_AGAIN"

npm ERR! code EAI_AGAIN
npm ERR! errno EAI_AGAIN
npm ERR! request to https://registry.npmjs.org/@fnproject%2ffdk failed, reason: getaddrinfo EAI_AGAIN registry.npmjs.org registry.npmjs.org:443

You have to check /etc/hosts. "127.0.0.1 localhost" must be last, other "127.0.0.1" must be first.

Not good,

127.0.0.1  localhost
127.0.1.1  imyaman.youre.space  imyaman

Good,

127.0.1.1  imyaman.youre.space  imyaman
127.0.0.1  localhost

oracle cloud, apache fn, node

perl 빠르다

로그 요약해서 각 단계별 주요 로그만 거르고, 이걸 한 행에 세션아이디와 각 단계별 완료 시각으로만 요약하는 스크립트를 만드는데.
요즘 JavaScript 학습 하시는 내무부장관님께서
지나가는 말로 "nested 로 작성하지 말라던데..." _흠칫_

perl 코드이니 알아보지는 못 하시겠지만, 혹시라도 내 코드를 보여드리진 말아야겠다는 생각이 들었습니다.
ㄷㄷㄷㄷ

그리고 스킬이 부족한 탓에, 150MB짜리 텍스트 파일 한 줄씩 읽어다가 통째로 메모리에, 그것도 해시에 넣고 정리하는데, 30분 걸릴 줄 생각했는데 몇 분도 안 걸려서 깜짝 놀랐습니다.
시간이 흘러도 컴퓨팅 파워에 대한 제 기준은 CPU AMD K6 300 & MEM 128MB, 20년 전 제 첫 컴퓨터.
지금 내 노트북 CPU는 Celeron N4100.


아무튼... perl이 빠르다는 이야기입니다.

DevOps 관련 무료 책 모음

https://github.com/jidibinlin/Free-DevOps-Books-1

DevOps 관련 무료 책 모음입니다.

여기 있는 책 중에, DevOps: A Software Architect's Perspective 보고 있습니다. 아래 두 가지 눈에 띄네요.
4.2 Overall Archtecture Structure 에서...
컴포넌트를 프로덕션에 넣는 시간을 단축하기 위해 아래와 같은 요구사항이 있음.
* Deploy에 다른 팀과의 명시적인 coordination이 필요하지 않음
* 한 서비스의 다른 버전이 프로덕션에 함께 존재 가능
* 에러 발생 시 롤백할 수 있음
마이크로서비스 아키텍처가 이런 요구사항을 만족시킴
4.1 Do DevOps Practices Require Archtectural Change? 에서...
Treat Ops as first-class citizens from the point of view requirements. ... In particular, the Ops requirements are likely to be in the area of logging, monitoring, and information to support incident handling.

타짜 정 마담의 일기

영화 "타짜"를 정 마담 관점에서 보면 참 재미있습니다.
정 마담은 도박장을 운영하고, 호구를 벗겨먹을 공사를 설계하지요.

====
요즘 별 두 개로 전역한 호구에게 작업 중이다, 오 장군이라고. 선수가 필요해서 평 경장에게 연락을 했다. 논산에서 평 경장이 온다고 한다. 나 있는 곳은 부산.

====
평 경장이 왔다. 곤이라는 젊은 선수도 데려왔다. 평 경장이 조연, 곤이가 주연이란다. 곤이는 탈이 좋다.
평 경장과 곤이가 돌아가고, 곤이가 혼자 찾아왔다.

====
공들였던 오 장군 벗겨먹었다. 곤이가 과감한 플레이로 시원하게 벗겨먹었다. 곤이는 과감하면서도 티가 안 난다. 탈이 좋다. '이 남자 갖고 싶다'라고 생각했다.
오 장군이 총을 걸었을 때 평 경장이 죽으라고 신호를 보냈지만 곤이가 받은 것, 오 장군이 애들 불러놨던 것, 빨찌산이 오 장군 목에 칼 들이대고 우리가 빠져나온 것 때문에 평 경장이 기분 나빴나보다. 평 경장에게 뺨을 맞았다. 곤이에게 가지 말고 남으라고 했는데 평 경장이 데리고 갔다. 빨찌산에게 평 경장을 죽이라고 했다.
평 경장은 기차 타고 가고 곤이가 혼자 찾아왔다. 곤이는 내꺼다.

====
곤이랑 잘 해먹고 있는데 날벼락이 떨어졌다.
경찰에서 곤이에게 전화를 했다. 평 경장이 죽었다고 시신 확인하라고. 시신을 확인하고 온 곤이가 발광을 한다, 아귀 찾아오라고.
"길바닥 인생" 평 경장이 없으면 곤이가 딴 데 안 가고 나에게만 있을 줄 알았는데. 곤이는 이 바닥 사람들과 다르다. 의리가 있다. 이 남자 내가 가질 수 없는 건가.
곤이가 아귀를 만나면 안 되는데. 뭔가 꼬였다. 일단 아귀 찾는 척은 해야겠다. 내일 너구리 오면 돈 몇 천 주고 찾아오라고 시켜서 고니 안심시켜 놔야지.
내일은 곤이 시켜서 고광렬이 잡아야겠다. 요 며칠 살 많이 찌워놨으니.

====
오늘은 구치소에서 일기를 쓴다.
아침에 너구리 보고, 오후에 출근했는데 짭새들이 왔다.
김씨한테 항의했는데, 신고가 들어왔다고 자기도 어쩔 수 없다고 며칠만 들어갔다 나오라고. 씹새끼. 그 동안 해준게 얼만데. 비리경찰 새끼. 지랄하고 있네.
곤이는 잘 도망친 것 같다. 그나마 다행이다.

====
구치소를 나왔다. 다음 벗겨먹을 호구 찾았다. 선수가 마땅치 않다. 곤이를 찾아야되는데.

====
대마이기사가 와서 봤는데 탈이 안 좋았다. 쓸만한 애가 없다.
곤이는 서울에 있다고 한다. 박무석이 찾아다닌다고. 데려와야겠다.

====
곤이가 곽철용이랑 한 판 붙었다는 소리를 들었다. 그 길로 서울 가서 곤이를 만났다. 너구리가 곤이에게 박무석을 찾아줬단다. 너구리는 대가리에 뇌가 아니러 마요네즈가 들어있나보다. 곤이한테 연락을 받았으면 나한테 먼저 알려줘야지, 내 선수인데. 게다가 박무석이 찾아달란다고 낼름 알려주냐. 속이 답답하다 못해 터질 것 같다.
곤이가 지갑이 뚱뚱하다고 일 안 한다고 했다. 곤이 여자친구라는게 싸가지가 바가지다. 고광렬이 곤이랑 있었다. 그 날 하루 봤을 건데 어떻게 함께 있지?
너구리한테 곤이 차 쌔벼 오라고 했다. 곤이는 차에 돈을 보관하니까 차가 없어지면 찾아오겠지.

====
호구 쪽은 공사가 잘 진행되고 있다. 호구 빚을 많이 늘려놨다. 며칠 있다 털어야겠다.

====
고광렬이 찾아왔다. 곤이랑 고광렬이 박무석을 섭외해서 곽철용이 뒤통수를 쳤나보다, 그리고 곽철용이가 눈치를 챘나보다. 곽철용이 애들 풀어서 여자애들 잡아가고, 고광렬만 달아났단다. 고광렬은 의리가 없다. 곤이는 어디있는지 모르겠다. 곽철용이 가만 둘리가 없는데.
호구 쪽 공사에 선수로 고광렬을 써야겠다. 그럭저럭 쓸만하니까.

====
아귀가 찾아왔다. 재수없는 새끼.
곤이가 곽철용이를 죽였다고 잡겠단다. 미친 새끼.
곤이는 포기해야겠다. 돈만 챙겨야지.
호구한테 공 들인거 챙기고 안전하게 나가기만 해야겠다. 아귀하고 곤이 둘이 해결하게 나는 판만 깔아주고.
시나리오는 이렇다. 내일 호구 거덜내는 판을 만든다. 고광렬이는 내 선수. 아귀는 호구의 선수. 호구는 아귀가 자기 도와주러 온 줄로 생각하게 하고. 아귀가 고광렬이를 잡을 거다. 고광렬은 버리는 카드. 고광렬이 위험하다는 걸 미끼로 곤이를 판에 앉힌다. 곤이도 버리는 카드. 곤이에게는 아귀가 내 공사를 망치려 한다고, 고광렬도 아귀가 그랬다고, 아귀를 적으로 보게 한다. 아귀가 이기든 곤이가 이기든 나는 돈만 챙긴다.

====
다시 구치소다.
어제 곤이가 이겼다. 곤이는 도박 속에서 도박을 하는 사람.
고광렬도 아귀도 손모가지가 날아갔다.
나는 돈이 날아갔다. 평 경장을 내가 그런 걸 곤이가 알게됐다.
낮에 시체를 확인하러 갔다. 곤이인지 확인해달래서 깜짝 놀랐는데, 내 총에 맞아서 얼마 못 가 죽었나 하고 생각했는데. 시체를 보니 곤이가 아니고 용해였다. 아귀 따라온 곽철용이 똘마니. 경찰에게는 곤이 시체가 맞다고 했다.
평 경장도, 곽철용도, 고광렬도, 아귀도, 용해도 어쩌면 모두 나 때문에 피를 본 것 같다.
곤이는 어디로 갔을까. 곤이가 진짜 이겼다.

윈도우즈 GIMP의 UI에서 한글

윈도우즈에 GIMP를 설치했습니다. GIMP의 UI에서 한글이 정상적으로 표시되지 않네요. GTK 한글 설정 때문인듯. 아래 파일 맨 아래에 설정을 추가했습니다.

C:\Users\gwak\AppData\Local\Programs\GIMP 2\share\themes\MS-Windows\gtk-2.0\gtkrc

gtk-font-name = "Gulim 8.5"