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]
-
credential 파일이 있어도 접근 키 에러가 발생할 경우 다음 옵션을 추가함.
-
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