Giờ thú tội. Môi trường phát triển của tôi không thay đổi nhiều trong bốn năm tôi làm việc trên Honeybadger. Nhưng trong thời gian đó, Honeybadger đã trở nên phức tạp hơn rất nhiều, phụ thuộc vào khoảng mười dịch vụ để hoạt động.
Đó là lý do tại sao chúng tôi hướng tới Docker để phát triển địa phương. Thay vì mọi nhà phát triển phải thiết lập Postgres, Cassandra, Memcached và phần còn lại, chúng tôi có thể sử dụng docker-compile để tạo ra một môi trường được tạo sẵn. Thật tuyệt vời.
Đương nhiên, tôi bắt đầu tự hỏi việc triển khai một ứng dụng Tài liệu hóa sẽ dễ dàng như thế nào.
Triển khai Với Docker
Docker đi kèm với các tiện ích như docker-machine và docker-swarm được cho là giúp triển khai không đau. Cho đến nay họ vẫn chưa thực hiện lời hứa đó. Nếu bạn muốn đọc tất cả về những khiếm khuyết của họ, hãy xem bài đăng tin tức gần đây của hacker này.
Đó là lý do tại sao tôi chọn tập trung vào ECS (EC2 Container Service) của Amazon.
ECS là gì?
ECS giống như một bản kết hợp đã trưởng thành, sẵn sàng cho sản xuất của docker-soạn và docker-swarm.
Với ECS, bạn có thể nói "Chạy ba bản sao của ứng dụng web của tôi" và nó sẽ xoay vòng một cách thông minh các vùng chứa Docker thích hợp bên trong cụm bản sao EC2 của bạn.
Nó có thể yêu cầu cân bằng tải trên các vùng chứa của bạn và có thể mở rộng cụm của bạn lên hoặc xuống tùy thuộc vào tải.
Tạo ứng dụng Sinatra được tài liệu hóa
Đây là một ứng dụng Sinatra đơn giản. Nó in thời gian hiện tại, vì vậy bạn sẽ biết nếu bạn thấy một phiên bản được lưu trong bộ nhớ cache. Nó cũng in tên của máy tính chạy ứng dụng. Sau đó, chúng tôi sẽ quay nhiều máy chủ chạy ứng dụng này và sử dụng bộ cân bằng tải để định tuyến các yêu cầu. Bằng cách trả lại tên máy chủ, chúng tôi có thể biết máy chủ nào đã phục vụ một yêu cầu cụ thể.
Ứng dụng
Ứng dụng Dockerized Sinatra mà tôi sắp cho bạn xem là phiên bản được viết lại rất nhiều của tcnksm-sample / docker-sinatra.
require 'sinatra'
require 'sinatra/base'
class App < Sinatra::Base
get '/' do
"Hello from sinatra! The time is #{ Time.now.to_i } on #{ `hostname` }!"
end
end
Đây là Gemfile
:
# Gemfile
source 'https://rubygems.org'
gem 'sinatra'
gem 'thin'
... và đây là config.ru
tệp:
$:.unshift(File.dirname(__FILE__))
require 'app'
run App
Dockerfile
Chúng tôi sẽ cần một tệp Dockerfile để tạo hình ảnh Docker cho ứng dụng này. Nó tạo thư mục cho ứng dụng, sao chép các tệp và chạy máy chủ web trên cổng 80.
FROM ruby:2.3.1-slim
RUN apt-get update -qq && apt-get install -y build-essential
ENV APP_ROOT /var/www/docker-sinatra
RUN mkdir -p $APP_ROOT
WORKDIR $APP_ROOT
ADD Gemfile* $APP_ROOT/
RUN bundle install
ADD . $APP_ROOT
EXPOSE 80
CMD ["bundle", "exec", "rackup", "config.ru", "-p", "80", "-s", "thin", "-o", "0.0.0.0"]
Xây dựng và Chạy Hình ảnh
Đầu tiên, chúng ta sẽ yêu cầu Docker xây dựng một hình ảnh từ tệp Docker trong thư mục hiện tại. Sau đó, chúng tôi sẽ chạy nó, ánh xạ cổng 80 của vùng chứa thành localhost:4000.
docker build -t docker-sinatra .
docker run -p 4000:80 docker-sinatra
Để kiểm tra xem nó có hoạt động hay không, hãy mở localhost:4000 trong trình duyệt web của bạn. Bạn sẽ thấy một cái gì đó như thế này:
Triển khai tới ECS
Bây giờ hãy triển khai tới ECS. Chúng tôi sẽ sử dụng trình hướng dẫn thiết lập của họ. Đó có phải là gian lận? Tôi không quan tâm. :) Vì vậy, hãy chuyển đến bảng điều khiển ECS.
Nhấp vào "Bắt đầu". Sau đó nhấp vào "Tiếp tục" trên màn hình tiếp theo. "
Tạo sổ đăng ký Docker của bạn
Bạn thường không tải hình ảnh Docker lên máy chủ sản xuất từ môi trường phát triển của mình. Thay vào đó, bạn gửi hình ảnh đến sổ đăng ký Docker - như dockerhub - và máy chủ sẽ triển khai chúng. Amazon cung cấp sổ đăng ký Docker riêng. Bạn không bắt buộc phải sử dụng nó, nhưng chúng ta sẽ thực hiện ngay bây giờ.
Tôi sẽ đặt tên cho sổ đăng ký của mình là "docker-sinatra":
Đẩy Hình ảnh của bạn vào Sổ đăng ký
Sau đó, tôi được cung cấp một danh sách các lệnh cần chạy để xây dựng hình ảnh của mình và đẩy nó vào sổ đăng ký.
Lần đầu tiên tôi thử điều này, trình chặn quảng cáo của trình duyệt của tôi đã ngăn không cho các lệnh được hiển thị chính xác. Kỳ lạ - tôi biết.
Tạo Định nghĩa Nhiệm vụ của bạn
AWS thích tạo ra những thuật ngữ mới, khó hiểu. "Định nghĩa nhiệm vụ" chỉ đơn giản là một danh sách các vùng chứa sẽ chạy cùng nhau. Nó giống như một Procfile hoặc một cấu hình docker-soạn.
Vì vậy, nếu ứng dụng của bạn có một vùng chứa đang chạy Nginx, một vùng chứa đang chạy Unicorn và một vùng chứa đang chạy Sidekiq thì cả ba có thể được chứa trong "định nghĩa nhiệm vụ" của bạn.
Ứng dụng của chúng tôi đơn giản hơn nhiều. Chúng tôi chỉ có một container. Vì vậy, cấu hình là tối thiểu.
- Tôi sẽ đảm bảo hình ảnh chính xác được lấy từ sổ đăng ký của chúng tôi
- Tôi sẽ ánh xạ cổng 80 từ vùng chứa sang cổng 80 trên phiên bản EC2 đang chạy vùng chứa.
Tạo Dịch vụ của bạn
Thuật ngữ khó hiểu hơn! Cấu hình "dịch vụ" cho phép bạn chỉ định số lượng "tác vụ" (còn gọi là bản sao ứng dụng của bạn) sẽ chạy và cách chúng được cân bằng tải.
Ở đây, tôi muốn ba bản sao ứng dụng của mình chạy với cân bằng tải trên cổng 80.
Điều chỉnh Cụm của bạn
Một cụm là một loạt các phiên bản EC2 điển hình đang chạy phần mềm ECS của Amazon. Bạn có thể làm bất cứ điều gì với chúng mà bạn có thể làm với bất kỳ phiên bản EC2 nào khác. Trong trường hợp này, tôi chỉ định rằng tôi muốn có ba phiên bản t2.micro.
Sau một vài bước xác nhận và chờ khoảng 5 phút, mọi thứ đã sẵn sàng.
Khi dịch vụ của bạn hoạt động, bạn sẽ thấy một màn hình giống như sau:
Thử nghiệm ứng dụng
Bạn có thể nhấp vào tên bộ cân bằng tải để xem chi tiết của nó. Ở đó, bạn sẽ tìm thấy tên miền công cộng của nó. Đặt nó vào trình duyệt của bạn và bạn sẽ thấy ứng dụng mẫu của chúng tôi.
Nếu bạn làm mới một vài lần, bạn sẽ thấy rằng tên máy chủ sẽ thay đổi. Đó là bởi vì bộ cân bằng tải đang cân bằng các yêu cầu của bạn trên cả ba máy chủ.
Đang dọn dẹp
Trình hướng dẫn ECS đã tạo nhiều tài nguyên trong tài khoản AWS của bạn ngay bây giờ. Bạn có thể không muốn để chúng ở đó. Chúng sẽ làm mọi thứ lộn xộn và có thể khiến bạn mất tiền.
May mắn thay, trình hướng dẫn ECS sử dụng CloudFormation để tạo tất cả các tài nguyên của nó. Điều đó có nghĩa là bạn có thể xóa mọi thứ đơn giản bằng cách xóa ngăn xếp CloudFormation.