1. 개요

<Docker 가상 환경 구축 입문>의 <Chapter 10. AWS를 활용한 Rails 애플리케이션 배포>를 읽고 정리한 내용으로,

AWS에 Docker Swarm을 구축하는 부분까지 설명합니다.

# 앞에서 구성한 ruby on rails 개발환경이 있다는 전제하에 진행함. (참고: https://sarc.io/index.php/cloud/1671-docker-12-ruby-on-rails)


2. 운영 환경용 이미지 작성

  • AWS에서 제공하는 데이터베이스 서비스인 RDS를 활용하는 예시.
    • Swarm 모드로 데이터베이스 컨테이너를 동작시킬 경우, 여러대의 노드에서 데이터베이스 서버를 동작시키는 것에 어려움이 있음.
    • 각 노드에 장애가 발생할 경우, 단순히 새로운 데이터베이스 노드를 기동시키는 것이 아니라, 기존 데이터를 전달받아야 함. (정합성을 위한 것)
    • 따라서 단일 Swarm 노드로 구성된 데이터베이스인 경우에는 간단하지만, 그 외에는 장애 발생 시 시스템에 영향이 있을 수 있음.
  • .dockerignore 파일 작성 (이미지에서 제외하고 싶은 파일 명시)
    tmp/*
  • config/database.yml 파일 수정 (RDS 사용을 위해 수정) 
    production:
      <<: default="" host:="">
      database: app_production
      username: app
      password: <%=>
    
  • Dockerfile 수정 
    FROM ruby:2.3.7
    RUN apt-get update -qq && apt-get install -y build-essential nodejs
    RUN mkdir /app
    WORKDIR /app
    COPY Gemfile /app/Gemfile
    COPY Gemfile.lock /app/Gemfile.lock
    RUN bundle install
    COPY . /app
    RUN bundle exec rails assets:precompile RAILS_ENV=production
    RUN bundle exec rails s -b 0.0.0.0 -p 3000
    
  • docker 이미지 빌드하여 레포지터리에 Push
    $ docker build -t snowball1234/rails-app .
    $ docker login
    $ docker push snowball1234/rails-app

 

3. AWS 보안 그룹 생성

  • Swarm 모드에서 사용되는 포트 정보
    • 클러스터 관리용 통신 포트: TCP 2377번
    • 노드 간 통신용 포트: TCP/UDP 7946번
    • 오버레이 네트워크 트래픽 용 포트: UDP 4789번
  • AWS에서 다음과 같이 보안 그룹 생성
     

4. AWS에 Swarm Cluster 생성

  • Amazonec2 드라이버를 사용하여 ec2 생성 
    $ docker-machine create --driver amazonec2 --amazonec2-region ap-northeast-1 --amazonec2-security-group rails-sg manager1
    $ docker-machine create --driver amazonec2 --amazonec2-region ap-northeast-1 --amazonec2-security-group rails-sg worker1
    $ docker-machine create --driver amazonec2 --amazonec2-region ap-northeast-1 --amazonec2-security-group rails-sg worker2
    
    • credential 파일이 있어도 접근 키 에러가 발생할 경우 다음 옵션을 추가함.
      => --amazonec2-access-key [aws_access_key] --amazonec2-secret-key [aws_secret_access_key]
  • AWS의 ec2 탭에서 다음과 같이 ec2가 생성되었음을 확인할 수 있음
    .
  • Swarm Cluster 구성
    $ eval $(docker-machine env manager1)
    $ docker swarm init --advertise-addr [Private IP]
    Swarm initialized: current node (jsc94pm6iy2ebmja5vqwj73rg) is now a manager.
    
    To add a worker to this swarm, run the following command:
    
    docker swarm join --token SWMTKN-1-2wnezq15971rtxfp2hdfky2njm2hwhqdnk43yuf9r5vzwj23j7-672cv9vyjbgbdmdpzi8o4ynma [Private IP]:2377
    
    To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
    
    $ eval $(docker-machine env worker1)
    $ docker swarm join --token SWMTKN-1-2wnezq15971rtxfp2hdfky2njm2hwhqdnk43yuf9r5vzwj23j7-672cv9vyjbgbdmdpzi8o4ynma [Private IP]:2377
    
    $ eval $(docker-machine env worker2)
    $ docker swarm join --token SWMTKN-1-2wnezq15971rtxfp2hdfky2njm2hwhqdnk43yuf9r5vzwj23j7-672cv9vyjbgbdmdpzi8o4ynma [Private IP]:2377
    
    $ eval $(docker-machine env manager1)
    $ docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    jsc94pm6iy2ebmja5vqwj73rg *   manager1            Ready               Active              Leader              19.03.5
    hyptg5adz9t59hydf066im9c8     worker1             Ready               Active                                  19.03.5
    48lafxzzndbsd5xz335szpb35     worker2             Ready               Active                                  19.03.5