Docker에 관해서는 아래의 읽을거리를 참고하세요.

ROR Lab <Docker를 이용한 손쉬운 레일스 배포> 세미나: https://www.facebook.com/naverd2/posts/505653179563380

<가장 빨리 만나는 Docker> : https://pyrasis.com/book/DockerForTheReallyImpatient/Chapter01


참고로 macOS Sierra 환경에서 작업하였다. 리눅스 환경에서는 docker 명령을 실행할때 항상 sudo를 추가해야 한다. 번거롭다면 관리자 그룹에 추가시켜주자.


배포하기위한 'rails-new-docker'라는 이름의 간단한 앱을 만든다. static page로 'hello docker'를 띄워보자.

$ rails new rails-new-docker

$ cd rails-new-docker

$ vi Gemfile

...

# Use high_voltage for static page

gem 'high_voltage', '~> 3.0'

...

$ bundle install

$ mkdir app/views/pages

$ vi app/views/pages/home.html.erb

<h1>hello docker!!</h1>


remote 저장소에 소스를 올린다. docker 컨테이너에 로컬의 소스를 복사해서 넣을 수도 있겠으나, 배포의 목적으로 만드는 것이기 때문에 다른 호스트에서 컨테이너를 실행할때 소스코드를 받아오기 위해 remote 저장소에 올린다.

$ git init

$ git add .

$ git commit -m 'first commit'

$ git remote add origin [리모드 저장소 주소]

$ git push origin master


Docker 이미지를 만들기 위한 Dockerfile을 생성한다.

Dockerfile

FROM ubuntu
MAINTAINER stardust(handhee7@gmail.com)

# 아래는 자신의 앱에 관한 필요한 설정을 만들면 된다.
# Run upgrades
RUN apt-get update

# Install basic packages
RUN apt-get -qq -y install git curl build-essential openssl libssl-dev python-software-properties python g++ make
RUN apt-get -qq -y install libsqlite3-dev
RUN apt-get -qq -y install nodejs

# Install Ruby
RUN apt-get -qq -y install ruby-full
RUN gem install bundler --no-ri --no-rdoc
RUN gem install foreman compass

# Install rails-new-docker
WORKDIR /app
RUN git clone https://github.com/Stardust-kr/rails-new-docker.git /app
RUN bundle install --without development test

# Run rails-new-docker
ENV SECRET_KEY_BASE dockerkeybase
ENV RAILS_ENV production
EXPOSE 5959
CMD foreman start -f Procfile

foreman을 활용하여 웹 서버시 수행될 명령을 Procfile에 미리 기록하여 사용할 수 있다. 대신 쉘 스크립트를 활용할 수 있다.


Procfile

web: bundle exec rails server -p 5959


rails_12factor 젬을 추가하여 로그를 표준출력으로 나오게 한다. docker logs [CONTAINER NAME OR ID]를 입력했을 때 앱에 관한 로그를 볼 수 있다.


Gemfile

# Use rails_12factor for stdout logs
gem 'rails_12factor'


다시 리모트 저장소에 푸시한다. Dockerfile은 코드에 포함될 필요는 없지만 동일한 앱을 구성하려는 사용자를 위해 코드의 버전과 똑같이 관리될 수 있도록 추가해주었다.


이제 이미지를 만들자. 네임스페이스/이름:태그 형태로 생성할 수 있다.  이미지가 생성되면 해당 이미지를 이용하여 컨테이너를 실행시켜보자. 그리고 실행된 이미지를 확인한다.

$ docker build -t stardustkr/rails-new-docker:0.1 .

$ docker run --name v0.1 -d -p 5959:5959 stardustkr/rails-new-docker:0.1

$ docker ps -l

$ docker logs v0.1


브라우저를 열고 localhost:5959/pages/home에 접속해보자.

실제 사용하는 앱은 데이터베이스를 필요로 할 것이다. 하지만 앱과 데이터베이스가 동시에 존재하는 컨테이너는 만들지 않을것이다. 왜냐하면 새로운 버전의 앱이 만들어져 다시 새로운 이미지를 만들어 배포 한다 가정 했을 때 기존 컨테이너 내부의 데이터베이스는 날아가기 때문이다.


필자는 아마존 RDS를 연결할 것이다. 로컬 호스트의 DB에 연결하든, 다른 외부의 DB의 연결하든 사용자의 마음일 것이다.

앱에 db를 필요로하는 scaffold를 생성하고, docker 이미지에 mysql관련 패키지를 추가로 설치한 다음 외부 db와 연결하여 띄워보자.


$ rails g scaffold post title content

$ rake db:migrate

$ vi Gemfile

...

# Use mysql2

gem 'mysql2'

...

$ vi Dockerfile

...

# Install Mysql

ENV DEBIAN_FRONTEND noninteractive

RUN echo "mysql-client mysql-client/root_password password" | debconf-set-selections

RUN echo "mysql-client mysql-client/root_password_again password" | debconf-set-selections

RUN apt-get install -qq -y mysql-client libmysqlclient-dev

...

$ docker build -t stardustkr/rails-new-docker:0.2 .

$ docker run -i -t -e DATABASE_URL="mysql2://[Mysql 계정명]:[Mysql 계정비밀번호]@[Mysql 서버 주소]/[DB명]" stardustkr/rails-new-docker:0.2 bundle exec rake db:reset

$ docker run --name v0.2 -d -p 5959:5959 -e DATABASE_URL="mysql2://[Mysql 계정명]:[Mysql 계정비밀번호]@[Mysql 서버 주소]/[DB명]" stardustkr/rails-new-docker

$ docker ps -l


만들어진 posts 페이지로 접속해보자.

localhost:5959/posts

rails 앱은 동작하는데 에러 페이지를 띄운다면 로그를 확인해보자.

$ docker logs v0.2


이제 동일한 앱을 서버에 배포해보자. 개인 서버여도 좋고 아마존 등 클라우드 서비스여도 좋다. 여기서는 아마존 ec2에 배포할 것이다.

서버를 설정하기 전에 이미지를 먼저 배포한다. Docker hub에 배포하여 사용하겠다. Docker hub: https://hub.docker.com

github처럼 repository를 만들자. 앱과 똑같은 이름으로 만들었다. 

로컬에서 로그인 하고 push를 하자.

$ docker login --username=[Docker hub 사용자 이름]

$ docker push stardustkr/rails-new-docker:0.2

푸시 끝


ec2는 우분투 이미지로 생성하였다. ec2에 ssh연결하여 docker를 설치하자.

# sudo apt-get update

# sudo apt-get install docker.io

# sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker


이미지를 pull 하고 실행시켜주자. 이미 로컬에서 테스트하면서 db를 초기화 하였으므로 초기화 코드는 없이 진행한다.

# sudo docker pull stardustkr/rails-new-docker:0.2

# sudo docker run --name v0.2 -d -p 80:5959 -e DATABASE_URL="mysql2://[Mysql 계정명]:[Mysql 계정비밀번호]@[Mysql 서버 주소]/[DB명]" stardustkr/rails-new-docker


이제 인스턴스의 publid dns로 접속해보자.

http://[인스턴스 public dns]/hosts

아래와 같이 로컬에서 작업환 환경과 동일하게 표시됨을 알 수 있다. DB를 똑같은것을 적용하였으므로 로컬에서 생성했던 글이 동일하게 표시됨을 알 수 있다.

마지막으로 기존에 만들었던 미용실 프로젝트를 docker로 배포해 볼 것이다.

Gemfile에 rails_12factor를 추가하고 Dockerfile과 Procfile을 추가한다. 위 과정을 동일하게 수행하여 아마존 ec2 인스턴스에 올려보았다.

아래 인스턴스에서 그 결과를 확인 할 수 있다.


http://ec2-52-79-125-65.ap-northeast-2.compute.amazonaws.com


이미지는 docker pull stardustkr/charmbithair:0.1로 받을 수 있다.

github: https://github.com/Stardust-kr/charmbitHair.git

  만든 앱을 동생에게 알려주니 필요로 했던 수준정도로 완성된 것 같긴 하다. 하지만 보이는 화면이 텍스트뿐이었기 때문에 사용함에 불편을 느끼는것 같았다. 제대로 구별 되지 않으니 헷갈려 하는것 같았다. 기능 만큼이나 사용자에게 보여주는 면이 중요하다는걸 느끼게 된다.


  다음 페이지를 통해 내 앱에 Bootstrap관련 설정을 해준다. http://blog.ableit.co.kr/?p=744

  Bootstrap을 사용하려면 이 페이지를 참고하자. 기본적인 사용법이 설명되어있다. 정말 쉽다. http://bootstrapk.com/css/


  Bootstrap이나 디자인에 대한 제대로된 경험이 없어 디자인이 조금 삐뚤빼뚤하지만 사용하기에 지장이 없는 수준으로 만들어보았다. 이 글에서는 rails에 Bootstrap 설정법만 간단히 설명하려 했는데 위 링크를 통해 쉽게 해소가 되므로 적용 결과만 기록하려 한다.


(아래는 예시를 올려놓은 인스턴스이다. 실제 사용되는 서버는 따로 구성하였다.)

http://ec2-52-79-125-65.ap-northeast-2.compute.amazonaws.com

github: https://github.com/Stardust-kr/charmbitHair.git

  기능을 만들고 디자인 하고 서버를 구성하여 배포하는 작업까지 마무리 하였다. 아직 많은 버그와 추가 요구사항이 있으니 지속적으로 수정이 필요할 것이다. Rails를 거의 모를 뿐 아니라 웹 개발도 많이 해보지 않았는데도 이렇게 짧은 시간에 꽤 쓸만한 앱을 만들 수 있었다는건 조금 놀랍다. 이게 rails의 힘이 아닐까 하는 생각이 든다.

  해당 앱은 실제로 사용하기 때문에 지속적으로 수정 하면서 rails를 익혀나갈 것이다. 그리고 다른 개발방법으로 또 다른 앱을 만들어 볼까 하는 새로운 호기심도 든다.


<코끼리 공장의 해피엔드> 무라카미 하루키 | 김난주 옮김 | 안자이 미즈마루 그림 | 문학동네

<발렌타인데이의 무말랭이> 무라카미 하루키 | 김난주 옮김 | 안자이 미즈마루 그림 | 문학동네

<세일러복을 입은 연필> 무라카미 하루키 | 김난주 옮김 | 안자이 미즈마루 그림 | 문학동네

<쿨하고 와일드한 백일몽> 무라카미 하루키 | 김난주 옮김 | 안자이 미즈마루 그림 | 문학동네

<해뜨는 나라의 공장> 무라카미 하루키 | 김난주 옮김 | 안자이 미즈마루 그림 | 문학동네

    (이상 5권은 문학동네에서 출간한 무라카미 하루키 에세이 걸작선 세트)

<라오스에 대체 뭐가 있는데요?> 무라카미 하루키 | 이영미 옮김 | 문학동네


<후와후와> 무라카미 하루키 | 권남희 옮김 | 안자이 미즈마루 그림 | 비채

<무라카미 하루키의 위스키 성지여행> 무라카미 하루키 | 이윤정 옮김 | 문학사상사

    (이상 2권은 서점에서 읽은 책)

 

나는 무라카미 하루키의 에세이를 추천한다.

 

왜 하루키의 에세이인가?

하루키가 세계적인 인물임을 모르는 사람은 없을 것이다. 하루키 신드롬은 이제 한물간 유행으로 여겨질 정도로 많은 독자의 사랑을 받는 작가이다. 단순히 하루키를 추천하는 것은 마치 웃긴 예능인을 추천해준다며 유재석을 언급하는 것과 다를 게 없는 시시한 이야기일 것이다.



교보문고에 등록된 <노르웨이의 숲> 상품정보에 있는 저자 소개 부분이다. 에세이에 대한 짤막한 소개가 들어있긴 하나 전반적으로 그를 대표하는 건 소설이다. 아마 그를 추천하는 대부분 사람도 소설을 두고 한 말일 것이다. 하지만 나는 그의 소설을 잘 이해하지 못한다. 내가 처음이자 마지막으로 읽은 그의 소설은 <1Q84>이다. 당시 하루키의 신작 발표로 나라가 떠들썩했기에 왜 그렇게 인기가 많은지 직접 알아보고자 읽었다. 세 권을 내리읽으면서도 그가 말하고자 하는 바를 쉽게 이해하지 못했고 난해한 예술영화를 보는듯한 느낌을 받았었다. 그 이후로 그의 책을 찾아보지 않았다. 그래서 많은 사람의 생각과 달리 나는 그의 소설을 추천하진 않는다.

하지만 그는 저자 소개에 언급된 소설 만큼 많은 에세이도 발표했다. 여행을 좋아하는 나는 서점에서 우연히 여행에 관한 하루키의 책 <라오스에 대체 뭐가 있는데요?>를 접하고 그의 에세이에 푹 빠져들었다. 그리고 지난해 그의 에세이만 6권을 더 읽었다. 그의 에세이에는 소설에서 느꼈던 것과는 전혀 다른 분위기를 풍겼다. 하루키 팬에게는 딱히 새로운 이야기가 아닐 수 있다. 나와 같이 하루키의 소설만 알고 있었을 뿐 그의 에세이에 특별한 관심이 없던 사람에게는 신선한 경험이 될 것으로 생각한다. 그래서 나는 하루키라는 작가가 아닌 하루키의 에세이를 추천한다.

 

어떤 매력을 가지고 있는가?

하루키 에세이의 가장 큰 매력은

재미라고 생각한다. 그냥 소소한 재미가 아니라 말 그대로 미소 짓게 되고, 가끔은 소리 내서 깔깔거릴 수도 있는 재미를 그의 에세이에서 만날 수 있다. 예능이나 드라마로만 재미를 얻을 수 있는 것이 아니라 책에서도 즐거움을 느낄 수 있다는 것을 깨닫게 된다.

또 다른 매력은 여행이다. 하루키 에세이를 세 가지 테마로 분류한다면 일상, 재즈, 그리고 여행이라고 말할 수 있을 것 같다. 그중에서 여행에 관한 테마를 이야기하는 이유는 하루키가 속된말로 프로여행러라고 불릴 수 있을 정도로 엄청난 여행 경험을 자랑하고 있기 때문이다. 한 해 절반 이상을 해외에서 체류하고 유럽과 미국에 몇 년간 거주하면서 경험한 다양한 이야기들, 그리고 그만의 여행 방법은 나와 같은 여행을 좋아하는 독자들의 마음을 흔들기에 충분한 매력을 가지고 있다. 소설가라는 어딘가에 얽매이지 않은 직업을 가지고 이리저리 자유롭게 유랑하는 모습은 내가 하고 싶은 삶의 모습일 뿐만 아니라 수많은 사람의 꿈이기도 할 것이다. 나의 꿈을 누군가가 대신 실현해주는 모습을 보는 재미도 쏠쏠하다.

마지막 매력은 긍정적이고 밝은 분위기다. 최근 다양한 힐링에세이류가 서점에 쏟아지고 있는데 오히려 직접적인 위로의 메시지를 담고 있지 않은 하루키의 에세이를 보면서 더 많은 위안을 느낄 수 있을 것으로 생각한다. 여행을 통해 많은 문화를 경험한 덕분인지, 그의 에세이에서는 다양한 생각에 대한 넓은 관용을 보여주며 곤란해 보이는 상황에도 긍정적인 마인드를 잃지 않는다. 그의 여행에세이에서는 현지에서 렌터카를 사용하는 이야기가 종종 나오는데, 자신이 원했던 것과는 다른 차를 받았음에도 끝에는 이러저러한 이유로 나름대로 색다른 재미를 느낄 수 있었다로 마무리 지어지는 모습을 보면 그가 얼마나 긍정적인 사람인지 가늠할 수 있게 된다(혹은 둔감한 바보가 아닐까 하는 생각이 들 정도). 그런 긍정적이고 넓은 이해심을 보여주는 이야기를 통해 세상을 다르게 바라볼 수 있게 되는듯하고, 나의 사소한 고민이 아닌 범인간적인 위로를 받을 수 있다.

 

어떻게 읽을까?

정말 읽기 쉬운 책이라고 생각한다. 위에서 언급한 하루키 에세이 걸작선 세트에 있는 책은 그가 잡지에 연재하면서 쓴 글을 책으로 엮어낸 것이다. 따라서 두-세장 정도에 하나의 이야기가 쓰여 있다. 그와 단짝인 것처럼 보이는 안자이 미즈마루의 유쾌한 삽화도 이야기마다 꼭 하나씩 들어가 있다. 세계적인 소설가다운 간결하면서도 몰입력 있는 문체는 이 짧은 글을 더더욱 쉽게 만들어 준다.

특별한 깊은 교훈을 담는 책도 아니고 중요한 정보를 전달하는 책도 아니다. 가볍게 읽으면 좋은 책이다. 머리 쓰지 않고 여유로운 휴식을 취하고 싶을 때 TV나 인터넷이 아니라 독서를 하고 싶다면 이만큼 좋은 책이 없다. , 깊게 집중하기 어려운 환경에서 시간을 보내야 할 경우, 예를 들면 소란스러운 카페나 버스 또는 기차에서도 집중하려는 노력 없이도 쉽게 몰입해서 읽을 수 있다. 마지막으로는 나의 경우인데 어려운 책을 읽을 때 해독의 방법으로 하루키의 에세이를 사용했다. 책으로 인해 얻은 피로를 다른 활동으로 푸는 게 아니라 다시 책으로 해독하는 것이다. 나처럼 책을 많이 읽고 싶어 하면서도, 막상 책을 펴면 피로가 느껴지는 사람들에게 이렇게 번갈아 읽기는 절대적인 독서량을 늘리기에 좋은 방법이라 생각한다.

 

책에 흥미를 붙이고 싶은 사람, 여행 방법이나 그곳의 문화를 나열한 에세이가 아니라, 여행을 통해 생각하고 느끼는 것에 공감하고 싶은 여행광, 하루키의 소설이 아닌 색다른 모습을 보고 싶어 하는 독서광에게 하루키의 에세이를 추천한다.

+ Recent posts