두번째 이유
블로그를 Hugo로 개편한 뒤, 그동안 작성했던 노트들을 정리하면서 포스팅하고 있는데, 그 중 하나가 리눅스에 대한 글들이다. 사실 그 글들의 제목이, 약간은 윈도우나 osx 사용자들을 자극하는 것 또한 의도적이다. 업무용으로, 개인적으로, 최근 몇년동안 리눅스를 꽤 사용한 사용했고, 개인적으로 osx를 최근 10년 동안 사용해봤으며, 최초 컴퓨터를 접한 후 윈도우를 15년 동안 사용했다. 지나고 보니, 어떤 os도 완벽하지 못했고, 완벽하지 않으며, 완벽하지 못할 것이라는 생각이 든다.
그 중 왜 리눅스인가? 그것은, 거의 모든 것이 무료로 제공되는 os인 리눅스를 사용하면서, 그것을 제공하고 있는 커뮤니티에 뭔가를 돌려주고 싶다는, 약간의 부채의식 때문이다. 뭔가를 꽤 오랜 시간 좋아했고 도움도 많이 얻었다면, 그 제품을 사용하는 커뮤니터에 뭔가를 돌려주고 싶다. 개발로 참여하는 방법이 제일 좋겠지만, 일개 사용자로서 자신의 경험을 인터넷에 올려서 더 많은 사용자가 사용해 볼 수 있도록 경험을 공유하는 것도 그 중의 하나라고 생각된다. 놀라운 사용자 경험이, 지구 어느 편에서 열심히 공헌하고 있는 누군가의 손끝에서 만들어진다고 생각해보자. 그 누군가에게, 뭔가를 돌려주고 싶다는 생각, 그것이다.
Docker

두번째로 써보는 이번 글은 Docker에 대한 글이다. 구글링을 해보면, container와 VM의 차이를 알 수 있을 것이다. 일반 사용자 혹은 개발자 관점에서, docker를 어떻게 사용하고 있는지를 적어보려고 한다.
Dockerization
어떤 어플을 docker image로 만드는 것을 의미한다. 최종 사용자 관점으로만 보면, windows용 portable version 어플리케이션을 만드는 것과 많이 유사하다. 어플리케이션 설치나 사용시에, 요구되거나 생성되는 os에 대한 의존성을 최대한 줄임으로써, 설치과정을 단순화하거나, 유지보수를 단순화 할 수 있게 하기 위함이다.
사용할 os를 정하고, 거기에 설치 과정도 기술하고, 어떤 디렉토리를 마운트해서 어떤 용도로 사용할 지, 어떤 설정 파일을 필요로 할지, 어떤 포트를 개방해서 사용할 지 등등, 어플리케이션 설치, 실행과 운영에 필요한 모든 사항을 스크립트화 해서 docker image로 만든다. 즉, docker image를 만드는 과정 속에서, sw가 실행하는 환경에 대한 모든 것을 정의하게 된다. 일개 application이 아니라, 실행 환경 전체를 제공함으로써, 최종 사용자의 실행 환경과 동일한 환경을 가지고 개발도 진행할 수 있게 되어, sw의 안정적 deploy가 가능할 수 있게 되는 큰 잇점이 있다.
한 가지 예를 들어보면, GitLab이 있다. Community Edition의 경우, 직접 서버나 pc에 설치해서 사용할 수 있는데, Omnibus라는 방식으로 설치를 최대한 간소화하기는 했지만, 그럼에도 불구하고, 쉽지가 않다. 그래서인지, 몇 년 전부터, GitLab에서는 공식 docker image를 제공하기 시작했다. 그 docker image를 가지고 설치하면, docker와 docker-compose가 이미 설치되어 있다는 가정하에, 몇 분이면 자신만의 gitlab을 설치하고 운영하기 시작할 수 있다.
이제 다음의 docker-compose.yml을 살펴보자. docker와 docker-compose에 조금 익숙한 사람이라면, 무엇을 바꿔야 하고, 무엇을 내가 만들어둬야 하는 지, 별 다른 설명이 필요없을 정도라고 생각된다. 잘 모르는 경우는, 일단 그대로 실행해보고, 자신이 원하는 대로 동작하는 지 살펴본 후, 조금씩 고쳐가보면 된다. 실행한다고 하더라도, host pc에는 거의 영향이 없기 때문이다. 그저 디렉토리가 생성되어 있거나, docker container가 돌아가고 있거나 하는 것 뿐이므로, 그런 것들을 삭제하고, 똑같은 시도를 다시 하고, 다시 하고, 하고 싶은 만큼 반복해도 된다. 바로 이것이, docker image로 제공되는 어플리케이션의 강력한 장점이다. 원한다면, 서로 다른 설정(겹치는 설정이 없다고 가정)으로, 동시에 여러개를 띄울 수도 있으므로(pc의 성능이 받쳐준다면), 본격적인 설치/운영전에 테스트하는 데에도 최적이다.
# Please note that GitLab password must be >= 8 characters.
version: '2'
services:
gitlab:
image: 'gitlab/gitlab-ce:11.11.3-ce.0'
container_name: 'gitlab-ce'
restart: always
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://mygitlab.local:9080'
gitlab_rails['gitlab_shell_ssh_port'] = 9022
gitlab_rails['lfs_enabled'] = true
registry_external_url 'http://mygitlab.local:9005'
GITLAB_ROOT_PASSWORD: 'root_git'
GITLAB_TIMEZONE: 'Pacific/Auckland'
ports:
- '9080:9080'
- '9022:22'
- '9005:9005'
volumes:
- '~/gitlab-ce/config:/etc/gitlab'
- '~/gitlab-ce/logs:/var/log/gitlab'
- '~/gitlab-ce/data:/var/opt/gitlab'
만약 dockerized application으로 운영하는 중에, 백업하고 싶다고 가정하자. 위의 docker-compose.yml을 보면 딱 3가지 디렉토리가 지정되어 있다. 백업? 그냥 위의 설정파일과 함께 3개의 디렉토리만 복사해두면 끝이다.
이번에는 잘 운영하다가, 업그레이드를 해야 한다고 가정하자. 운영하고 있는 gitlab을 중단시킬 필요도 없다. docker-compose.yml을 기존에 운영하고 있는 설정과 겹치지 않게(디렉토리나 포트 등) 잘 수정하고, 기존에 운영중인 gitlab의 3개 디렉토리도 copy해서 volumes에 지정한 후, 원하는 새로운 버전으로 바꿔서 테스트해보면 된다.
Dockerized applications
개인적으로는 사용중인 dockerized application으로는 Caddy와 Commento가 있다. 업무용으로는, 고객사 서버에 vpn 접속하기 위한 커스텀 docker image(Cisco old/new, OpenVPN, PPTP, SSTP, F5 등 다수), Docker registry를 위한 GitLab server docker image, 이슈 분석 및 테스트를 쉽게 하기 위한 dockerized된 회사 sw의 docker 이미지, IntelliJ나 Maven 등 빌드 환경이 모두 담겨 있는 개발용 docker image를 만들어서 사용하고 있다.
Caddy
라이센스 문제(쇼핑몰 운영에 사용할 웹서버)를 피하기 위해 찾다가 dockerized된 Caddy 이미지를 찾아서 사용중이다. 오픈소스인 Caddy를, 소스를 가지고 빌드하기 때문에, Caddy 다운로드 페이지에서 제공되는 바이너리들의 라이센스 제약을 피할 수 있다. Docker image를 기반으로 운영하기 때문에, 필요시에는 서로 다른 환경 파일을 가지고, 여러 개의 Caddy 서버를 운영하는 것 또한 가능하다.
Commento
개발자가 제공하는 docker image가 있다. 블로그에 Comment를 운영하기 위해 찾은 녀석이다.
VPN 접속
업무의 40% 정도는 고객사 이슈를 분석하고, 해결하는 업무이다. 수백개 서버를 접속하려다 보니, 제공되는 windows vm에 접속해서, vpn sw를 설치하거나 실행하고, 접속 profile을 import하거나 생성해서 접속하고, putty로 다시 고객사 서버에 접속해야 한다. 그러다가 파일이라도 다운로드 하거나 업로드 하려면, Windows VM에 받은 후 다시 개인 업무 pc로 재전송해야 했다.
그러다가 docker를 알게 되었고, VPN 접속용 docker image를 만들기 시작했다. 많이 사용되는 Cisco VPN부터 시작해서, 리눅스에서 접속 가능한 여러 vpn들을 docker image안에 설치하고 설정한 후, command line에서 vpn open customer1하는 식으로, 고객사 이름만 지정하면 vpn 연결이 docker container안에서 이뤄지게 shell script를 만들어서 docker image와 함께 사용했다. 결국은 근무 중인 팀 내에서는 거의 공식 툴이 되었다.
GitLab server docker image
회사내에서 업무용으로 만들어진 Dockerized application을 제공하기 위해 Docker registry가 필요해서, GitLab CE docker image를 가지고, 개인 업무용 pc에서 충분히 테스트한 후, 제공받은 전용 서버에 바로 이전한 후 운영중이다.
회사 SW 테스트용 docker image
회사 업무를 위해 만든 docker image + shell script이다. 테스트 환경을 수동으로, 업무용 개인 pc에 구성하려면, 능숙한 사람도 몇 일이 걸리고, 경험이 없는 사람은, 몇일이 소요되기도 할 정도로, 복잡한 구성이 문제였다. 개인적으로는 꽤나 익숙했지만, 그럼에도 불구하고 매번 할 때마다 새로운 문제가 나와서, 항상 골머리를 썩고 있다가, docker image로 만들어 버렸다. 시간이 꽤나 소요되었지만, 이제는 대략 30분 이내로, 바로 테스트 가능한 환경을 만들 수 있게 되었다.
개발 환경용 docker image
최근에 시작한 프로젝트에는 IntelliJ를 사용중인데, 개인적으로 하는 업무 관련 dockerized application과 병행하다보니 여러 개의 IntelliJ를 사용해야 하게 되었다. 간단하게 IntelliJ를 설치하고, git, svn, maven과 여러 JDK 버전을 설치해두고, 스크립트로 불러서 사용할 수 있게 만들어서 사용중이다. 전혀 다른 환경의 여러개의 IntelliJ를 사용하거나, 프로젝트별로 따로 IntelliJ를 구성해서 필요시마다 불러서 쓰기 때문에 매우 효율적이다.
Docker 덕분에
VM이라면 불가능했을 많은 것들을 docker를 가지고 효율적으로 해낼 수 있었다. 물론, 이 정도 활용할 수 있기 까지에는 많은 시행착오 또한 있었다. 하지만, 그러한 시행착오가 Dockerfile에 고스란히 차곡차곡 담기게 되었다. 이후 내가 아닌 다른 사람이 사용할 때에는 내가 겪은 시행착오없이, 같은 사용환경을 그대로 가질 수 있게 됨으로써, 효율적인 업무에도 도움이 되었다. 개인적으로도, 회사 업무로도, docker를 native로 즐길 수 있는 리눅스는 정말 좋은 os라고 말할 수 있을 것이다.
WSL2에서 도커 돌리는 건 빨라서 꽤 좋아보이긴 하더라구요.
Hyper-V를 통해서 GPU pass through 가 가능해지면 딥러닝 쪽에선 쓸만 하긴 하겟습니다만..
docker가 어떤 개념인가요?
지저분한게 없고 문제가 생기면 그 이미지 베이스로 다시 구동만 하면 되니 항상 클린빌드를 손쉽게 만들고 관리할수 있는 장점이 있죠.
한글로 잘 설명한 글입니다.
만약 도커가 설치되어 있는 환경이었다면, `$ docker run -p 8086:8086 -v $PWD:/var/lib/influxdb influxdb` 라는 도커 키워드를 치는것만으로 influxdb 가 구동됩니다. (포트 8086 으로 연결되고, db위치는 현재 경로로 잡히구요)
그래서 도커를 사용한다면 설치라는 용어도 애매합니다. 사실 그냥 가져다가 쓰는거죠.
* 복잡한 설치 과정 없이, 필요할때 바로 띄워서 사용할 수 있습니다.
* (도커가 설치되어 있다면) 항상 어플리케이션이 동일하게 동작합니다.
* 가상화된 환경에서 실행되기 때문에 호스트 시스템에 영향을 주지 않습니다.
* VM과 다르게 성능 손실이 거의 없습니다.
도커만 사용하는건 약간의 편의성을 가져다 주는것이라고 생각할 수도 있지만, 도커의 핵심은 "프로그램 실행 표준 환경 제공"으로 인한 확장성입니다. 어떤 서버든 순식간에 내가 원하는 어플리케이션을 띄울 수 있고, 한번에 100대 200대의 서버라도 관리할 수 있게 되죠. 지금 IT 업계에서 필수가 되어버린 클라우드 서비스도 도커가 있기 때문에 성립 가능한거구요. 가상화/도커를 바탕으로 발전한 AWS와 같은 클라우드 인프라 환경, MSA 같은 아키텍처로 인해 엄청난 scale-out의 달성이 쉬워졌는데, 그렇게 보면 넷플릭스나 구글 같은 글로벌 서비스 업체가 잘 운용되고 있는것도 결국은 도커가 있었기 때문이라고 해도 과언이 아닐겁니다.
쉽게 말해서 한 프로그램을 여러개, 모두 완전히 독립적으로 실행할 수 있다는 거겠죠?여러 고객을 상대하는 비즈니스라거나 연구용 등등에서는 의미가 있겠군요.근데 이게 개인적으로 필요한가는... 글쎄요 좀 더 알아봐야 할 것 같군요
말씀하신 내용들이 역시 대부분 (다수 고객에게 서비스 제공하는) 비즈니스에서 의미가 있는것 같고저같은 개인에게는 크게 와닿는 부분이 아닌것 같아서요오히려 아래에 시놀로지 쓰시는 분들에게는 아주 좋은 솔루션임에 틀림없습니다. 도커가 없으면 저런 프로그램들을 사용하는게 불가능에 가까우니까요(저도 node-red를 저사양 synology에 깔아보려고 시도하다가 도커를 처음 알게 됐거든요)근데 말씀하신것중 성능손실의 거의 없다는건 약간 의문이네요예컨데 시놀로지 저사양기기들은 기본적으로 도커 실행이 불가능하구요.. 고사양 기기들도 메모리를 추가해야 원할하게 돌아간다고들 하던데요아마도 VM에 비해 성능이 낫다는 의미로 쓰신걸로 이해하겠습니다설치(혹은 실행)이 간단하고 시스템과 별도로 돌아가는건 확실히 개인한테도 장점일 것 같습니다
네, 개인컴 한대만 운용하는경우에는 효용성이 그렇게 크지 않은게 맞아요. 쓸줄 알면 편한데 굳이 배워서 까지 써야하나? 싶은 생각이 들기도 하죠. 근데 가끔 설치가 굉장히 힘든 프로그램들이 있는데(셋업하는데 반나절 이상 걸리는), 그런 경우 그냥 도커 간단하게 배워서 쓰는게 더 쉬울수도 있어요.
자원 손실이 있겠지만, VM보다는 훨씬 성능손실이 적다는 의미로 받아들이시면 될 듯 합니다. 제 개인 서버의 경우, 1 cpu core, 1gm ram으로도 docker container를 2개나 돌리고 있습니다. vm이라면 상상도 못할 사양입니다.
저처럼 고물컴을 이용하시는군요 반갑습니다
말씀하신 '머신 교체'가 흥미롭네요
제 경우 일단 x201에 저 프로그램들 셋업은 끝난 상황이고 한 2-3 주 돌려봤는데 별 무리 없어서 앞으로 쭉 갈 생각입니다. (보시다시피 IoT/홈오토 관련이라 24시간 작동합니다)
문제는 고물컴 수명이 있어서 쓰다가 죽기전에 교체를 해 주어야 하지 않나 싶은데 (아마도 현재 주력인 x230이 그 자리를 꿰차겠죠) 그때 말씀하신것처럼 도커를 사용하면 그 과정이 조금이나마 간단히 되려나요?
아니면 컴은 멀쩡해도 이런저런 이유로 OS를 업그레이드 해야하는 상황이라면 이때도 도커가 힘을 발휘할까요?
여러분들 말씀 듣고 도커를 한번 써 보고 싶기는 한데 제 상황에서 큰 잇점을 찾기 힘들군요
업그레이드, 서버 이전 혹은 백업 시가, 가장 docker가 필요할 때입니다. "사용 환경" 자체를 사용하기 때문에, 그저 교체/copy 하기만 하면 끝입니다. 그렇게 필요한 시점이 온 후에 docker를 쓸 껄 하고 느끼게 되면, 조금은 늦은 경우입니다. 처음부터 docker를 써야, 나중에 편해집니다.
당장 오늘저녁부터 공부해서 셋팅 들어가야겠네요
x201말고도 t61에 옥토프린트, t510에 motionEye가 각각 돌아가는 중이거든요 (고물대잔치 ㅎㅎ)
설명 자세히 해주신 여러분들 감사합니다!
일반 프로그램에 경우 대안이 가능한 또는 더욱 편히 사용할 수 있는 여러 오픈소스가 있는 반면 오피스와 카톡은 완벽한 대안이 없더군요.
업무상 두가지를 많이 사용해야 하는 관계로 현재는 맥을 쓰고 있습니다. wine, 앱가상화 최대한 윈도우를 안쓰는 방법으로 여러가지 시도해 보았는데 만족스럽지 못하네요. 많이 검색도 해보고 시도도 해보아 당연히 대안이 없을 것 같지만 혹시나 다른 방법으로 두가지를 사용하고 계실지 궁금하네요..
도커가 윈도우 베이스 이미지를 지원한다는건 금시초문이네요. 혹시 관련 링크 주신다면 저도 감사히 읽어보겠습니다.
https://psychoria.tistory.com/539?category=667804
http://www.itworld.co.kr/news/103275 등이요..
https://www.sysnet.pe.kr/2/0/11013 ← 요게 제가 예전에 봤던 아티클이네요..
리눅스 시스템에서 윈도우즈 이미지를 띄울 수 있다는 줄 알고 깜짝 놀랐네요. 찾아보니 윈도우즈 서버 2016 이후부터는 윈도우즈 도커 시스템에서 윈도우즈 이미지를 띄울 수 있게 지원했었군요! 많이 배우고 갑니다 :)
https://hub.docker.com/_/microsoft-windows-servercore?tab=description
도커가 컨테이너라이제이션의 가속화를 했다고는 하지만 더 중요한건 컨테이너 오케스트레이션이었습니다. 결국 도커는 싱글 머신 기준으로나 쓸만했지 프로덕션 환경에서 몇백개의 서버를 운영하는 입장에서는 그닥 쓸만하지 않았거든요 도커스웜 클러스터의 오버레이 네트워크는 성능저하도 매우 큽니다. 이를 극복하기 위해서 많은 노력들이 있었겠죠.
구글에서 오픈소스화한 kubernetes의 전신이라고 할 수 있는 구글 내부의 컨테이너 오케스트레이션 툴로도 프록덕션 래벨의 클러스터 운영이 가능했었습니다.이게 오픈소스화 되면서 이젠 프로덕션 컨테이너 오케스트레이션의 표준 처럼 되었구요.
아마존 역시 도커가 대중화 되기전부터 msa를 하고 잇었으며 aws는 특히 주로 vm기반의 서비스들을 하는데요 이 vm들도 결국 하이퍼바이저 위에서 바로 도는 것들이라 성능이 네이티브랑 거의 비슷합니다. 요즘엔 마이크로 vm의 개념으로 firecracker같은게 나왔는데 메모리 5mb 정도 밖에 안먹는 애들도 있네요.
그냥 여담으로 댓글을 달아보았습니다. 글 잘봤어요~
파이썬으로 이것 저것 모듈을 설치해서 놋북으로 돌렸을때 잘 돌아가서
이제 성능 빵빵한 데탑에서 돌려야지~ 하는데
안돌아갈때 그 빡침이란...
나중에 알고보니 무슨 시간 관련 모듈 버전이 달라서 ㅂㄷㅂㄷㅂㄷ
도커를 쓰면 그 모듈까지 전부 패키징 해서 하나로 만들어 준다고 하더라고요...
하지만 아직도 뭘 어케 해야 할지 몰라서 못쓰고 있습니다 ㅋㅋㅋ
#-----------------------------------------------------------------------------# Base image#-----------------------------------------------------------------------------FROM ubuntu:16.04
#-----------------------------------------------------------------------------# Declare non-interactive mode in building applications#-----------------------------------------------------------------------------ARG DEBIAN_FRONTEND=noninteractiveARG PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig/
#-----------------------------------------------------------------------------# Setup root account#-----------------------------------------------------------------------------USER rootWORKDIR /root# - Set passwordRUN echo "root:root" | chpasswd# - Disable bash history-substitutionRUN echo "set +H" >> /root/.bashrc# - Setup ssh configurations for root userRUN mkdir -p /root/.sshRUN printf "Host *\nStrictHostKeyChecking no\nUserKnownHostsFile=/dev/null\nServerAliveInterval=600\nServerAliveCountMax=5" >> /root/.ssh/config# - Directory for installation filesRUN mkdir ./applications#----------------------------------------------------------------------------# Update apt repository#-----------------------------------------------------------------------------RUN apt-get update#----------------------------------------------------------------------------# System environment configurations#-----------------------------------------------------------------------------# - Install localeRUN apt-get install -y locales# - Set locale and languageRUN locale-gen en_NZ.UTF-8ENV LANG=en_NZ.UTF-8RUN echo "LANG=en_NZ.UTF-8" >> /etc/default/locale# - Set user and shellENV USER rootENV SHELL /bin/bash#-----------------------------------------------------------------------------# Install applications#-----------------------------------------------------------------------------# - openssh serverRUN apt-get install -y --fix-missing \openssh-server# SSH server configurationRUN mkdir /var/run/sshd && \sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \sed -i 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' /etc/pam.d/sshd && \echo "export VISIBLE=now" >> /etc/profileENV NOTVISIBLE "in users profile"# Install dumb-init to be used as a root process for Docker containerCOPY applications/dumb-init_1.2.1_amd64.deb /root/applications/RUN dpkg -i /root/applications/dumb-init_1.2.1_amd64.deb# Remove apt cacheRUN apt-get clean autoclean && apt-get autoremove -y && rm -rf /var/lib/{apt,dpkg,cache,log}/#-----------------------------------------------------------------------------# Setup entry point to dumb-init which will be PID 1#-----------------------------------------------------------------------------ENTRYPOINT ["/usr/bin/dumb-init", "--"]#-----------------------------------------------------------------------------# Starts up sshd server#-----------------------------------------------------------------------------CMD ["/usr/sbin/sshd", "-D"]
와..상세한 설명 감사합니다!!!
나중에 꼭 한번 해보겠습니다 +_+