티스토리 뷰

프로그래밍 공부/Ruby on Rails : 배포

Docker 설치 및 배포 (글 작성중)

마음 따뜻한 개발자, 나른한 하루 2020. 9. 27. 03:45
  • 알림

해당 글은 아직 작성중이다보니 개념 설명에 있어선 좀 써야할 부분이 많습니다.

(현재 내용은 실습 위주로 작성되어 있음을 알립니다.)

 

내용 편집이 끝나면 '알림' 부분의 내용은 지워낼 겁니다.

 

 

 

  • Docker 설치에 있어 컴퓨팅 환경

해당 글 작성에 있어, 저는 다음 컴퓨팅 환경에서 실습을 했습니다.

  1. AWS EC2 : t2.micro

  2. ubuntu 18.04

 

 

  • 도커, 거 무엇이고 왜 쓰는고?

 

세상에는 다양한 OS가 존재합니다 : 윈도우, Ubuntu, Linux, ...

그리고 각 OS마다 패키지에 대한 설치방법이 다릅니다.

 

또한 같은 OS이라 할지에도, OS는 다양한 버전이 존재합니다 : Ubuntu 18.04, Ubuntu 16.04, ...

 

OS에 대한 차이라던지, 서버 버전에 대한 차이 때문에 설치과정에 있어 OS 혹은 서버 버전에 따라 중간에 과정이 제대로 이루어지지 않을 수 있습니다.

* 개인적인 사례로서는 Ubuntu에서 Nginx 설치에 있어 이 문서를 참고해서 설치 시, 16.04에서는 잘 되나, 18.04에서는 설치도중 문제가 발생합니다.

 

위와같이 도커는 어떠한 환경에서든, 어떠한 버전에서든 어떤 차이에 따라 설치가 안된다는 문제를 극복해낸다는 장점이 있습니다. 또한 Docker 파일 기록을 기반으로 패키지도 한번에 설치되다 보니, 일일이 터미널에 한줄한줄 입력해내는 수고를 들일 필요도 없는것도 하나의 장점입니다.

 

 

 

  • 도커 속 용어

1. 컨테이너

개별 Software의 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 기반환경 또는 다른 실행환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술

 

2. 도커

컨테이너를 관리하는 플랫폼

 

다양한 프로그램, 실행환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해줍니다. 백엔드 프로그램, 데이터베이스 서버, 메시지 큐등 어떤 프로그램도 컨테이너로 추상화할 수 있고 조립PC, AWS, Azure, Google cloud등 어디에서든 실행할 수 있습니다.

 

3, 이미지

컨테이너 실행에 필요한 파일과 설정값등을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않습니다.

 

## Dockerfile (샘플 예시안)

# vertx/vertx3 debian version
FROM subicura/vertx3:3.3.1
MAINTAINER chungsub.kim@purpleworks.co.kr


ADD build/distributions/app-3.3.1.tar /
ADD config.template.json /app-3.3.1/bin/config.json
ADD docker/script/start.sh /usr/local/bin/
RUN ln -s /usr/local/bin/start.sh /start.sh


EXPOSE 8080
EXPOSE 7000


CMD ["start.sh"]

 

도커는 이미지를 만들기 위해 Dockerfile이라는 파일에 자체 DSLDomain-specific language언어를 이용하여 이미지 생성 과정을 적습니다. 추후에 문법에 대해 자세히 다루겠지만 위 샘플을 보면 그렇게 복잡하지 않다는 걸 알 수 있습니다.

 

서버에 어떤 프로그램을 설치하려고 이것저것 의존성 패키지를 설치하고 설정파일을 만들었던 경험이 있다면 더 이상 그 과정을 블로깅 하거나 메모장에 적지 말고 Dockerfile로 관리하면 됩니다. 이 파일은 소스와 함께 버전 관리 되고 원한다면 누구나 이미지 생성과정을 보고 수정할 수 있습니다.

 

4. 빌드

 

 

  • Chapter 1 : Docker 설치 전 작업 (ubuntu 18.04 기준)

1. Docker 설치 전, ubuntu 설치패키지를 update 해줍니다.

sudo apt-get update

 

2. ubuntu 환경에서 docker 설치에 필요한 패키지를 설치합니다.

sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common

 

3. Docker GPG Key를 추가해줍니다.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

 

4. key가 잘 등록되었는지 확인합니다.

sudo apt-key fingerprint 0EBFCD88

 

5. 안정적인 도커 버전 설치를 위해 도커 공식 저장소를 설치합니다.

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

 

 

  • Chapter 2 : Docker 설치 (ubuntu 18.04 기준)

1. 이제 본격적으로 Docker 엔진을 설치해봅시다.

아래 명령어를 입력해서 Docker 관련 패키지를 설치해주세요.

sudo apt-get install docker-ce docker-ce-cli containerd.io

 

2. 특정 버전 의 Docker Engine 을 설치하기 전에 앞서, 사전에 설치/사용 가능한 Docker 버전을 확인 후 설치를 해보겠습니다.

 

설치 가능한 Docker 버전을 확인합니다.

apt-cache madison docker-ce
apt-cache madison docker-ce-cli

설치 가능한 docker-ce 및 docker-ce-cli 조회

3. 아래 명령어를 통해 Docker에서 권장하는 버전으로 자동으로 설치합니다.

sudo apt-get install docker-ce docker-ce-cli containerd.io

 참고  특정 버전을 지정한 채로도 Docker 설치를 할 수 있습니다.

# sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

sudo apt-get install docker-ce=5:19.03.13~3-0~ubuntu-bionic docker-ce-cli=5:19.03.13~3-0~ubuntu-bionic containerd.io

 

4. Docker가 잘 설치되었는지 확인하고자 'hello world' 라는 이름의 이미지를 실행해봅니다.

처음에는 'hello-world' 이미지가 없다보니 자동으로 설치가 진행되고, 실행에 대한 결과를 출력합니다.

sudo docker run hello-world

 

6. 후에 Docker 이미지를 up 함에 있어, docker-compose 명령어를 활용해야 하는데 이를 위한 패키지를 설치해줍니다.

1) 혹시 모르니 이전에 설치되었던 docker-compose 패키지를 제거합니다.

sudo apt-get purge docker-compose

 

2) docker-compose 패키지를 설치합니다.

sudo apt-get install -y docker-compose

 

 

  • Chapter 3 : Ruby on Rails에 Docker 적용하기 (ubuntu 18.04 기준)

1. Docker을 적용하기 전에 있어, Raips application을 빌드하는데 있어, 몇 개의 파일 생성과 그 속에 Docker 설정 관련 내용이 기록되어 있어야 합니다.

 

Rails application은 Dockerfile에 종속된 Docker 컨테이너 내에서 실행됩니다.

 

1)  Dockerfile  파일 생성 및, 해당 파일에 다음 내용을 작성해주세요.

## Dockerfile

FROM ruby:2.6.3
RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp

# Add a script to be executed every time the container starts.
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

 참고  ruby 버전은 2.6.3, DB는 postgresql을 사용합니다.

 

2)  Gemfile  생성 및 아래 내용을 작성해주세요.  rails new  를 통해 rails application을 생성함에 있어, 아래 코드를 기반으로 gem이 기본적으로 설정됩니다. 

source 'https://rubygems.org'
gem 'rails', '~>5'

 참고  rails는 5버전 중 최신버전이 설치됩니다.

 

3) Dockerfile build를 위해 사전에  Gemfile.lock  파일을 생성해둡니다.

아래 명령어를 터미널에 입력하면 빈 내용의  Gemfile.lock  을 생성합니다.

touch Gemfile.lock

 

4) Docker가 실행되면 자동으로 서버가 실행됩니다. 하지만 Docker을 통해 서버가 실행됨에 있어 이미 이전에 서버가 실행된 관계로 서버실행이 안될 경우를 막기위해 서버 process를 kill, 그 외 bash shell 에서 터미널 script가 실행되도록

 entrypoint.sh  파일 생성 및 아래 내용을 작성해주세요.

#!/bin/bash
set -e

# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid

# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

 부록  #!bin/bash의 의미

 

5) 마지막으로, Docker의 이미지를 관리하는  docker-compose.yml  파일을 생성하고, 아래 내용을 입력해주세요.

version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: 12345678
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/catchdeal_api_s2
    ports:
      - "3000:3000"
    depends_on:
      - db
  app: &app
    image: grepp/rails-webapp:1.0.1
    tmpfs:
      - /tmp
  backend: &backend
    <<: *app
    stdin_open: true
    tty: true
    volumes:
      - .:/app:cached
      - rails_cache:/app/tmp/cache
      - bundle:/bundle
      - node_modules:/app/node_modules
      - packs:/app/public/packs
    environment:
      - NODE_ENV=development
      - RAILS_ENV=${RAILS_ENV:-development}
      - BOOTSNAP_CACHE_DIR=/bundle/bootsnap
      - WEBPACKER_DEV_SERVER_HOST=webpacker
      - WEB_CONCURRENCY=1
      - EDITOR=vi
    depends_on:
      - db
  shell:
    <<: *backend
    command: /bin/bash
    ports:
      - '5000:5000'
      - '3002:3002'
volumes:
  mysql:
  bundle:
  node_modules:
  rails_cache:
  packs:

 

2. 이제  docker-compose run  을 통해 Docker을 실행합니다.

그 첫 작업으로 docker을 통해 Rails application을 설치합니다.

docker-compose run web rails new . --force --no-deps --database=postgresql

Docker-compose.yml 파일 내용을 기반으로 패키지 및 Rails가 설치되고 있습니다.

이 작업을 하면서, Local에서 Rails를 구성하는 프로젝트 파일들이 생성되는것도 확인할 수 있습니다.

 

4. 여기서 잠시 생성된 파일들의 owner을 살펴봅시다.

ls -l

생성된 파일들을 보면 전부 owner가 root인 것을 볼 수 있습니다.

저희는 여기서 owner을 일반 계정으로 바꿔줘야 할 필요가 있습니다.

 

Rails를 이루는 구성파일들이 위치한 디렉터리 위치에서 아래 명령어를 입력 해주세요.

sudo chown -R $USER:$USER .

그리고 다시 owner을 살펴보면 일반계정으로 바뀐걸 볼 수 있습니다.

 

5.  Gemfile  을 다시 살펴보면 3의 2)와 다르게 내용이 달라진 것을 볼 수 있습니다.

Gemfile을 다시 갱신하고자, 아래 명령어를 터미널에 입력해주세요.

docker-compose build

 

6. Database 연동을 위해 레일즈 프로젝트 내에 존재하는  config/database.yml  파일을 따로 설정해줘야 합니다.

아래와같이 변경을 해주세요.

default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password: password
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test


production:
  <<: *default
  database: myapp_production

 

7. 이제 모든 준비가 끝났습니다.

docker을 실행해보겠습니다.

1) screen을 통해 background 터미널을 킨 후, 아래 명령어를 실행시킵니다.

docker-compose up

2) 키보드에서 Ctrl + A + D 버튼을 눌러서 screen을 빠져나옵니다.

 참고  다시 Docker가 띄어진 터미널에 접근하려면 아래 명령어를 입력하면 됩니다.

screen -r

 

8. Docker을 통해 Rails 서버를 실행 후 홈페이지 접속을 통해 결과물을 보기전에 앞서, PostgreSQL DB를 생성해줘야 합니다.

터미널에 아래와 같이 입력해서 도커를 통해 DB를 생성시켜주세요.

docker-compose run web rake db:create

 

9. 이제 최종적으로 홈페이지에 접속해서 결과물을 봅시다.

다음과 같이 Docker을 통해 띄어진 서버에서 Rails 서버가 돌아가고 있는 것을 볼 수 있습니다.

 

 

Docker-compose up을 했던 터미널에서도 역시 서버 로그가 동시에 찍히는 것을 볼 수 있습니다.

 

 

  • 부록 : ubuntu 내 Docker 패키지 파일 제거 (ubuntu 18.04 기준)

1. Docker 관련 패키지를 삭제합니다.

sudo apt-get purge docker-ce docker-ce-cli containerd.io

 

2. Docker 패키지를 지운다고 해도 이미지, 컨테이너, 볼륨, 설정파일은 자동으로 삭제되지 않습니다.

이에대한 구성파일들도 삭제를 하고싶으면 아래 명령어를 입력해서 개발자 스스로 삭제해주세요.

sudo rm -rf /var/lib/docker

 

 

 

  • 자료 참고

1. Docker 공식문서 : Ubuntu에 Docker Engine 설치

2. Docker 공식문서 : Ruby on Rails에 Docker 적용하기

3. Docker 설치 법 몇몇 Docker 설정을 들여볼 수 있는 명령어들

4. 44bits.io : 컨테이너 기초부터 서버 배포까지

5. Dockerfile의 CMD와 ENTRYPOINT 차이 및 docker-compose.yml의 command

6. Docker 용어 정리

 

댓글
댓글쓰기 폼
공지사항
Total
54,001
Today
29
Yesterday
104
링크
«   2020/11   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          
글 보관함