Wednesday, June 18, 2014

당신은 ‘이효리 블로그’를 통해 무엇을 보고 있나요

source:  http://tvdaily.asiae.co.kr/read.php3?aid=1402900434715701004
당신은 ‘이효리 블로그’를 통해 무엇을 보고 있나요
2014. 06.16(월) 15:33

티브이데일리 포토
[티브이데일리 윤지혜 칼럼] 꿈도 이상도 현실 앞에선 뜬 구름에 지나지 않는 걸까. 남들만큼 쓰며 살고 싶어, 이런저런 공부 실컷 해서 겨우 직장에 들어간다 해도, 남들만큼 사는 게 쉽지 않다. 남들도 나만큼 힘들게 벌어 안 힘든 척 쓰고 있는 거니까.

점점 거대해지는 도시의 욕망과 그에 맞춰 날로 커지고 집요해지는 비교의식에, 도시인들은 매일 저녁 속이 쓰리고 배가 아프다. 각양각색의 SNS에서는 다채로운 색감을 지닌 ‘남들’의 삶이 쏟아져 내리는데 별 거 없는 내 삶은 그저 무채색이다. 명랑시트콤 드라마처럼 흥미롭게 편집된 하나의 영상이란 생각은 하지 못한 채, 내 것만 비루하다며 눈물만 지을 뿐이다.

오래 전부터 이효리의 일거수일투족은 사람들의 뜨거운 관심거리였다. ‘톱스타’이니까. 거침없을 정도로 솔직하고 자신의 모습에 당당한, 누구와 맞서도 절대 우위에 있을 것 같은 ‘이효리’는 모든 스타들이 그렇듯 현대인의 반짝반짝 빛나는 우상이었고 ‘신기루’였다.

현재 그는 붉은 레드카펫 위, 온갖 화려한 색채로 둘러싸인 연예계가 아닌, 소박한 색감이 머무는 제주도 신혼집에 있다. 그리고 얼마 전 그 소박한 삶을 담은 블로그를 열었다.

사람들은 즉시 모여들어 여러 가지 반응을 보이고 있지만, 하나의 감정으로 압축할 수 있다. 이 또한 ‘부럽다’는 것이다. 흡사 집시의 삶처럼 자유로워 보이는 그의 것은, 팍팍한 삶에 짓눌려 있던 사람들에겐 한 밤에 듣는 감성 돋는 라디오였다. 이전엔 화려함 이었다면 이제는 소박함과 자유로움을 덧입은 ‘신기루’와 같은 감성.

‘부럽다’는 말은 비교의식에서 시작된다. 내 삶은 왜 저렇지 못할까, 여기엔 없는행복이 왜 다른 곳엔 존재하는 걸까. 우리가 ‘부럽다’고 하는 ‘남들’의 삶엔 별 다른 거라도 있는 걸까. 하지만 함정이 있다. 사실, 저들의 삶이라고 별 게 있는 건 또 아니다. 우리가 보기에 아무리 이상적인 삶일지라도 그 삶조차 현실에 뿌리내리고 있기 때문이다.

이효리는 자신의 블로그에 ‘모순’이라는 제목의 흥미로운 글을 올렸다. “소박하지만 부유하고 부유하지만 다를 것도 없네요.” 순식간에 많은 이들의 시선이 쏠렸고 솔직담백하단 평가가 이어지며 호평을 얻었다.

솔직하다니. 마치 안도의 숨을 쏟아내듯 뱉어내는 솔직하단 말이 참 이상했다. 자신을 드러내고 소통하기 위해 만든 블로그인데, 당연한 거 아닌가. 사람들은 이효리의 블로그를 통해 무엇을 보고 있었던 걸까. 갖지 못한 또 다른 삶의 환상일까 혹은 부족하게만 느껴지는 내 삶의 어두운 그림자일까.

새롭게 등장한 소통의 통로인 SNS 속에서, 우린 종종 실체가 아닌 ‘신기루’를 공유한다. 잘 포장된 삶의 모습을 보여주며 부러움을 얻고 부러움을 내뱉는다. 문제는, 그 속에서 정작 진짜 오아시스를 찾아낼 힘은 잃어가고 있다는 점이다.

‘신기루’나 ‘환상’ 속으로 도망칠수록, 현실은 더욱 각박하고 삭막하게 느껴질 것이며 꿈이나 이상은 더욱 뜬구름 같아질 것이다. 비루한 삶에 불만은 쌓이지만 맞부딪혀 극복할 힘은 또 없을 것이다. 실체가 아닌 것을 접하다 보니 현실 속에 존재하는 자신의 삶을 제대로 바라보고 이끌어갈 힘을 잃고 만 것이다.

소통의 통로는 늘어났지만 아이러니하게도 삶과 삶이 맞부딪히는 진짜 ‘소통’은 부재한 세상이다. 줄 세우는 데 여념이 없는 사회는 서로를 경쟁상대로, 비교상대로 만들며, 진짜 ‘소통’을 부재하게 했다. 그래도 함께 살아야 하는 것이 사람인지라 소통의 통로는 계속 개발되고 있으나, 원체 모조품이다 보니 그 통로를 통해 공유되는 삶도 ‘신기루’에 불과할 때가 많다.

SNS를 부정하지는 않는다. SNS를 통해 자신의 생각을 나누는 이들도 부정하진 않는다. 생각을 좀 더 많은 사람들과 나누는 데엔 SNS나 블로그만한 게 없으며, 자신의 능력을 좀 더 자유롭게 펼치는 통로가 되어주기도 하니까.

이효리의 ‘모순’이란 글에 반응하는 사람들을 보며 한 가지 염려가 고갤 들었을 뿐이다. 진짜 ‘모순’은 다른 이의 ‘신기루’일지도 모를 삶을 실체인 것처럼 여기며 부러워하면서도 정작 자신의 삶에 마련된 진짜 ‘오아시스’를 찾으려 노력하진 않는 우리의 모습이 아닐까.

[티브이데일리 윤지혜 칼럼니스트 news@tvdaily.co.kr / 사진=이효리블로그]

Saturday, June 14, 2014

구글, 동영상 UCC 시장마저 천하통일 노리나?

source: http://it.donga.com/18373/


구글, 동영상 UCC 시장마저 천하통일 노리나?

강일용

인터넷 검색과 광고 시장에서 가장 큰 영향력을 행사하는 구글이 이제 동영상 UCC(User Created Contents, 사용자가 직접 제작한 콘텐츠)마저 천하통일을 하려 하고 있다. 지난 5월 18일(현지시각), 버라이어티, 월스트리트저널, 더버지 등 외신들이 일제히 유튜브(구글)가 트위치TV를 10억 달러(약 1조 200억 원)에 인수하려고 협상에 들어갔다고 보도했다. 처음엔 단순 인수소식만 흘러나왔지만, 시간이 지나자 보다 구체적인 정보가 들려왔다. 트위치TV가 자사를 인수해줄 회사를 찾기 시작했고, 여기에 마이크로소프트(MS)가 관심을 보냈지만 결국 최종협상자로 구글을 선택했다는 소식이다. 트위치TV가 대체 뭐하는 회사이기에 쟁쟁한 IT 기업이 눈독을 들이는 걸까.
트위치TV

트위치TV는 어떤 회사인가요?

트위치TV는 지난 2011년부터 서비스를 시작한 인터넷 개인방송국이다. 한달 평균 방문자수(UV)는 약 4,500만 명으로, 명실상부한 세계 최대의 인터넷 개인방송국이다. 인터넷 개인방송국이란 개인이 캠 카메라, 캡처보드 등 각종 영상 장비를 이용해 게임을 즐기는 모습이나 일상 생활의 소소한 장면 등을 타인에게 '실시간으로 방송하는(생방송)' 플랫폼을 말한다. 이 점에서 미리 촬영해놓은 동영상을 '다시 틀어주는(재방송)' 유튜브와 구별된다. 인터넷 방송국은 세계적으론 트위치TV와 유스트림이, 국내에선 아프리카TV(Afreeca TV)가 가장 유명하다.
트위치TV
트위치TV는 다른 인터넷 개인방송국과 다른 점이 세 가지 존재한다. 첫째는 '게임 전용' 방송국이란 점이다. 트위치TV는 오직 게임 관련 콘텐츠만 방송할 수 있다. 게임 화면이어도 좋고, 게임을 즐기는 모습이어도 된다. E스포츠 경기 장면과 선수 인터뷰도 가능하다. 모두 게임 관련 콘텐츠이기 때문. 하지만 개인의 일상을 방송하거나, 음식을 먹으며 시청자와 잡담을 나누는 이른바 '먹방'은 할 수 없다. 게임 이외에 다른 동영상 콘텐츠를 틀어주는 것도 불가능하다. 이유는 간단하다. 창립 당시부터 오직 게임만을 다루기로 결정하고 시작했기 때문이다.
트위치TV는 지난 2011년 인터넷 개인방송국 저스틴TV의 설립자 저스틴 칸과 그의 예일대학교 동창 에밋 시어가 설립한 조인트 벤처(합자회사)다. 다양한 분야를 다루는 저스틴TV와 달리 트위치TV는 오직 게임 분야만 다루기로 결정하고 시작했다. 저스틴 칸이 일선에서 물러나고 에밋 시어가 최고경영자로서 회사를 이끌어나가는 지금도 이 기조는 변하지 않았다.
가장 인기있는 콘텐츠는 뭘까. 우리나라 게이머에게도 친숙한 리그오브레전드(LOL), 하스스톤: 워크래프트의 영웅들, 마인크래프트 등이다. 스트리트파이터4, 콜오브듀티, 마리오카트 등도 상당한 인기를 끌고 있다. 사람과 사람이 겨뤄 스포츠 경기 못지 않게 흥미진진하고 드라마틱한 상황이 연출되는 게임을 선호하는 경향이 짙다(마인크래프트 제외). 다시 말해 프로게이머로 활동하기 좋은 게임을 선호한단 얘기다. 초창기에는 방송이 상대적으로 쉬운 PC 게임이 선호받았지만, 비디오 게임기인 플레이스테이션4와 엑스박스 원에 '트위치TV로 방송하기' 기능이 추가되면서 비디오 게임에 대한 흥미도 나날이 높아지는 추세다.
트위치TV
다른 인터넷 개인방송국과 차별점, 둘째는 '관객이 참여할 수 있는 플랫폼'이란 점이다. 다른 인터넷 개인방송국도 관객들이 방송을 보면서 대화를 나누는 기능 정도는 지원한다. 트위치TV는 여기서 더 나아가 사용자들이 채팅을 통해 실시간 방송에 직접 개입할 수 있다. 시작은 '트위치TV 플레이 포켓몬'이다. 트위치TV 플레이 포켓몬은 사용자가 채팅으로 '어디로 움직여서 어떻게 행동하라'는 명령을 내리면 게임 내 캐릭터가 사용자의 명령에 맞춰 움직이는 프로젝트다. 대상으로 선정된 게임은 북미에서 유명한 포켓몬이다. 수백~수천 명이 명령을 내리고, 이에 개임 내 캐릭터가 반응하는 것을 감상하면서 사용자는 독특한 재미를 느낄 수 있다. 현재 시즌6이 진행 중이다. 또한 포켓몬뿐만 아니라 다양한 인디게임을 같은 형태로 방송하고 있고, 이것이 여전히 큰 인기를 끌고 있다.
사실 트위치TV 플레이 포켓몬은 트위치TV에서 직접 진행하는 프로젝트는 아니다. 사용자가 트위치TV의 플랫폼을 이용해 자발적으로 진행한 프로젝트다(추후 후원을 하면서 트위치TV가 직접 지원하는 프로젝트로 변하긴 했다). 트위치TV는 이같은 사용자의 움직임에서 영감을 얻어 소니와 협력해 '사용자 참여형 방송'을 정식 개시했다. 소니 플레이스테이션4에는 트위치TV 방송 기능뿐만 아니라 '방송 중인 게임에 참여할 수 있는 기능'이 추가돼 있다. 이를 통해 사용자는 위기에 처한 캐릭터를 도와주거나, 새로운 위기 상황에 처하게 할 수 있다.
트위치
셋째는 '손쉬운 방송'이다. 사실 개인방송은 쉬운 일이 아니다. 일상을 틀어주는 것이야 웹캠과 마이크만 있으면 되지만, 게임 방송을 하려면 수십만 원을 호가하는 고가의 영상 캡처 장비가 필요하다. 장비만 있다고 끝이 아니다. 최적의 방송 셋팅을 위한 준비와 연습도 상당히 필요하다. '게임을 즐기는 모습을 한 번 방송해 볼까'라고 생각하며 방송을 준비한 게이머도 이러한 벽에 가로막혀 포기하기 일쑤다. 사실 트위치TV도 이러한 벽이 크게 존재했다. 아프리카TV나 다음팟TV처럼 방송을 위한 전용 클라이언트 프로그램을 사용하지 않기 때문에 트위치TV로 영상 송출을 지원하는 동영상 플레이어를 찾아야만 했다. 동영상 플레이어마다 설정값이 달라 사용자들을 좌절시켰다.
하지만 소니, MS 등 게임 업계의 거물들과 손잡음으로써 이러한 문제를 해결했다. 소니 플레이스테이션4, MS 엑스박스 원 등 최신 비디오 게임기에는 게임을 즐기는 모습을 트위치TV로 방송하는 기능이 기본 포함돼 있다. 이를 통해 사용자는 고가의 영상 캡처 장비, 번거로운 설정 등을 준비하지 않아도 게임을 즐기는 모습을 방송할 수 있다. 접근을 편하게 한다는 선택은 성공적이었다. 플레이스테이션4 출시 1개월 만에 트위치TV 개인방송자는 10만 명 이상 증가했다. 이 수치는 지속적으로 증가하고 있고, 얼마전 엑스박스 원에 방송 기능이 추가됨에 따라 상승 곡선은 더욱 가파라질 것으로 예상된다.
트위치TV는 이같은 차별점을 바탕으로 미국의 실시간 스트리밍 시장을 장악했다. 실시간 스트리밍 솔루션 기업 퀼트(Qwilt)가 지난 4월 미국의 실시간 스트리밍 시장 점유율을 분석해본 결과, 트위치TV는 43.6%로 1위를 차지했다. 2위 WWE.COM(17.7%), 3위 유스트림(10.9%), 4위 MLB.COM(7.2%) 등을 합쳐도 트위치TV 하나만 못하다. 심지어 한때 본체이기도 했던 저스틴TV(1.2%)보다도 압도적으로 높다.
트위치TV

사용자들은 왜 개인방송에 나서나?

그렇다면 이쯤에서 의문이 하나 생긴다. 왜 사용자들은 트위치TV 같은 플랫폼을 활용해 개인방송에 나서는 걸까. 가장 큰 이유는 '경험을 공유'하고 싶어서다. 게임을 즐기는 모습을 타인과 공유함으로써 즐거움을 배가할 수 있다. 자신의 게임 실력을 과시해 자기 만족을 얻을 수도 있다. 단순히 시청자들과 소통하는게 즐거워 방송에 나선 사용자도 많다.
그런데 최근 한 가지 이유가 더 생겼다. '돈'이다. 개인방송을 하면 그 대가로 수익을 얻을 수 있다. 트위치TV로 개인방송을 감상하려면 중간에 광고를 봐야 한다. 이 광고 수익은 트위치TV와 개인방송자가 나눠갖는다. 시청자가 많으면 많을 수록 수익은 더 늘어난다. 광고 외에 시청자가 개인방송자를 직접 후원할 수 있는 수단도 있다. 4.99달러를 내고 구독하기 메뉴를 선택하면 이 돈이 개인방송자에게 전달된다.

트위치TV, 더 큰 성장을 위해 인수자 찾아

이처럼 잘가나는 트위치TV가 왜 자신을 인수해줄 기업을 찾아 나선 걸까. 이유는 크게 3가지로 분석된다. 첫째, IP(지적재산) 보유자와 분쟁을 피하기 위해서다. 둘째, 폭증하는 트래픽을 감당하기 위해서다. 셋째, 전세계 시장에 진출하기 위해서다.
사실 게임 방송은 방송자 개인이나 인터넷 방송국 모두에게 상당히 위험한 행위다. 게임 개발사라는 원저작권자가 엄연히 존재하기 때문. 게임 개발사가 "왜 동의 없이 우리의 지적 재산권인 게임을 활용해 돈을 버느냐"고 문제를 제기하면 방송자와 인터넷 방송국은 할 말이 없다. 방송을 중단하는 수밖에.
예전에는 게임 판매량에 도움이 될 거라 생각하고 별 다른 제재를 가하지 않았다. 하지만 게임의 스토리가 유출되고, 방송자와 방송국이 게임방송 덕분에 수익을 거둔다는 사실이 알려지면서 문제가 불거졌다. 게임 스토리 유출은 게임 판매량에 직접적으로 영향을 끼치는 문제였고(영화 스토리가 고스란히 공개됐다고 생각해보라), 원저작권자를 배제한 채 수익을 나눠갖는 것은 상식적으로 이해할 수 없는 행위였다.
때문에 게임 개발사들은 자신의 권리를 찾아 나서기 시작했다. 특정 게임을 방송하거나 관련 동영상을 업로드하는 것을 금지시켰고, 자사의 허락없이 게임 대회를 개최하는 것을 막았다.
게임 방송국을 표방하는 트위치TV의 입장에선 자칫 밥줄이 끊길 수도 있는 심각한 문제다. 여러 게임 개발사와 협상을 시도했다. 리그오브레전드를 서비스하는 라이엇게임즈, 스트리트파이터4를 서비스하는 캡콤 등과 접촉해 게임 방송을 할 수 있는 권리를 얻고, 각종 대회를 후원하기 시작했다. 모든 게임 개발사와 직접 협상하는 것은 어렵다고 판단하고 게임 플랫폼 사업자(소니, MS, 닌텐도)와 협력하기로 결정했다. 플레이스테이션4, 엑스박스 원 등 최신 비디오 게임기에 트위치TV 방송하기 기능이 추가된 이유 중 하나다.
여전히 분쟁의 불씨는 남아 있다. 트위치TV 입장에선 비바람을 막아줄 수 있는 우산이 필요했다. 게임 개발사에 직접 영향력을 회두를 수 있는 강력한 우산이. 가장 먼저 생각해볼 수 있는 곳이 게임 플랫폼 사업자다. 소니, 닌텐도는 타사를 인수할만 한 여력이 없다. 남은 곳은 MS다. 트위치TV가 먼저 MS의 문을 똑똑 두드린 이유다. 더버지의 기사도 그렇고, 전후사정도 그렇고 트위치TV와 MS는 제법 긍정적인 대화를 나눈 것으로 추측된다. 플레이스테이션4를 시장에서 밀어내고 엑스박스 원의 입지를 다지길 원하는 MS의 입장에서도 트위치TV는 반드시 잡아야 할 서비스였다.
하지만 결정적인 입장 차이가 둘을 갈라서게 했다. MS는 트위치TV가 MS 플랫폼(PC, 엑스박스 원)만을 위한 서비스가 되길 원했다. 반면 트위치TV는 게임을 즐길 수 있는 모든 플랫폼과 트위치TV 서비스가 연결되길 바랬다. 이 입장 차이는 좁혀지지 않았고, 결국 협상은 없던 일이 됐다.
남은 곳은 이제 같은 동영상 플랫폼 사업자뿐이다. 업계 선배로서 다양한 저작권 분쟁을 극복해온 경험이 있고, 동영상 스트리밍 기술도 풍부한 곳. 그러면서도 게임 업계와 제법 친밀한 관계를 유지하는 회사. 바로 유튜브다. 트위치TV가 유튜브에 인수되면 두 번째 문제와 세 번째 문제도 자연스레 해결될 전망이다. 유튜브의 막대한 트래픽을 감당하는 구글 IDC에 입주할 수 있고, 전세계적으로 서비스를 제공하는 노하우도 전수받을 수 있다.

유튜브, 라이브 서비스 실패 딛고 동영상 UCC 시장에 우뚝

유튜브 입장에서도 트위치TV는 놓쳐선 안될 거물이다. 월방문자 10억 명이 넘어가는 세계 최대의 동영상 공유 서비스이지만, 어디까지나 재방송에 한정된 얘기다. 생방송을 다루는 트위치TV와 분야가 전혀 다르다.
한때 유튜브도 생방송 플랫폼을 제공하려 했다. 유튜브 라이브라고 이름 붙인 이 서비스로, 트위치TV나 유스트림과 겨루겠다고 호언장담했다. 처음엔 기업을 대상으로 서비스를 제공했지만, 추후 개인에게도 공개했다. 결과는? 유튜브 라이브란 서비스가 존재한다는 것을 알고 있는 사용자조차 드문게 현실이다. 사용자에게 유튜브는 재방송을 보는 곳이지 생방송을 보는 곳이 아니었단 얘기다. 실제로 방송자들은 트위치TV, 유스트림, 아프리카TV 등에서 진행한 생방송을 녹화한 후, 이를 유튜브에 올리는 형태로 자신의 방송을 알리고 있다. 신규 서비스가 실패했다면 기업에게 남은 것은 인수/합병뿐이다. 유튜브가 트위치TV에 관심을 보내는 이유다.
유튜브의 트위치TV 인수가 성사된다면 생방송과 재방송을 모두 아우르는 동영상 UCC 업계의 절대강자가 등장하게 된다. 트위치TV는 아직 로컬 사업자에 머물고 있지만, 리그오브레전드의 인기에 힘입어 아시아권 시청자도 상당한 것으로 알려져 있다.
주의할 것은 유튜브가 트위치TV를 인수하다는 것은 아직 확정된 사실이 아니란 점이다. 어디까지나 '카더라'에 지나지 않다. 두 회사가 공식 발표하기 전까지 확신하는 것은 금물이다. 하지만 도약을 위해 인수자를 찾는 트위치TV, 재방송뿐만 아니라 생방송 시장도 원하는 유튜브. 두 회사의 입장이 일치하니 논의는 일사천리로 진행될 가능성이 높다.
트위치TV는 현재 국내 진출을 위해 업계 관계자와 물밑접촉을 진행 중이다(인수설이 나오기 전부터 진행된 부분이다). 국내 동영상 스트리밍 시장 점유율이 80%에 육박하는 유튜브가 트위치TV라는 날개까지 달면 국내 동영상 스트리밍 사업자들은 버텨낼 재간이 없다. 유튜브의 트위치TV 인수를 국내 사용자들이 관심있게 지켜봐야 하는 이유다.
글 / IT동아 강일용(zero@itdonga.com)

Friday, June 13, 2014

DevStack을 이용한 Openstack 설치

source:
openstack에 관한 글 모음 : http://naleejang.tistory.com/category/OpenStack
openstack 설치 매뉴얼  http://naleejang.tistory.com/attachment/cfile21.uf@24332F3F516B481244EC81.pdf


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
proxy(firewall)를 사용할 경우 다음의 두가지 설 설정을 해주어야 한다.
1. 환경 설정
export http_proxy=..httpL//server:port.
export https_proxy=..
2. devstack/stackrc
   GIT_BASE=${GIT_BASE:-git://git.openstack.org}
  ===>
   GIT_BASE=${GIT_BASE:-https://git.openstack.org}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
openstack 설치를 하기 위해서 google링을 해봤다.

centos에서 설치
ubuntu에서 설치

정말 설치하기 힘들다. 너무 복잡하고 짜증난다..
다행이 devStack.sh 스크립트를 이용한 설치 방법이 있다.

git clone git://github.com/openstack-dev/devstack.git
cd devstack; ./stack.sh
만 하면 된단다. 겁나 쉽다.. 라고 생각했지만 역시나.
안된다. 여러가지 문제점이 발생 구글링 해도 해결이 안된다.
ubuntu, centos 여러버전에 설치를 해봤지만 다 실패

위 사이트에서 메뉴얼 보고 해결봤다. 감사드립니다 꾸벅
참조해서 설치했다.

설치해보고 나니 정말 간단하다.. 무식이 죄지...

ubuntu OS 설치후 

git 설치 
# apt-get install -y git

user 추가
# useradd -U -G sudo -s /bin/bash -m stack
# echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
# passwd stack

user 전환 및 devstack 다운
계정을 만들었으니 stack 으로 전환
# su stack
# /home/stack
# git clone git://github.com/openstack-dev/devstack.git

환경설정 loclrc
아래 링크 참조 해서 작성하면 된다.
빨간 글씨만 변경하면 된다.

# vi /home/stack/devstack/localrc
#####################
# Date : 2013.03.20 #
# Name : naleeJang #
#####################
# Devstack localrc for Quantum all in one
# default
HOST_IP=192.168.42.101
 
# network
FLAT_INTERFACE=eth0
FIXED_RANGE=10.0.0.0/20
NETWORK_GATEWAY=10.0.0.1
FLOATING_RANGE=192.168.0.1/24
EXT_GW_IP=192.168.0.1
 
# vnc
VNCSERVER_LISTEN=0.0.0.0
VNCSERVER_PROXYCLIENT_ADDRESS=$HOST_IP
 
# logs
DEST=/opt/stack
LOGFILE=$DEST/logs/stack.sh.log
SCREEN_LOGDIR=$DEST/logs/screen
 
# system password
ADMIN_PASSWORD=openstack
MYSQL_PASSWORD=openstack
RABBIT_PASSWORD=openstack
SERVICE_PASSWORD=openstack
SERVICE_TOKEN=openstackservicetoken
 
# cinder
VOLUME_GROUP="cinder-volume"
VOLUME_NAME_PREFIX="volume-"
 
# install service
disable_service n-net
enable_service q-svc q-agt q-dhcp q-l3 q-meta quantum 

설치
# cd /home/stack/devstack/
# ./stack.sh
하면 시스템에 상태에 따라 30~1시간 정도면 설치가 완료된다.
설치가 완료가 됐으면
http://localhost/
위와 같이 접속화면이 뜬다.
id : admin , passwd 는 환경설정에 지정했던 openstack 이다.

Thursday, June 12, 2014

[우분투] 루트 패스워드 초기화.

source:  http://dreamlog.tistory.com/m/post/246

[우분투] 루트 패스워드 초기화.

현무랑 니니 | 2014/02/11 23:57 | Linux |  2

우분투를 사용하다 패스워드를 잊어버렸을 경우가 있다.
우분투 시스템을 힘들게 설치했는데 막상 사용하려니 패스워드가 생각나지 않을 때도 있다.
또는 가상 머신으로 여러 우분투를 사용하다 보니 패스워드가 맞지 않기도 한다.
가장 위험한 것은 많은 데이터를 가진 우분투를 설치한 컴퓨터의 패스워드를 잊어 버렸을 때다.

자, 우분투의 패스워드를 잊어버렸을 경우 초기화 하는 방법을 알아보자.


우분투 패스워드 초기화 방법.

요약.

1. 재 부팅하여 GRUB 부트 로더의 복구 모드(recovery mode)를 선택한다.
2. 복구 모드에서 root 항목을 선택한다.
3. 읽기 전용으로 설정된 파일 시스템을 '읽기쓰기' 상태로 전환한다.
4. 루트 계정의 패스워드를 초기화한다. 

1. GRUB 부트 로더의 복구 모드 진입.

단일 부트 상태(우분투만 설치한 경우)라면 부팅 중 [shift] 키를 누르고 있어야 한다.
다중 부트 상태(우분투 외 하나 이상의 다른 운영체제를 추가로 설치한 경우)면 GRUB 부트 메뉴가 바로 표시된다.

2. 복구 모드에서 root 항목을 선택.

복구 모드 진입 후 부팅 과정이 끝날 때까지 기다린다.
"Drop to root shell prompt" 옵션을 선택하여 명령어 입력 모드로 전환한다.

3. 파일 시스템 읽기 쓰기 상태로 전환.

복구 모드에서는 파일 시스템이 읽기 전용으로 설정되어 있다.
계정의 암호를 변경하기 전에 읽기와 쓰기가 가능하도록 아래 명령을 실행한다.
root@ubuntu:~# mount -rw -o remount /

4. 계정의 패스워드를 초기화.

 passwd 명령으로 사용자 계정의 패스워드를 초기화 한다.
root@ubuntu:~# passwd root Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully root@ubuntu:~#
패스워드를 초기화 후 복구 모드로 돌아간다.
root@ubuntu:~# exit


Wednesday, June 11, 2014

Getting Started with Oracle VM, Oracle Linux and OpenStack

Getting Started with Oracle VM, Oracle Linux and OpenStack 
Oracle VM Early Access Downloads
   http://www.oracle.com/technetwork/server-storage/vm/downloads/ovm-early-access-1743261.html
Oracle® VM Installation and Upgrade Guide
  http://docs.oracle.com/cd/E35328_01/E35330/E35330.pdf

Exadoop (Bigdata SQL) from Oracle



source:  http://kerryosborne.oracle-guy.com/papers/Hadoop%20Meets%20Exadata%202.pdf


아래글 source:  http://kerryosborne.oracle-guy.com/2012/07/exadoop/
Exadoop
We started on an interesting mad scientist kind of project a couple of days ago.
One of our long time customers bought an Exadata last month. They went live with one system last week and are in the process of migrating several others. The Exadata has an interesting configuration. The sizing exercise done prior to the purchase indicated a need for 3 compute nodes, but the data volume was relatively small. In the end, a half rack was purchased and all four compute nodes were licensed, but 4 of the 7 storage servers were not licensed. So it’s basically a half rack with only 3 storage servers.
Meanwhile, we had been talking with them about Hadoopie kind of stuff. They are in the telecom space and are interested in pulling data via a packet sniffer which captures info directly from the tcp traffic. During the talks we discussed hardware requirements for building a Hadoop cluster as they didn’t really have any spare hardware available to test with. That’s when the crazy science project idea was born. Someone (who shall remain nameless) suggested that we build the pilot Hadoop cluster on the 4 unused storage nodes from the Exadata half rack. Since the storage servers use basically the same hardware as is used in the Oracle Big Data Appliance (BDA), it’s kind of like having a mini BDA. Of course the storage servers have slower CPU’s and a little less memory so it’s not apples to apples, but the servers do have InfiniBand and the same 3T drives so it’s pretty similar. And since they already had the servers sitting there …
So now we have a mini Hadoop cluster installed (CDH3) with 3 data nodes (roughy 100T raw storage). We also set up the Oracle Big Data Connectors on one of the Exadata compute nodes which allows us to create external tables on files stored in HDFS. Pretty cool. Let the games begin!
Oh and by the way. I’ll probably be talking about this project a bit at E4 (Enkitec Extreme Exadata Expo) on Aug. 13-14 in Dallas.

Docker란 무엇인가?




아래글 출처 ( nacyot님)  http://blog.nacyot.com/articles/2014-01-27-easy-deploy-with-docker/

도커(Docker) 튜토리얼 : 깐 김에 배포까지

클라우드와 같이 잘 짜여지고, 잘 나뉘어진 거대한 시스템에서야 그렇다 치더라도 가상 머신은 여러모로 손실이 많은 수단 중 하나입니다. 가상 머신은 격리된 환경을 구축해준다는 데서 매력적이긴 하지만, 실제 배포용으로 쓰기에는 성능 면에서 매우 불리한 도구라고 할 수 있습니다. 당연한 이야기입니다만 일단 운영체제 위에서 또 다른 운영체제를 통째로 돌린다는 것 자체가 리소스를 비효율적으로 활용할 수밖에 없습니다.
이런 가운데 가상 머신의 단점은 극복하면서 장점만을 극대화하기 위한 최적화가 계속해서 이루어지고 있습니다. 도커 역시 이런 단점을 극복하기 위해서 나온 가상화 어플리케이션입니다.도커는 단순한 가상 머신을 넘어서 어느 플랫폼에서나 재현가능한 어플리케이션 컨테이너를 만들어주는 걸 목표로 합니다. LXC(리눅스 컨테이너)라는 독특한 개념에서 출발하는 Docker의 가상화는 기존에 운영체제를 통째로 가상화하는 것과는 접근 자체를 달리합니다. 가상 머신이라고 하기에는 격리된 환경을 만들어주는 도구라고 하는 게 맞을 지도 모릅니다.
예를 들어 보죠. 우분투에서 CentOS라는 Docker를 통해 가상 환경을 구축하는데 얼마만큼의 시간이 걸릴까요? 먼저 여기서는 Ubuntu 상에서 작업을 한다고 가정하겠습니다.
$ cat /etc/issue
Ubuntu 13.10 \n \l
실제로 도커는 LXC를 사용하기 때문에 특정 리눅스 배포판에서 사용할 수 있고, 윈도우나 맥에서는 사용이 불가능합니다. Docker가 설치되어 있다는 가정 하에 Ubuntu에서 CentOS 가상 머신을 띄우는 데는 아래 두 명령어만 실행시키면 됩니다.
$ docker pull centos
$ docker run -rm -i -t centos:6.4 /bin/bash
bash-4.1#
먼저 위의 pull 명령어를 통해서 centos 이미지를 다운로드 받습니다. 그리고 이 이미지에 쉘 명령어를 실행시킵니다. 이걸로 끝입니다. 먼저 첫번째 명령어를 실행시키는데 제 컴퓨터에서 12초 정도가 걸렸습니다. 아래 명령어를 실행시키는데 0.3초가 걸리지 않았습니다. 쉘이 실행되면 bash 쉘로 바뀐 것을 알 수 있습니다. 실제로 CentOS인지 확인해보도록 하겠습니다.
bash-4.1# cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m
어떻게 이런 일이 가능할까요? 원리적인 부분은 이미 좋은 문서들이 있습니다. 한국어로 된 좋은 자료로는 Deview 2013에서 김영찬 님이 발표하신 이렇게 배포해야 할까? - Lightweight Linux Container Docker 를 활용하여 어플리케이션 배포하기 세션과 xym 님이 쓴 docker the cloud를 추천합니다. 하지만 분명한 건 VMWare를 사용한다고 해서 가상화 기술에 빠삭해야하는 것이 아니듯이, Docker 역시 기본적으로는 툴이라는 사실을 이해해야합니다. 제 생각에 도커의 원리를 이해하는 것도 중요하지만, 막상 이 도구를 사용하는 동안엔 컨테이너와 이미지의 차이를 이해하는 게 더 중요하고, Dockerfile을 만들어 자신만의 배포 프로세스를 저장하는 법을 익히는 게 더 중요합니다.
이 글에서는 바로 이러한 시점에서 개발 환경이자 배포 툴로써의 도커를 이해하기 위한 개념들을 소개하고 모니위키 어플리케이션을 도커로 설치하는 부분까지 다뤄보도록 하겠습니다. 각 부분에 대한 좀 더 자세한 이야기는 기회가 된다면 따로 다뤄보도록 하죠.

설치 

각 운영체제 별 Docker의 설치 방법은 공식 홈페이지에 잘 정리되어 있습니다. 제가 사용하는 Ubuntu의 경우에는 Docker에서 제공하는 스크립트 파일 하나를 통해서 원큐에 정말 쉽게 Docker를 설치할 수 있습니다. 가상 머신에서도 설치가 가능하니, 가능하다면 Ubuntu 환경을 사용하길 권장합니다. 네, 글을 쓰는 편의상.
curl -s https://get.docker.io/ubuntu/ | sudo sh
단, 당연히 curl이 설치 되어있어야합니다.1 1월 현재 12.04 / 13.10에서도 같은 방법으로 설치가 가능했습니다만, 설치 과정에 문제가 있거나 다른 운영체제를 사용하시는 경우엔 설치 문서를 꼼꼼히 읽어보시고 진행해나가시기 바랍니다. 설치가 끝나면 설치가 잘 됐나 확인해봅니다.
$ docker -v
Docker version 0.7.6, build bc3b2ec
Wow! 훌륭합니다. 필요하다면 ufw(방화벽) 설정을 통해서 도커가 사용하는 4243/tcp 포트도 열어줍니다.
sudo ufw allow 4243/tcp
기본적으로 docker의 대부분의 명령어를 실행 시 root 권한이 필요합니다. 따라서 sudo를 사용해야하는 번거로움이 따라오는데, 이를 위해 현재 유저를 docker 그룹에 포함시켜 줍니다.
$ sudo groupadd docker
$ sudo gpasswd -a ${USER} docker
$ sudo service docker restart
명령어들을 실행하고 재로그인을 하게 되면 더 이상 sudo 명령어를 앞에 붙이지 않아도 docker 명령을 사용할 수 있습니다. 단, 이 방법을 사용할 경우엔, 공식 문서에서도 경고하고 있듯이 docker group은 root와 같은 권한 가지고 있다는 사실을 인지하고 있어야합니다.

이미지(Image) 

설치만 끝났다면, 이제 끝이 보입니다. 대단해보이지만 정말 별 게 없습니다. 먼저 도커를 시작하면 이미지 개념을 이해할 필요가 있습니다. 처음에 보여드린 예제를 보면 centos 이미지를 다운로드 받고, 이 이미지에 shell을 실행시킵니다. 그런데 여기에 약간의 함정이 있습니다. Docker에서 실제로 실행되는 건 이미지가 아닙니다! 이미지는 추상적인 개념입니다. 실행되는 건 이미지를 기반으로 생성된 컨테이너입니다. 먼저 어떤 일이 일어나는지 확인해보도록 하겠습니다.
먼저 docker images 명령어로 시스템에 어떤 이미지가 있는지 확인해보죠.
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker images 명령어는 현재 시스템에서 사용가능한 이미지 일람을 보여줍니다. 이미지가 어디서 오는지 궁금하게 느껴지실지도 모릅니다. 이미지는 크게 세 가지 방법을 통해서 추가할 수 있습니다.
하나는 처음 예제에서와 마찬가지로 docker pull <이미지 이름>을 통해서 가져오는 방법입니다. 바로 이 명령어를 사용하면 docker.io의 공식 저장소에서 이미지를 다운로드 받아옵니다. 쉘을 활용하는 개발자라면 이런 개념이 낯설지는 않을 것입니다. 리눅스에서 apt-get이나 yum혹은 gem이나 pip, cpan, npm 같은 명령어를 사용해보셨다면 바로 이해하실 수 있을 겁니다. 이런 유틸리티를 사용해본 적이 없다고 하더라도 마찬가지 개념으로 docker 이미지 파일들을 관리하는 중앙 저장소가 있다고 이해하셔도 무방합니다. 독특한 점은 intsall이 아닌 pull 명령어를 사용한다는 점입니다. 이에 대해서는 개념적으로 VCS(버전 관리 시스템)을 알고 계신다면 추가적인 설명이 필요없겠습니다만, 어쨌거나 단순히 다운로드라고 이해하셔도 현재 단계에서는 무방합니다.
(두 번째 방법 커밋을 하는 방법입니다. 아래에서 설명합니다. 또 다른 방법은 Dockerfile을 통해서 기술된 과정을 거쳐 도커 이미지를 생성하는 방법입니다. 이에 대해서는 맨 마지막에 자세히 다룹니다.)
여기서는 편의상 ubuntu 이미지를 다운로드 받아오겠습니다. 이 이미지에 대한 정보는 웹을 통해서 확인하실 수 있습니다. 공식 저장소에 있는 이미지 정보들은 https://index.docker.io에서 확인할 수 있으며 우분투 이미지에 관해서는 이 페이지에서 찾을 수 있습니다.
$ docker pull ubuntu
Pulling repository ubuntu
04180f9bd8a6: Download complete
1e548c932d40: Download complete
5e94ff221e91: Download complete
b750fe79269d: Download complete
3e47bae8d07a: Download complete
43461fe97ba1: Download complete
8dbd9e392a96: Download complete
511136ea3c5a: Download complete
27cf78414709: Download complete
46e4dee27895: Download complete
86f6383454b4: Download complete
7a4f87241845: Download complete
1957a8106a4c: Download complete
b74728ce6435: Download complete
도커가 무언가를 열심히 다운로드 받습니다. 사실 이것들 하나하나가 이미지라는 것을 이해할 필요가 있습니다. 우분투 하나를 설치했을 뿐인데, 무려 14개의 이미지를 다운로드 받았습니다. 다운로드가 전부 끝났으면 이제 다시 이미지들을 확인해봅니다.
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              saucy               43461fe97ba1        3 days ago          144.6 MB
ubuntu              raring              5e94ff221e91        3 days ago          133.6 MB
ubuntu              quantal             3e47bae8d07a        3 days ago          127.6 MB
ubuntu              lucid               04180f9bd8a6        3 days ago          139.6 MB
ubuntu              precise             1e548c932d40        3 days ago          125.9 MB
ubuntu              12.04               8dbd9e392a96        9 months ago        128 MB
ubuntu              latest              8dbd9e392a96        9 months ago        128 MB
ubuntu              12.10               b750fe79269d        10 months ago       175.3 MB
그런데 저는 위에서 다운로드 받은 것들 하나하나가 이미지라고 얘기했는데 이상하게도 다운받은 이미지수와 실제로 출력되는 이미지 수가 맞지 않습니다. 이를 확인하기 위해서는 이번엔-a 플래그를 통해서 모든 이미지를 출력해보겠습니다.
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              saucy               43461fe97ba1        3 days ago          144.6 MB
<none>              <none>              86f6383454b4        3 days ago          0 B
ubuntu              raring              5e94ff221e91        3 days ago          133.6 MB
ubuntu              quantal             3e47bae8d07a        3 days ago          127.6 MB
<none>              <none>              1957a8106a4c        3 days ago          0 B
ubuntu              lucid               04180f9bd8a6        3 days ago          139.6 MB
<none>              <none>              7a4f87241845        3 days ago          0 B
ubuntu              precise             1e548c932d40        3 days ago          125.9 MB
<none>              <none>              46e4dee27895        5 weeks ago         0 B
<none>              <none>              b74728ce6435        5 weeks ago         0 B
<none>              <none>              511136ea3c5a        7 months ago        0 B
ubuntu              12.04               8dbd9e392a96        9 months ago        128 MB
ubuntu              latest              8dbd9e392a96        9 months ago        128 MB
ubuntu              12.10               b750fe79269d        10 months ago       175.3 MB
<none>              <none>              27cf78414709        10 months ago       175.3 MB
-a(-a=false: show all images) 플래그는 이미지를 빌드하는 과정에서 생성되는 모든 이미지를 보여줍니다. 자세히 보시면 저장소(Repository)가 인 이미지들이 존재하는 것을 알 수 있습니다. -a 플러그의 설명에서 알 수 있듯이 이 이미지들은 최종적인 이미지를 생성하는 과정에서 생성되는 중간 이미지들입니다. 나머지 다수의 우분투 이미지들은 TAG에서 보시듯이 다양한 버전의 이미지가 등록된 것을 알 수 있습니다.

컨테이너(Container) 

다시 한 번 특정 이미지의 쉘에 접근해보겠습니다.
$ docker run -i -t ubuntu:12.04 /bin/bash
root@8bfd70fe7392:/#
우분투 안에 우분투에 접속하는데 성공했습니다! 짝짝짝. 그런데 앞서 말씀드렸다싶이 이미지에 접속했다는 말에는 함정이 있습니다. 이 말은 마치 가상머신 ssh 프로토콜을 사용해 접근한 것과 같은 착각을 일으킵니다. 이제 새로운 명령어를 하나 배워보도록 하겠습니다. 앞서서 우리가 사용한 사용가능한 이미지들을 확인하는 명령어는 docker images입니다. 이번에 사용할 명령어는 현재 실행중인 컨테이너들을 출력하는 명령어 docker ps입니다. 별도의 쉘이나 터미널을 열고 docker ps 실행시켜보시기 바랍니다.
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
0fae5858c9c0        ubuntu:12.04        /bin/bash           8 seconds ago       Up 7 seconds                            sleepy_nobel
8초전에 만들어진 컨테이너가 실행되고 있는 것을 알 수 있습니다. 여기서 우리가 실행한 컨테이너 정보를 알 수 있습니다. 우리는 ubuntu:12.04 이미지로부터 컨테이너를 생성했고, 이 컨테이너에 /bin/bash라는 쉘을 실행시켰습니다. 그 외에도 맨 앞의 컨테이너 아이디는 앞으로 Docker에서 컨테이너를 조작할 때 사용하는 컬럼이기 때문에 필수적으로 알아둘 필요가 있습니다.
유난처럼 느껴질지도 모릅니다만, 이미지와 컨테이너를 정확하게 짚고 넘어갈 필요가 있습니다. 하지만 그렇다고 이미지와 컨테이너 개념은 아주 헷갈리는 개념인 것은 아닙니다. 단지 이미지는 추상적인 존재라는 것을 이해하실 필요가 있습니다.
또한 위의 예제에서는 직접 명령어를 넘겨서 이미지를 컨테이너로 실행시켰습니다만, 보통 이미지들은 자신이 실행할 명령어들을 가지고 있습니다. 예를 들어 레디스, 마리아db, 루비 온 레일즈 어플리케이션을 담고 있는 이미지라면, 각각의 어플리케이션을 실행하는 스크립트를 실행하게되겠죠. 컨테이너는 독립된 환경에서 실행됩니다만, 컨테이너의 기본적인 역할은 이 미리 규정된 명령어를 실행하는 일입니다. 이 명령어가 종료되면 컨테이너도 종료 상태(Exit)에 들어갑니다. 이러한 죽은 컨테이너의 목록까지 확인하려면 docker ps -a 명령어를 사용하면 됩니다. 실제로 쉘을 종료하고 컨테이너 목록을 확인해보겠습니다.
root@d02cd092f62d:/# exit
exit
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e2af61348652        ubuntu:12.04        /bin/bash           2 minutes ago       Exit 0                                  nostalgic_fermi  
상태(Status) 컬럼에서 확인할 수 있듯이 컨테이너가 임종하셨습니다. 이번엔 restart 명령어를 통해 이미지를 되살려보겠습니다.
$ docker restart e2af613
e2af613
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
e2af61348652        ubuntu:12.04        /bin/bash           4 minutes ago       Up 6 seconds                            nostalgic_fermi  
컨테이너가 되살아났습니다! 하지만 쉘이 실행되지는 않습니다. 컨테이너 속으로 들어가기 위해서는 attach 명령어를 사용할 필요가 있습니다.
$ docker attach e2af613
root@e2af61348652:/#
다시 docker 컨테이너 안으로 들어왔습니다! WoW! 부활의 기적을 여기서 만나는군요. 여기까지 도커 컨테이너의 생명 주기를 보았습니다. 도커 컨테이너를 실행시키는 run부터 실행이 종료되었을 때 다시 실행하는 restart를 배웠습니다. 이 외에도 실행을 강제로 종료시키는 stop명령어도 있으며, 종료된 컨테이너를 영면으로 이끌어주는 rm 명령어도 있습니다. 잠시 기억을 더듬어 올라가 이 글의 아주 처음에 run 명령어와 함께 사용한 -rm 플래그는 컨테이너가 종료 상태로 들어가면 자동으로 삭제를 해주는 옵션입니다.
네, 다시 한 번 이야기합니다. 이미지에는 접속한다는 개념이 없습니다. 실제로 실행되는 가상 머신은 항상 컨테이너입니다. 분명 저는 '명령어'를 실행시킨다고 했습니다만, 컨테이너란 격리된 환경에서 특정한 명령을 실행시켜주는 가상 머신과 같은 무언가입니다. 그렇다면 쉘을 실행시키지 않았을 때 이 가상 머신을 조작할 수 있는 방법이 있을까요? 원론적으로 불가능한 것은 아닙니다. 이 부분에 대해서 여기선 다루지 않습니다만, 직접 파일 시스템을 조작할 수도 있고, 리눅스 컨테이너를 조작해 특정 컨테이너에 대해 쉘을 실행시킬 수도 있습니다. 하지만 좀 더 정상적인 방법은 조작이 필요한 컨테이너에 ssh 서비스를 올려서 ssh 프로토콜로 접근하는 방법입니다. 실제 도커로 서비스를 운영하면 이런 부분이 절실할 날이 오겠지만, 일단은 그렇구나 하고 넘어가셔도 무방합니다.

버전 관리 시스템과 도커 

다시 이미지로 돌아가겠습니다. 누누이 강조하지만 이미지와 컨테이너는 다릅니다. 좋습니다. 그렇다면 한가지 질문을 던져보죠. 그렇다면 이 컨테이너를 지지고 볶고 삶고 데치고 하면 이미지는 어떻게 될까요?
당연히 이미지에는 아무런 변화도 생기지 않습니다. 아주 세속적인 예를 들어보면 윈도우 CD로 윈도우를 설치해서 사용한다고 해서 설치한 윈도우 CD에 어떤 변화가 생기지는 않는 것과 같은 이치입니다. 이미지는 어디까지나 고정된 이미지입니다. 도커에서 이미지는 불변(Immutable)하는 저장 매체입니다. 그런데 도커에서 이미지는 불변이지만 이 이미지 위에 무언가를 더해서 새로운 이미지를 만들어내는 일이 가능합니다. 좀 더 정확히 말하면 컨테이너는 변경가능(Mutabe)합니다. 특정한 이미지로부터 생성된 컨테이너에 어떤 변경사항을 더하고, 이 변경된 상태를 이미지로 만들어내는 것이 가능합니다.
앞서 실행한 컨테이너에 Git을 설치해보겠습니다. 위에서 실행한 쉘에 다음과 같은 명령어를 입력합니다.
root@e2af61348652:/# apt-get install -y git
...
root@e2af61348652:/# git --version
git version 1.7.9.5
우분투의 패키지 관리자인 apt-get을 통해서 버전 관리 시스템인 Git을 설치했습니다. 여기서 도커는 마치 자신이 VCS인양, 어떤 컨테이너와 이 컨테이너의 부모 이미지 간의 파일의 변경사항을 확인할 수 있는 명령어를 제공합니다. 마치 git diff 명령어로 프로젝트의 변경사항을 확인하듯이, docker diff 명령어로 부모 이미지와 여기서 파생된 컨테이너의 파일 시스템 간의 변경사항을 확인할 수 있습니다.
$ docker diff e2af61
A /.bash_history
A /.wh..wh.plnk/310.4862541
A /.wh..wh.plnk/93.4862548
C /bin
A /bin/less
...
C /var/log/alternatives.log
C /var/log/apt
A /var/log/apt/history.log
A /var/log/apt/term.log
C /var/log/dpkg.log
이제 기본 우분투 12.04 이미지에 Git가 설치된 새로운 이미지를 생성해보도록 하겠습니다. 이 작업도 VCS와 매우 비슷합니다. 도커에서는 이 작업을 commit이라고 합니다.
$ docker commit e2af61 ubuntu:git
5ff1d6b1c5db272c3f1a88c96f78146ed48d18848f0a10e6aefa066b462ff5ee
$ docker images | grep git
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              git                 5ff1d6b1c5db        About a minute ago   222.3 MB
이미지 만들기 정말 쉽죠? 단지 커밋을 하고 뒤에 이름을 붙여주면 바로 새로운 도커 이미지가 생성됩니다. 이미지로부터 컨테이너를 실행시키고 이 컨테이너의 수정사항을 통해서 새로운 이미지를 만들었습니다. 그렇다면 정말로 이 이미지를 통해서 컨테이너를 실행시키면(run) git가 실해될까요? 직접 확인해보죠.
$ docker run -i -t ubuntu:git /bin/bash
root@27d4e3090750:/# git --version
git version 1.7.9.5
감동에 눙물이 나올 것 같습니다 TT.
하지만 이 이미지는 별로 필요가 없군요. 냉정하게 필요없는 이미지는 삭제해버리겠습니다. 하나 알아두셔야 하는 중요한 사항은, 이미지에서 (종료상태를 포함한) 파생된 컨테이너가 하나라도 있다면 이미지는 삭제할 수 없습니다. (처음에 이 부분을 정확히 이해하지 못 해 한참을 해맸던 기억이 납니다) 따라서 먼저 컨테이너를 종료하고, 삭제까지 해주어야합니다. docker rm은 컨테이너를 삭제하는 명령어입니다. docker rmi는 이미지를 삭제하는 명령어입니다. 이 두 명령어를 혼동하지 않아야합니다.
먼저 컨테이너를 지우고, 이미지를 삭제해보겠습니다.
$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
27d4e3090750        ubuntu:git          /bin/bash           4 minutes ago       Exit 0                                  silly_heisenberg
$ docker rm 27d4e
27d4e
$ docker rmi ubuntu:git
Untagged: 5ff1d6b1c5db272c3f1a88c96f78146ed48d18848f0a10e6aefa066b462ff5ee
Deleted: 5ff1d6b1c5db272c3f1a88c96f78146ed48d18848f0a10e6aefa066b462ff5ee
브라보! 이번에는 도커 이미지의 생명주기를 배웠습니다. 도커 이미지를 pull로 받아오고commit 으로 파생된 이미지를 만들고 rmi 명령어로 삭제까지 해보았습니다. 컨테이너와 이미지의 생명주기만 이해하고 나면 도커의 80%는 이해한 거나 다름 없습니다. 도커를 통해서 하는 일은 거의 다 이 이미지와 컨테이너 개념으로 커버가 가능합니다. 이제 남은 일은 자신에게 필요한 이미지를 만들고 이 이미지를 통해서 컨테이너(가상 머신)를 실행하는 일입니다. 물론 이제 기본적인 개념들을 배웠으니 오픈된 중앙 저장소격에 해당하는 Docker Index에서 이미 만들어져있는 다양한 이미지들을 활용할 수도 있습니다.
무엇을 하건 도커의 모토를 잊지 마시기 바랍니다. 거짓말 조금 보태서(?!) 완성된 이미지는 언제 어디에 서라 도 가동 가능합니다.

Dockerfile로 이미지 생성하고 어플리케이션 실행시키기 

멀리 돌아왔습니다. 앞서서 도커 이미지를 추가하는 방법은 크게 세 가지가 있다고 이야기했습니다. 먼저 pull을 사용하는 방법은 이미 앞에서 다룬 바 있습니다. 그리고 컨테이너의 변경사항으로부터 이미지를 만드는 법에 대해서도 소개했습니다. 이러한 방법들은 매우 좋기는 하지만, 어딘가 2% 부족합니다. 이를 보완해주는 Dockerfile이라고 불리는 도커 이미지 생성용 배치 파일이 있습니다.
Dockerfile은 특정한 이미지를 출발점으로 새로운 이미지 구성에 필요한 일련의 명령어들을 저장해놓는 파일입니다. 미리 만들어둔 docker-moniwiki라는 프로젝트를 통해서 간단히 Dockerfile을 설명하고, 실제로 모니위키 어플리케이션을 가진 이미지를 생성하고 컨테이너를 통해서 실행시켜보도록하겠습니다. 먼저 프로젝트를 clone 받습니다.
git clone https://github.com/nacyot/docker-moniwiki.git
이 프로젝트에는 3개의 파일이 있습니다만, 실질적으로 Dockerfile 하나밖에 없다고 보셔도 무방합니다. 전체 파일 내용은 다음과 같습니다.
FROM ubuntu:12.04
MAINTAINER Daekwon Kim <propellerheaven@gmail.com>

# Run upgrades
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update

# Install basic packages
RUN apt-get -qq -y install git curl build-essential

# Install apache2
RUN apt-get -qq -y install apache2
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
RUN a2enmod rewrite

# Install php
RUN apt-get -qq -y install php5
RUN apt-get -qq -y install libapache2-mod-php5

# Install Moniwiki
RUN apt-get install rcs
RUN cd /tmp; curl -L -O http://dev.naver.com/frs/download.php/8193/moniwiki-1.2.1.tgz
RUN tar xf /tmp/moniwiki-1.2.1.tgz
RUN mv moniwiki /var/www/
RUN chown -R www-data:www-data /var/www/moniwiki
RUN chmod 777 /var/www/moniwiki/data/ /var/www/moniwiki/
RUN chmod +x /var/www/moniwiki/secure.sh
RUN ./var/www/moniwiki/secure.sh

EXPOSE 80
CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
보시는 바와 같이 Dockerfile은 모니위키를 설치하는 일련의 과정과 서버를 실행하는 명령어로 구성되어 있습니다. 각각의 부분을 간략히 살펴보겠습니다.
FROM ubuntu:12.04
MAINTAINER Daekwon Kim <propellerheaven@gmail.com>
먼저 맨 위에 정의된 FROM은 어떤 이미지로부터 새로운 이미지를 생성할 지를 지정합니다. 다음으로 MAINTAINER는 이 Dockerfile을 생성-관리하는 사람을 입력해줍니다.
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN은 직접 쉘 명령어를 실행하는 명령어입니다. 이 때 바로 뒤에 명령어를 입력하게 되면 쉘을 통해서 명령어가 실행됩니다. 위의 두 줄은 패키지 관리자 apt-get에 저장소를 추가하고 저장소 정보를 갱신하는 명령어입니다.
# Install basic packages
RUN apt-get -qq -y install git curl build-essential

# Install apache2
RUN apt-get -qq -y install apache2
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
RUN a2enmod rewrite

# Install php
RUN apt-get -qq -y install php5
RUN apt-get -qq -y install libapache2-mod-php5
다음 부분에서는 모니위키 설치에 필요한 패키지들과 apache2 서버, php 프로그램을 설치 및 설정해줍니다. 아파치 설치 과정에서 나오는 ENV를 통해 환경 변수를 지정할 수 있습니다.
# Install Moniwiki
RUN apt-get install rcs
RUN cd /tmp; curl -L -O http://dev.naver.com/frs/download.php/8193/moniwiki-1.2.1.tgz
RUN tar xf /tmp/moniwiki-1.2.1.tgz
RUN mv moniwiki /var/www/
RUN chown -R www-data:www-data /var/www/moniwiki
RUN chmod 777 /var/www/moniwiki/data/ /var/www/moniwiki/
RUN chmod +x /var/www/moniwiki/secure.sh
RUN ./var/www/moniwiki/secure.sh
이제 실제로 모니위키를 설치합니다. 여기서는 모니위키를 curl을 통해서 다운로드 받고, 압축을 풀고 모니위키 실행에 필요한 권한 관련 설정을 해주고 있습니다.
EXPOSE 80
CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
이제 마지막입니다. EXPOSE는 가상 머신에 오픈할 포트를 지정해줍니다. 마지막줄의 CMD는 컨테이너에서 실행될 명령어를 지정해줍니다. 이 글의 앞선 예에서는 docker run을 통해서/bin/bash를 실행했습니다만, 여기서는 아파치 서버를 FOREGROUND에 실행시킵니다.
자 기다리고 기다리던 대망의 순간이 왔습니다. 직접 이 Dockerfile을 빌드할 차례입니다.
$ docker build -t nacyot/moniwiki .
Uploading context 71.68 kB
Uploading context
Step 1 : FROM ubuntu:12.04
---> 8dbd9e392a96
Step 2 : MAINTAINER Daekwon Kim 
---> Running in a2af31ca9d62
---> c42835b9308b
Step 3 : RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
---> Running in d305ce1fea04
---> f4cb16c39b0e
Step 4 : RUN apt-get update
...
---> c63d093aacfb
Step 21 : EXPOSE 80
---> Running in cee6a6048c83
---> 7436a638e52c
Step 22 : CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]
---> Running in 2f251c355290
---> 0a148bb4de2f
Successfully built 0a148bb4de2f
docker build 명령어는 -t 플래그를 사용해 이름과 태그를 지정할 수 있습니다. 그리고 마지막에 .은 빌드 대상 디렉토리를 가리킵니다. 이 때 알아두면 좋은 게 하나 있습니다. 위에서 정의한 RUN 명령 하나 하나는 명령 하나마다 이미지가 됩니다. 기본적으로 이 빌드를 통해서 생성되는 최종 이미지는 nacyot/moniwi가 됩니다만, docker images -a를 통해서 살펴보면 이름없는 도커 이미지들이 다수 생성되는 것을 알 수 있습니다.
$ docker images -a
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
                            c63d093aacfb        4 minutes ago       670.4 MB
                            7436a638e52c        4 minutes ago       670.4 MB
nacyot/moniwiki     latest              0a148bb4de2f        4 minutes ago       670.4 MB
                            49825025193f        4 minutes ago       670.4 MB
                            5b374f859553        4 minutes ago       670.4 MB
                            c8afe13ab509        4 minutes ago       670.4 MB
                            bb65aa482123        4 minutes ago       663.1 MB
                            fa7f2059c9ba        4 minutes ago       655.8 MB
                            1a18589e4d9a        4 minutes ago       648.5 MB
                            fdd759b53314        4 minutes ago       646.1 MB
                            786c8ad1df43        4 minutes ago       610.5 MB
                            14e8b032683a        4 minutes ago       610.5 MB
                            6be08754c2ae        4 minutes ago       547.9 MB
                            67e17f5a39f1        4 minutes ago       547.9 MB
                            55ec9487188b        4 minutes ago       547.9 MB
                            88a61604a1d0        4 minutes ago       547.9 MB
                            7edabbb84352        4 minutes ago       547.9 MB
                            78e9afc826cd        4 minutes ago       503 MB
                            8066398c160f        5 minutes ago       272.5 MB
                            f4cb16c39b0e        6 minutes ago       128 MB
                            c42835b9308b        6 minutes ago       128 MB
이미지 아이디가 빌드 과정에서 출력되는 아이디와 같은 것을 알 수있습니다. 필요한 경우 중간 이미지에 접근하거나 직접 중간 이미지로부터 다른 이미지를 생성하는 것도 가능합니다. 정말 좋은 소식은 도커는 이러한 빌드 순서를 기억하고 각 이미지를 보존하기 때문에 같은 빌드 과정에 대해서는 캐시를 사용해 매우 빠르게 빌드가 가능하다는 점입니다. 실제로 Docker 파일을 만드는 과정에서는 많은 시행 착오를 겪게되는데, 중간에 빌드가 실패하더라도 성공했던 명령어까지는 거의 시간 소모 없이 빠르게 진행되도록 설계되어있습니다.
빌드 자체는 꽤나 번거로운 일입니다. 도커의 가상화가 굉장히 빠르다고 해도 어플리케이션 실행환경을 구축하는 일은 상당히 시간도 많이 걸립니다. 더욱이 빌드 자체는 완벽히 '재현 가능'하지 않습니다. 하지만 이렇게 Dockerfile을 통해서 배치화를 시켜두면 Dockerfile이라는 정말 작은 파일 하나로 어플리케이션 배포 환경을 구축할 수 있다는 장점이 있으며, 또한 쉽게 유연하게 사용할 수 있습니다. 아주 흥미로운 이야기를 하나 해드리자면 Docker 생태계에 있는 오픈소스 어플리케이션들은 아예 Dockerfile을 프로젝트에 포함하고 있습니다. 대표적으로 도커 모니터링 툴인 Shipyard가 있습니다. 여기서 제공하는 Dockerfile을 빌드해서 이미지를 만들고, 이 이미지로 컨테이너를 가동하면 바로 shipyard 어플리케이션을 사용할 수 있습니다. 전율이 느껴지시나요?
Dockerfile은 단순히 어플리케이션 설치를 스크립트로 만들어주는 게 아니라, 배포환경 구축까지 한꺼번에 해주는 역할을 합니다. 오래전 제로보드나 테터툴즈 한 번 설치해보겠다고 찍어가며 php랑 aphche랑 잘 붙었나 안 붙었나 확인해보고 안 되면 이유도 못 찾아 혼자 서러워했던 적이 있는 분이라면(어라?) 이해하리라 믿습니다. 다른 예를 들어볼까요? 설치가 까다로운 걸로 악명높은 오픈소스 웹 어플리케이션 중에 Gitlab이라는 어플리케이션이 있습니다. gitlab-docker에서 제공하는 Dockerfile 하나면 이제 Gitlab도 두렵지 않습니다. 그저 Build하고 Run하면 Gitlab이 뜹니다.
네, 얘기가 길어졌네요. 다시 모니위키로 돌아갑니다. 빌드가 끝났으니 실행을 해보겠습니다.
$ docker run -d -p 9999:80 nacyot/moniwiki
746443ad118afdb3f254eedaeeada5abc2b125c7263bc5e67c2964b570166187
다시 docker run 입니다. 이번에는 -d와 -p 플래그를 사용합니다. 앞서서 자세히 설명하진 않았습니다만, -d 플래그는 -i 플래그의 반대 역할을 하는 플래그로, 컨테이너늘 백그라운드에서 실행시켜줍니다. -p는 포트포워딩을 지정하는 플래그입니다. :을 경계로 앞에는 외부 포트, 뒤로는 내부 포트입니다. 참고로 컨테이너 안에서 아파치가 80포트로 실행됩니다. 따라서 여기서는 localhost에 9999로 들어오는 연결을 여기서 실행한 컨테이너의 80포트로 보내도록합니다.
이제 정말 마지막입니다. 로컬의 9999 포트에 접근해 정말로 모니위키가 실행되는지 보도록 하겠습니다.
http://127.0.0.1:9999/moniwiki/
모니위키 설치 페이지
올레! 잘 돌아가네요.

정리 

도커의 활용가능성은 무궁무진합니다. 당연히 실제 배포에도 사용할 수 있고, 유연하고 날렵한 격리된 환경을 활용해 실험적인 개발을 진행할 수도 있습니다. Vagrant보다도 훨씬 빠른 가상 환경을 활용할 수 있으며 접근 방법은 다르지만 서버환경을 자동적으로 구성할 수도 있습니다. 미리 만든 이미지를 자신의 저장소(registry)에 등록해 여러대의 머신에 컨테이너들을 자동적으로 배포할 수도 있고, 오픈소스 프로젝트에서 Dockerfile을 제공해 설치를 색다른 방법으로(?) 지원할 수도 있습니다. Dokku를 사용하면 정말 쉽게 mini-heroku와 같은 PaaS 플랫폼을 구축해 볼 수도 있습니다.
단순히 생산성을 넘어, 도커의 매력은 상상력을 자극한다는 점입니다. 특히나 서버 자동화가 화두인 요즘에 인프라스트럭쳐가 코드로 변해버리는 묘한 체험을 하게 해줍니다. 인프라스트럭쳐가 코드가 되면 뭔가 신기한 일들이 벌어집니다. 이런 상황에서 아직까지 낯설게 느껴질지도 모르는 개념이고 툴입니다만 직접 설치하고 이것저것 해보다보면 저처럼 분명 반하실 거라 생각합니다 :)