129 Docker 로 PaaS 구성하기 오스카하네지음 / 이기곤옮김
129 Docker 로 PaaS 구성하기 오스카하네지음 / 이기곤옮김
표지사진임희진이책의표지는임희진님이보내주신풍경사진을담았습니다. 리얼타임은독자의시선을담은풍경사진을책표지로보여주고자합니다. 사진보내기 ebookwriter@hanbit.co.kr Docker 로 PaaS 구성하기 초판발행 2016 년 5 월 26 일 지은이오스카하네 / 옮긴이이기곤 / 펴낸이김태헌펴낸곳한빛미디어 ( 주 ) / 주소서울시마포구양화로 7길 83 한빛미디어 ( 주 ) IT출판부전화 02-325-5544 / 팩스 02-336-7124 등록 1999년 9월 30일제10-1779호 ISBN 978-89-6848-821-4 95000 / 정가 13,000원 총괄전태호 / 책임편집김창수 / 기획 편집정지연디자인표지 / 내지여동일, 조판최송실마케팅박상용, 송경석, 변지영 / 영업김형진, 김진불, 조유미 이책에대한의견이나오탈자및잘못된내용에대한수정정보는한빛미디어 ( 주 ) 의홈페이지나아래이메일로알려주십시오. 한빛미디어홈페이지 www.hanbit.co.kr / 이메일 ask@hanbit.co.kr Published by HANBIT Media, Inc. Printed in Korea Copyright c 2015 Packt Publishing. First published in the English language under the title Build Your Own PaaS with Docker (9781784393946). This translation is published and sold by permission of Packt Publishing, which owns or controls all rights to publish and sell the same. 이책의저작권은 Packt Publishing과한빛미디어 ( 주 ) 에있습니다. 저작권법에의해보호를받는저작물이므로무단복제및무단전재를금합니다. 지금하지않으면할수없는일이있습니다. 책으로펴내고싶은아이디어나원고를메일 (ebookwriter@hanbit.co.kr) 로보내주세요. 한빛미디어 ( 주 ) 는여러분의소중한경험과지식을기다리고있습니다.
저자 역자소개 지은이 _ 오스카하네 오스카하네 Oskar Hane Full Stack 는 15년동안웹애플리케이션을개발하고배포해온풀스택 개발자입니다. 그는이기간에대부분시간을스타트업과작지만빠르게성장하는회 사에서일해왔습니다. 또한, 몇몇회사의공동창업자이며, 지난몇년동안은독립계 약자 independent contractor 로서일해왔습니다. 최근에는자바스크립트로세계에서가장뛰어 난그래프데이터베이스중하나인 Neo4j 의프런트엔드를개발하고있습니다. 그는현재아내, 딸과함께스웨덴에서살고있으며프로그래밍뿐만아니라스포츠와 사냥, 낚시같은야외활동을좋아합니다. 옮긴이 _ 이기곤 아이렌소프트 (AirenSoft) 에서풀스택개발자로일하고있습니다. 저서로는 FFmpeg 라이브러리 : 코덱과영상변환을중심으로, 역서로는 도커오케스트레이션 : 애플리 케이션빌드, 테스트, 배포의통합관리 ( 이상한빛미디어, 2015) 가있습니다.
역자서문 Docker가등장한지 3년이라는시간이흘렀습니다. Docker는기존에사용하던가상솔루션들과달리 namespace와 cgroups과같은리눅스커널기능으로매우효율적으로격리된가상환경을생성합니다. 이러한이유로 Docker는개발자들에게큰호응을얻어왔으며레드햇, 아마존과같은대기업에서도 Docker를전적으로지원해왔습니다. 하지만상용환경에서 Docker를사용하는데는많은문제점이있었습니다. Docker 는효율적으로격리된가상환경을생성할수있지만, 수많은가상환경을생성하고관리하기위한도구들은매우부족했습니다. 따라서시간이지날수록 Docker를둘러싼생태계는 Docker Compose, Crane과같이 Docker를더욱효율적으로사용할수있는오케스트레이션도구들로가득차게되었습니다. 이외에도 Ansible, Puppet, Chef와같은설정자동화도구들도 Docker와함께어우러져사용되기시작했습니다. Docker는비교적최근에등장한오픈소스인만큼사용법이매우간단하고활용하기도쉽습니다. 하지만오케스트레이션도구를사용하여 Docker를활용하는방법은매우다양한데다찾아보기도어렵습니다. 이책은 Docker를상용환경에서사용하는데필요한설정들과 Docker를둘러싼생태계에관해이야기를풀어나갑니다. 여러분이 Docker를활용하는방법을찾고있다면이책이그방향을잡는데큰도움이될것입니다.
들어가며 Docker는프로세스들을격리된상태로실행할수있는소프트웨어컨테이너 Container 기술을높은수준의 API로제공하는오픈소스입니다. 애플리케이션이다양한리눅스서버 ( 물론 OS X와윈도우도포함합니다.) 에서실행될수있도록컨테이너에포장함으로써개발자가서버설정과데브옵스 DevOps01 활동보다는개발에조금더집중하도록도와줍니다. 이책에서다루는내용 1장 Docker 설치에서는컨테이너를만드는데필요한 Docker를설치하는과정을다룹니다. 2장 Docker 살펴보기에서는 Docker가어떻게작동하고어떤용어들이사용되는지살펴보며, 공용이미지들을소개합니다. 3장첫번째 PaaS 이미지에서는 PaaS Platform as a Service02 의일부가될첫번째 Docker 이미지생성방법을설명합니다. 4장데이터보관과명령어인자전달에서는컨테이너에저장된데이터를보관할수있는방법들을살펴보고, 어떻게컨테이너안으로명령어인자를전달하는지설명합니다. 5장컨테이너연결에서는컨테이너들이완벽한하나의플랫폼으로써동작할수있게연결하는방법을살펴봅니다. 그리고여러컨테이너로이루어진플랫폼을쉽게다룰수있는두가지도구를소개합니다. 6장역방향프락시요청에서는한호스트안에서여러컨테이너를관리할때동일한 01 역자주 : 개발자와운영자가애플리케이션을빠르게배포하기위해협력하는개발방법론 02 역자주 : 플랫폼을제공하는서비스
포트를사용하지못하는문제와이문제를어떻게해결할수있는지설명합니다. 7장 PaaS를통한배포에서는여러분이구성한 PaaS에서애플리케이션을배포하는과정을설명합니다. 또한, mini-heroku와 Dokku를생성하는방법도함께설명합니다. 8장끝나지않은이야기에서는앞장에서언급한몇가지프로젝트를소개합니다. 이외에도 PaaS를기반으로한 Docker의멋진미래에대해서도살펴봅니다. 이책을위해필요한것들 OS X, 리눅스또는윈도우가설치된 PC/ 노트북 인터넷연결 이책이필요한독자이책은하나의서비스를컨테이너들로모듈화하고각컨테이너를연결함으로써하나의거대한플랫폼을구성하는방법을배우길원하는사람들을위한책입니다. 아마여러분은 Docker에대해들어보았지만, 설치해본적이없거나사용해본적이없을지도모릅니다. 또는 Docker를설치했지만, 서비스를분할하여사용하지않고하나의컨테이너에모든것을담아서사용하고있을수도있습니다. 이러한상황에서이책은 PaaS를구성하기위해필요한모든지식과통찰력을줄것입니다. 예제코드다운로드 예제코드파일은다음링크에서다운로드할수있습니다. http://www.hanbit.co.kr/exam/2821
차례 chapter 1 Docker 설치 011 1.1 Docker란무엇인가 011 1.2 우분투환경에서의 Docker 012 1.2.1 Docker 업그레이드 013 1.2.2 유저권한추가 013 1.3 OS X 환경에서의 Docker 014 1.3.1 Docker Toolbox 설치 014 1.3.2 Docker 업그레이드 017 1.4 윈도우환경에서의 Docker 017 1.4.1 Docker Toolbox 설치 017 1.4.2 Docker 업그레이드 018 1.5 Amazon EC2 환경에서의 Docker 018 1.5.1 Docker 설치 019 1.5.2 포트개방 023 1.5.3 Docker 업그레이드 024 1.5.4 유저권한 024 1.5.5 Hello World 출력 024 1.6 요약 026 chapter 2 Docker 살펴보기 027 2.1 Docker 이미지 027 2.2 Docker 컨테이너 028 2.3 Docker 커맨드라인인터페이스 030 2.4 Docker 레지스트리허브 031 2.4.1 저장소둘러보기 032 2.4.2 공식배포된이미지살펴보기 033 2.5 요약 040
chapter 3 첫번째 PaaS 이미지 043 3.1 워드프레스이미지 043 3.2 설정추가 045 3.3 목표설정 047 3.3.1 캐시기능추가 048 3.3.2 업로드제한변경 049 3.3.3 플러그인설치 052 3.4 설정유지 059 3.5 Github를통한이미지호스팅 059 3.6 Docker 레지스트리허브를통한이미지배포 062 3.6.1 빌드자동화 062 3.7 요약 065 chapter 4 데이터보관과명령어인자전달 067 4.1 데이터볼륨 067 4.1.1 호스트디렉터리를데이터볼륨으로사용 068 4.1.2 데이터볼륨컨테이너마운트 069 4.1.3 데이터볼륨의데이터백업및복구 069 4.2 데이터볼륨이미지생성 070 4.2.1 데이터볼륨이미지 070 4.3 Github에서의호스팅 072 4.4 Docker 레지스트리허브에서의퍼블리싱 074 4.5 데이터볼륨컨테이너실행 075 4.6 컨테이너로파라미터전달 077 4.7 파라미터로구성된이미지생성 077 4.8 요약 079
chapter 5 컨테이너연결 081 5.1 수동으로컨테이너연결하기 081 5.2 데이터볼륨컨테이너내용살펴보기 083 5.3 Docker Compose를활용한컨테이너연결 085 5.3.1 Docker Compose 설치 085 5.3.2 Docker Compose 기본명령어 086 5.3.3 Docker Compose를활용한 PaaS 구성 088 5.4 Crane을활용한컨테이너연결 089 5.4.1 Crane 설치 090 5.4.2 Crane 사용법 090 5.4.3 Crane 설정 091 5.5 요약 095 chapter 6 역방향프락시요청 097 6.1 문제설명 097 6.2 해결책찾기 098 6.3 NGINX와 HAProxy를활용한문제해결방법 100 6.3.1 HAProxy를활용한문제해결방법 101 6.3.2 NGINX를활용한문제해결방법 108 6.4 도메인연결자동화 112 6.5 요약 114
chapter 7 PaaS 를통한배포 115 7.1 현방식의문제점 115 7.2 사용가능한도구와서비스들 116 7.3 Dokku - mini-heroku 118 7.3.1 설치 119 7.3.2 Dokku 애플리케이션생성 121 7.3.3 Dokku가동작하는방식 123 7.3.4 Dokku 플러그인 127 7.4 Dokku를활용한워드프레스배포 129 7.4.1 여러애플리케이션실행 134 7.4.2 Dokku에도메인추가 134 7.4.3 더살펴보기 136 7.5 요약 137 chapter 8 끝나지않은이야기 139 8.1 Twelve-Factor 애플리케이션방법론 139 8.2 Flynn 141 8.3 Deis 142 8.4 Rocket 143 8.5 오케스트레이션도구 144 8.6 요약 145
chapter 3 첫번째 PaaS 이미지 이제직접 Dockerfile을작성하여 Docker 레지스트리허브를통해배포하고배포된 Dockerfile로부터컨테이너를생성할준비가되었습니다. 이장에서는다음과같은내용을다룹니다. 자신만의새로운이미지생성 Github을통한이미지호스팅 Docker 레지스트리허브를통한이미지배포 3.1 워드프레스이미지 이예제에서는아파치를웹서버로사용하는공식워드프레스 Docker 이미지를 기본이미지로사용합니다. NOTE 대량트래픽의사이트를호스팅할계획이라면, 아파치대신 NGINX 웹서버를사용하는기본이미지를추천합니다. 필자는 NGINX와 Memcached, WP-FFPC 플러그인들을기반으로둔워드프레스사이트가충분히강력하다는것을경험했습니다. 하지만이설정은꽤나복잡한데다가이책의주제와는거리가멀기때문에관련된설정에대해서는다루지않습니다. 첫번째로, MySQL 컨테이너를실행하고워드프레스컨테이너와함께연결한후 어떤일이일어나는지살펴봅시다. docker run --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql docker run --name some-wordpress --link some-mysql:mysql -d -p 80 wordpress 3 첫번째 PaaS 이미지 - 043
-p 80 플래그로 Docker는내부에서사용하는 80 포트를외부로개방합니다. 호스트에있는어떤포트가내부의 80 포트와연결되었는지는 [ 그림 3-1] 과같이 run docker ps 명령어의 PORTS 항목또는 docker port < 컨테이너 ID 이름 > 명령어로확인할수있습니다. 필자의경우에는호스트의 49154가내부의 80 포트와연결되었습니다. 그림 3-1 개방된포트확인 브라우저에 http://< 호스트 IP>:< 포트번호 > 와같은형태의 URL를입력합니다. Amazon EC2를사용한다면공용도메인을얻을수있으며주소는 http:// ec2-54-187-234-27.us-west-2.compute.amazonaws.com:49154와같은형식이됩니다. URL을입력하면 [ 그림 3-2] 와같이앞에서본설치화면이나타납니다. 그림 3-2 워드프레스설치화면 044 -
워드프레스설치화면이여러분을반긴다면이는워드프레스와 MySQL 컨테이 너가정상적으로실행되었다는뜻입니다. 3.2 설정추가 이제아파치위에서기본적인워드프레스환경을구축했습니다. 하지만일부워드프레스플러그인은웹서버의설정을변경해야만사용할수있습니다. 이렇게워드프레스디렉터리안에있는파일을변경할때는어떻게해야할까요? 가장먼저할일은공식워드프레스저장소를복사하여여러분의저장소로가져오는것입니다. 이렇게함으로써 Dockerfile이어떻게구성되었는지확인해볼수있습니다. 이책을쓰는시점에워드프레스이미지의저장소는 https://github. com/docker-library/wordpress입니다. 이링크는 Docker 레지스트리허브의워드프레스저장소페이지에서도찾아볼수있습니다. 이제이링크를클릭합니다. Docker 이미지를위해이저장소를복사 clone 또는포크 fork 하거나그냥소스전체를다운로드할수있습니다. 여러분만의 Dockerfile을생성한이후에는더이상사용하지않으므로방법은중요하지않습니다. 이이미지는단지테스트와분석을위한목적으로사용됩니다. 필자의경우에는 [ 그림 3-3] 과같이 EC2 인스턴스에서소스를다운로드하였습니다. 3 첫번째 PaaS 이미지 - 045
그림 3-3 워드프레스공식이미지다운로드화면 텍스트편집기를사용하여 Dockerfile을엽니다. 필자의경우에는터미널에서작업을실행하기때문에 vi apache/dockerfile 명령어를사용하여파일을열수있습니다. 현재공식워드프레스이미지에서사용하는 Dockerfile의내용은다음과같습니다 (2016년 5월 9일업데이트기준 ). FROM php:5.6-apache RUN a2enmod rewrite expires # install the PHP extensions we need RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev && rm -rf / var/lib/apt/lists/* \ && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \ && docker-php-ext-install gd mysqli opcache # set recommended PHP.ini settings # see https://secure.php.net/manual/en/opcache.installation.php RUN { \ 046 -
echo 'opcache.memory_consumption=128'; \ echo 'opcache.interned_strings_buffer=8'; \ echo 'opcache.max_accelerated_files=4000'; \ echo 'opcache.revalidate_freq=60'; \ echo 'opcache.fast_shutdown=1'; \ echo 'opcache.enable_cli=1'; \ } > /usr/local/etc/php/conf.d/opcache-recommended.ini VOLUME /var/www/html ENV WORDPRESS_VERSION 4.5.2 ENV WORDPRESS_SHA1 bab94003a5d2285f6ae76407e7b1bbb75382c36e # upstream tarballs include./wordpress/ so this gives us /usr/src/wordpress RUN curl -o wordpress.tar.gz -SL https://wordpress.org/wordpress-${wordpress_ VERSION}.tar.gz \ && echo "$WORDPRESS_SHA1 *wordpress.tar.gz" sha1sum -c - \ && tar -xzf wordpress.tar.gz -C /usr/src/ \ && rm wordpress.tar.gz \ && chown -R www-data:www-data /usr/src/wordpress COPY docker-entrypoint.sh /entrypoint.sh # grr, ENTRYPOINT resets CMD now ENTRYPOINT ["/entrypoint.sh"] CMD ["apache2-foreground"] 공식워드프레스이미지는 php:5.6-apache 이미지를기본이미지로사용하며워드프레스 4.5.2를다운로드한후 /usr/src/wordpress 경로로압축을해제합니다. 이후에는 ENTRYPOINT 항목을추가하고 Apache2 서버를포그라운드 foreground 에서실행합니다. 3.3 목표설정 다운로드한워드프레스이미지를목적에맞게사용하려면 Dockerfile 을 3 번수 정해야합니다. 이번예제의목표는다음과같습니다. 3 첫번째 PaaS 이미지 - 047
아파치에캐시기능추가 (WP Super Cache 플러그인사용 ) PHP 와아파치에설정된업로드제한변경 두가지플러그인추가 (WP Super Cache 와 WP Mail SMTP) 3.3.1 캐시기능추가 WP Super Cache 플러그인을사용하여캐시기능을추가하는데는간단한두가지작업이필요합니다. 바로아파치에서 mod_headers와 mod_expires 모듈을활성화하는것입니다. 아파치에서는 a2enmod 명령어로모듈을활성화할수있고, a2dismod 명령어로비활성화할수있습니다. 원하는모듈을추가하는일은 Dockerfile 안에있는명령어뒤에필요한모듈을추가하는것만으로간단하게해결됩니다. 명령어를수정하였으니새로운이미지를빌드하여어떤일이발생하는지살펴봅시다. PHP를소스로부터컴파일하기때문에빌드과정이꽤오랜시간이걸릴수있습니다. 여기서우리가살펴보아야할내용은모듈이제대로활성화되었는지확인하는일입니다. 모듈이제대로활성화되었는지는빌드를실행한후수초후에나타납니다. 수정한 Dockerfile로빌드를수행하기위해다음명령어를실행합니다. docker build t mod-wp./apache/ -t mod-wp 플래그로새로생성된이미지의이름을 mod-wp 로지정합니다. [ 그림 3-4] 은앞의과정을자세하게나타내고있습니다. 별다른에러없이빌드가진행 되었다면, WP Super Cache 플러그인을사용하기위한준비가되었습니다. 048 -
그림 3-4 아파치모듈이활성화된 Docker 이미지빌드화면 3.3.2 업로드제한변경 PHP에서는기본적으로파일업로드크기가 2MB로제한되어있습니다. 특히모바일에서블로그글을포스트한다면, 모바일에서찍은사진이나비디오는 2MB 를넘는일이일반적이므로이제한은너무작다고볼수있습니다. 우리는블로그에비디오를직접업로드하려고하니제한을 32MB로변경해보겠습니다. 파일업로드제한을변경하려면 PHP 설정파일에서 upload_max_filesize와 post_max_size 파라미터값이변경되어야합니다. 워드프레스이미지에서기본이미지로사용하는 php:5.6-apache를살펴보면, Dockerfile 안에서데비안리눅스와 PHP를실행합니다. PHP 설정파일은기본적으로 /usr/local/etc/php/conf.d/ 디렉터리에있습니다. 이는즉, 이디 3 첫번째 PaaS 이미지 - 049
렉터리에파일을추가하면 Dockerfile 에서이파일을읽어설정을적용한다는 뜻이됩니다. NOTE PHP 5.6 을위한 Dockerfile 은 https://github.com/docker-library/php/blob/master/5.6/ Dockerfile 에서찾을수있습니다. 앞에서말한것처럼업로드제한이낮다는것을확인하기위해 [ 그림 3-5] 와같이아무런설정도추가하지않은워드프레스컨테이너를실행한후 Media 항목에서 [Add New] 버튼을클릭합니다. [ 그림 3-5] 에서보이는것과같이현재업로드제한이 2MB로설정되어있습니다. 그림 3-5 업로드제한확인 자이제앞에서언급한두파라미터가추가된 upload-limit.ini 이라는파일을 생성한후설정디렉터리에추가해봅시다. 다음명령어들은한줄에걸쳐작성할 수있습니다. 이명령어를앞서캐시를위해수정한명령어바로위에추가합니다. RUN touch /usr/local/etc/php/conf.d/upload-limit.ini \ && echo "upload_max_ filesize = 32M" >> /usr/local/etc/php/conf.d/upload-limit.ini \ && echo "post_ max_size = 32M" >> /usr/local/etc/php/conf.d/upload-limit.ini 050 -
#Paste above this line. RUN a2enmod rewrite expires headers 이제다시한번이미지를빌드하여오류없이정상적으로빌드되는지확인합니다. 이미지이름이이미존재한다는오류를보게된다면 docker rmi mod-wp 명령어로이미지를삭제하거나새로빌드하려는이미지의이름에 mod-wp:latest 와같이태그를붙여최신버전을의미하도록만들수있습니다. 빌드가끝나면워드프레스관리자인터페이스에서업로드제한이변경되었는지 확인하기위해새로운컨테이너를생성합니다. 새로생성된이미지로부터컨테이 너를생성하는명령어는다음과같습니다. docker run --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql docker run --name some-wordpress --link some-mysql:mysql -d -p 80 mod-wp:latest 이제더큰파일들을업로드할수있게되었습니다. 2MB 가넘는파일을직접업 로드하여변경사항이잘적용되었는지확인해보기바랍니다. 그림 3-6 변경사항이적용된워드프레스업로드화면 3 첫번째 PaaS 이미지 - 051
한빛리얼타임 한빛리얼타임은 IT 개발자를위한전자책입니다. 요즘 IT 업계에는하루가멀다하고수많은기술이나타나고사라져갑니다. 인 터넷을아무리후져도조금이나마정리된정보를찾기도쉽지않습니다. 또한, 잘정리되어책으로나오기까지는오랜시간이걸립니다. 어떻게하면조금이라 도더유용한정보를빠르게얻을수있을까요? 어떻게하면남보다조금더빨 리경험하고습득한지식을공유하고발전시켜나갈수있을까요? 세상에는수 많은종이책이있습니다. 그리고그종이책을그대로옮긴전자책도많습니다. 전자책에는전자책에적합한콘텐츠와전자책의특성을살린형식이있다고생 각합니다. 한빛이지금생각하고추구하는, 개발자를위한리얼타임전자책은이렇습니다. 1 2 ebook First - 빠르게변화하는 IT 기술에대해핵심적인정보를신속하게제공합니다 500페이지가까운분량의잘정리된도서 ( 종이책 ) 가아니라, 핵심적인내용을빠르게전달하기위해조금은거칠지만 100페이지내외의전자책전용으로개발한서비스입니다. 독자에게는새로운정보를빨리얻을기회가되고, 자신이먼저경험한지식과정보를책으로펴내고싶지만너무바빠서엄두를못내는선배, 전문가, 고수분에게는좀더쉽게집필할수있는기회가될수있으리라생각합니다. 또한, 새로운정보와지식을빠르게전달하기위해 O'Reilly의전자책번역서비스도하고있습니다. 무료로업데이트되는전자책전용서비스입니다 종이책으로는기술의변화속도를따라잡기가쉽지않습니다. 책이일정분량이상으로집필되고정리되어나오는동안기술은이미변해있습니다. 전자책으로출간된이후에도버전업을통해중요한기술적변화가있거나저자 ( 역자 ) 와독자가소통하면서보완하여발전된노하우가정리되면구매하신분께무료로업데이트해드립니다.
3 4 독자의편의를위해 DRM-Free 로제공합니다 구매한전자책을다양한 IT 기기에서자유롭게활용할수있도록 DRM-Free PDF 포맷으로제공합니다. 이는독자여러분과한빛이생각하고추구하는전자책을만들어나가기위해독자여러분이언제어디서어떤기기를사용하더라도편리하게전자책을볼수있도록하기위함입니다. 전자책환경을고려한최적의형태와디자인에담고자노력했습니다종이책을그대로옮겨놓아가독성이떨어지고읽기어려운전자책이아니라, 전자책의환경에가능한한최적화하여쾌적한경험을드리고자합니다. 링크등의기능을적극적으로이용할수있음은물론이고글자크기나행간, 여백등을전자책에가장최적화된형태로새롭게디자인하였습니다. 앞으로도독자여러분의충고에귀기울이며지속해서발전시켜나가겠습니다. 지금보시는전자책에소유권한을표시한문구가없거나타인의소유권한을표시한문구가있다면위법하게사용하고있을가능성이큽니다. 이경우저작권법에따라불이익을받으실수있습니다. 다양한기기에사용할수있습니다. 또한, 한빛미디어사이트에서구매하신후에는횟수와관계없이다운로드하실수있습니다. 한빛미디어전자책은인쇄, 검색, 복사하여붙이기가가능합니다. 전자책은오탈자교정이나내용의수정 보완이이뤄지면업데이트관련공지를이메일로알려드리며, 구매하신전자책의수정본은무료로다운로드하실수있습니다. 이런특별한권한은한빛미디어사이트에서구매하신독자에게만제공되며, 다른사람에게양도나이전은허락되지않습니다.