Mục tiêu của bài đăng này là phát triển ứng dụng trong môi trường càng gần với môi trường triển khai từ xa của bạn càng tốt. Hãy thực hiện việc này bằng Docker Machine and Compose để chuyển một ứng dụng từ phát triển cục bộ sang triển khai từ xa.
Docker Docker Docker
Đầu tiên chúng ta cần cài đặt Docker. Bài đăng này sử dụng tất cả các thành phần Docker mới nhất và tốt nhất tại thời điểm viết bài.
- Docker 1.7.0
- Máy Docker 0.3.0
- Docker Compose 1.3.0
Tôi sẽ giả định rằng bạn đang chạy Docker trong VirtualBox cho phần còn lại của bài đăng.
Vui lòng ký vào sổ lưu bút của chúng tôi
Ứng dụng chúng tôi sẽ triển khai là một cuốn sổ lưu bút đơn giản. Nó đủ để chứng minh một ứng dụng 3 cấp cơ bản. Chúng tôi sẽ bắt đầu với một môi trường phát triển địa phương, nơi chúng tôi sẽ phát triển một ứng dụng web bằng cách sử dụng các công nghệ sau:
- Nginx cho máy chủ web
- Đối với máy chủ ứng dụng:
- Python cho ngôn ngữ lập trình
- Bình cho khuôn khổ web
- Gunicorn cho máy chủ WSGI
- MySQL cho cơ sở dữ liệu
Chúng tôi sẽ làm việc với một repo trên GitHub, vì vậy hãy bắt đầu bằng cách sao chép repo đó.
git clone https://github.com/rackerlabs/guestbook.git -b dmc guestbook
cd guestbook
Cũng khá dễ dàng để mất dấu máy chủ Docker mà bạn đang sử dụng bên dưới. Tôi khuyên bạn nên đặt bí danh này để giúp bạn dễ dàng tìm ra máy chủ mà bạn đang nói chuyện.
alias de='env | grep DOCKER_'
Bây giờ bạn chỉ cần nhập de
để xem những biến môi trường Docker nào được đặt.
Dưới đây là kết quả cuối cùng của việc chuyển ứng dụng của chúng tôi từ phát triển cục bộ sang triển khai từ xa.
Phát triển địa phương
Môi trường phát triển cục bộ của chúng tôi (dev env) khá đơn giản vì chúng tôi không phải thiết lập thông tin đăng nhập hoặc lo lắng về bảo mật. Chúng tôi sẽ đặt hậu tố cho tất cả nội dung dành cho nhà phát triển của chúng tôi bằng “-dev” chỉ để giữ cho nó khác biệt với việc triển khai từ xa của chúng tôi.
Khởi tạo môi trường
Chúng tôi sẽ sử dụng docker-machine để tạo máy chủ Docker cho các vùng chứa của mình. Sau đó, chúng tôi cấu hình Docker để sử dụng máy chủ đó. Cuối cùng, docker -omp sẽ hiển thị toàn bộ env dành cho nhà phát triển của chúng ta.
docker-machine create --driver virtualbox guestbook-dev
docker-machine ip guestbook-dev # note the Guestbook Dev IP Address
eval "$(docker-machine env guestbook-dev)"
docker-compose up
Trong khi công cụ đó đang chạy, hãy đọc qua docker-compo.yml để hiểu những gì nó đang làm cho chúng ta. Nó được nhận xét tốt vì vậy nó phải được tự giải thích. Lưu ý cách nó mở rộng docker-comp-common.yml làm cơ sở cho các thành phần chung. Bạn có thể tìm thấy mô tả đầy đủ về định dạng tệp Docker Compose trong tham chiếu docker-compo.yml.
Khi mọi thứ đã tải xuống và đang chạy, chúng ta cần khởi tạo cơ sở dữ liệu. Chúng tôi sẽ sử dụng một lần chạy vùng chứa ứng dụng của mình để chạy lệnh python tạo bảng trong cơ sở dữ liệu của chúng tôi.
Mở một thiết bị đầu cuối mới và đổi sang sổ lưu bút.
eval "$(docker-machine env guestbook-dev)"
docker-compose run --rm --no-deps app python app.py create_db
Tại sao lại gặp khó khăn khi chạy một vùng chứa một lần cho việc này? Bởi vì docker -omp sẽ tự động chèn các biến môi trường mà chúng ta cần kết nối với cơ sở dữ liệu. Không có cấu hình để chúng tôi thực hiện.
Bây giờ hãy mở trình duyệt của bạn và truy cập Địa chỉ IP của Guestbook Dev mà bạn đã lưu ý ở trên. Vui lòng ký vào sổ lưu bút của chúng tôi.
Thực hiện thay đổi
Hãy đảm bảo rằng chúng tôi có thể tiếp tục phát triển mã ứng dụng của mình một cách nhanh chóng. Có một số tùy chọn cấu hình chính trong docker-compost.yml cho phép chúng tôi làm như vậy. Đọc lại các nhận xét về số lượng và lệnh trong dịch vụ ứng dụng.
Mở app / templates / index.html trong trình soạn thảo văn bản yêu thích của bạn. Thực hiện một thay đổi và lưu nó. Quay lại trình duyệt của bạn và tải lại. Thì đấy!
Triển khai Từ xa
Phần này phức tạp hơn vì chúng ta phải thiết lập thông tin đăng nhập và lo lắng về bảo mật. Nếu chưa có tài khoản Rackspace, bạn có thể nhận tín dụng miễn phí bằng cách đăng ký developer +. Khi tài khoản của bạn đã sẵn sàng, bạn cần tìm khóa API của mình. Đặt các biến môi trường sau trong thiết bị đầu cuối của bạn.
export OS_USERNAME=your-rackspace-username
export OS_API_KEY=your-rackspace-api-key
export OS_REGION_NAME=IAD
Khởi tạo môi trường
Chúng tôi sẽ sử dụng docker-machine để tạo máy chủ Docker cho các vùng chứa của mình.
docker-machine create --driver rackspace guestbook
docker-machine ip guestbook # note the Guestbook IP Address
Bảo mật môi trường
Tuyên bố từ chối trách nhiệm:Điều này thậm chí không gần với cấu hình an toàn nhất có thể. Tập lệnh này chỉ nhằm mục đích an toàn hơn cấu hình mặc định. Không có lời hứa nào được đưa ra về tập lệnh này ngăn không cho máy chủ của bạn bị sở hữu hoặc xe đạp của bạn bị đánh cắp. Những kẻ xấu vẫn ra ngoài để có được bạn. Và việc chạy tập lệnh này không giúp bạn viết mã ứng dụng an toàn!
Cài đặt fail2ban để ngăn các nỗ lực đăng nhập brute force trên máy chủ của bạn và thiết lập tường lửa với ufw để chỉ cho phép các cổng mà chúng tôi cần. Lưu ý rằng không có đầu ra nào xuất hiện cho đến khi lệnh được thực hiện hoàn toàn nên bạn cần kiên nhẫn một chút.
docker-machine ssh guestbook "apt-get update"
docker-machine ssh guestbook "apt-get -y install fail2ban"
docker-machine ssh guestbook "ufw default deny"
docker-machine ssh guestbook "ufw allow ssh"
docker-machine ssh guestbook "ufw allow http"
docker-machine ssh guestbook "ufw allow 2376" # Docker
docker-machine ssh guestbook "ufw --force enable"
Tiếp tục khởi tạo môi trường
Trước khi chúng tôi xây dựng Docker Compose để triển khai từ xa, chúng tôi cần đặt một số biến môi trường cho cơ sở dữ liệu của mình. Các biến môi trường này được sử dụng bởi tệp docker-comp-prod.yml. Chúng tôi làm điều này để ngăn mình gửi dữ liệu nhạy cảm cho GitHub.
export MYSQL_USER=guestbook-admin
export MYSQL_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)
export MYSQL_ROOT_PASSWORD=$(hexdump -v -e '1/1 "%.2x"' -n 32 /dev/random)
echo "MYSQL_USER=$MYSQL_USER"
echo "MYSQL_PASSWORD=$MYSQL_PASSWORD"
echo "MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD"
Bây giờ chúng ta cấu hình Docker để sử dụng máy chủ đó. Cuối cùng, docker -omp sẽ xây dựng và chạy các vùng chứa của chúng tôi trong nền, vì vậy chúng tôi sẽ không thấy bất kỳ thông báo nhật ký đầy màu sắc nào giống như chúng tôi đã làm trong quá trình phát triển cục bộ.
eval "$(docker-machine env guestbook)"
docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d
Trong khi quá trình đó đang chạy, hãy đọc qua docker-comp-prod.yml để cảm nhận những gì nó đang làm cho chúng ta. Lưu ý cách nó được đặt tên tệp docker-compost.yml mặc định, vì vậy chúng tôi không phải đưa tên tệp vào các lệnh docker-comp. Nó được nhận xét tốt vì vậy nó phải được tự giải thích. Nó cũng mở rộng docker-comp-common.yml làm cơ sở cho các thành phần chung.
Khi mọi thứ đã được xây dựng và chạy, chúng ta cần khởi tạo cơ sở dữ liệu. Chúng tôi sẽ sử dụng một lần chạy vùng chứa ứng dụng của mình để chạy lệnh python tạo bảng trong cơ sở dữ liệu của chúng tôi.
docker-compose --file docker-compose-prod.yml run --rm --no-deps app python app.py create_db
Bây giờ, hãy mở trình duyệt của bạn và chuyển đến Địa chỉ IP của Sổ lưu bút mà bạn đã lưu ý ở trên. Vui lòng ký vào sổ lưu bút của chúng tôi.
Thực hiện thay đổi
Chúng tôi không muốn phát triển mã ứng dụng của mình trong môi trường từ xa nhưng chúng tôi muốn dễ dàng triển khai các thay đổi ở đó.
Mở app / templates / index.html trong trình soạn thảo văn bản yêu thích của bạn. Thực hiện một thay đổi và lưu nó. Quay lại trình duyệt của bạn đến Dev Địa chỉ IP và tải lại. Đảm bảo rằng nó được thay đổi như mong đợi trong môi trường phát triển địa phương của bạn.
Bây giờ chúng tôi triển khai thay đổi đó cho môi trường từ xa bằng cách chạy một vài lệnh quen thuộc.
docker-compose --file docker-compose-prod.yml build
docker-compose --file docker-compose-prod.yml up -d
Quay lại trình duyệt của bạn đến Địa chỉ IP của Sổ lưu bút và tải lại. Thì đấy! Thay đổi của bạn đã xuất hiện và dữ liệu của bạn vẫn nguyên vẹn để khởi động.
Tiếp theo là gì?
Bạn sẽ làm gì tiếp theo để tiến thêm một bước này?
Dữ liệu của bạn là phần quan trọng nhất trong ứng dụng của bạn. Bạn cần đảm bảo rằng nó an toàn. Bắt đầu với một kế hoạch dự phòng. Bạn có thể triển khai giải pháp của mình và lưu trữ cơ sở dữ liệu kho công việc cron trong Tệp đám mây. Hoặc bạn có thể đi theo con đường dễ dàng và sử dụng Sao lưu đám mây. Cuối cùng, bạn có thể tạo ra một Cơ sở dữ liệu đám mây có tính khả dụng cao và thay đổi docker-compost.yml để sử dụng nó thay thế.
Kết luận
Tôi hy vọng bạn đã học được cách phát triển ứng dụng trong môi trường càng gần với môi trường triển khai từ xa của bạn càng tốt. Nếu bạn gặp bất kỳ sự cố nào, vui lòng cho chúng tôi biết trong phần nhận xét bên dưới.