Thứ ba, 23/04/2019 | 00:00 GMT+7

Cách triển khai ứng dụng web Go với Docker và Nginx trên Ubuntu 18.04

Docker là phần mềm chứa phổ biến nhất được sử dụng ngày nay. Nó cho phép các nhà phát triển dễ dàng đóng gói các ứng dụng cùng với môi trường của họ, cho phép chu kỳ lặp lại nhanh hơn và hiệu quả tài nguyên tốt hơn, đồng thời cung cấp cùng một môi trường mong muốn trên mỗi lần chạy. Docker Compose là một công cụ điều phối containers hỗ trợ các yêu cầu ứng dụng hiện đại. Nó cho phép bạn chạy nhiều containers được kết nối với nhau cùng một lúc. Thay vì chạy các containers theo cách thủ công, các công cụ điều phối cung cấp cho các nhà phát triển khả năng kiểm soát, mở rộng và mở rộng containers đồng thời.

Các lợi ích của việc sử dụng Nginx làm web server front-end là hiệu suất, khả năng cấu hình và kết thúc TLS của nó, giúp giải phóng ứng dụng khỏi việc hoàn thành các việc này. nginx-proxy là một hệ thống tự động dành cho các containers Docker giúp đơn giản hóa quá trình cấu hình Nginx để phục vụ như một Reverse Proxy . Tiện ích bổ sung Let's Encrypt của nó có thể đi kèm với nginx-proxy để tự động tạo và gia hạn certificate cho các containers được ủy quyền.

Trong hướng dẫn này, bạn sẽ triển khai một ứng dụng web Go mẫu với gorilla / mux làm bộ định tuyến yêu cầu và Nginx làm web server , tất cả đều nằm trong containers Docker, được điều phối bởi Docker Compose. Bạn sẽ sử dụng nginx-proxy với tiện ích bổ sung Let's Encrypt làm Reverse Proxy . Ở phần cuối của hướng dẫn này, bạn sẽ triển khai ứng dụng web Go có thể truy cập được tại domain của bạn với nhiều tuyến, sử dụng Docker và được bảo mật bằng certificate Let's Encrypt.

Yêu cầu

Bước 1 - Tạo ứng dụng web Go mẫu

Trong bước này, bạn sẽ cài đặt không gian làm việc của bạn và tạo một ứng dụng web Go đơn giản, sau này bạn sẽ lưu trữ lại. Ứng dụng Go sẽ sử dụng bộ định tuyến yêu cầu gorilla / mux mạnh mẽ, được chọn vì tính linh hoạt và tốc độ của nó.

Bắt đầu bằng cách đăng nhập với quyền sammy :

  • ssh sammy@your_server_ip

Đối với hướng dẫn này, bạn sẽ lưu trữ tất cả dữ liệu trong ~/go-docker . Chạy lệnh sau để thực hiện việc này:

  • mkdir ~/go-docker

Điều hướng đến nó:

  • cd ~/go-docker

Bạn sẽ lưu trữ ứng dụng web Go mẫu của bạn trong một file có tên main.go Tạo nó bằng editor của bạn:

  • nano main.go

Thêm các dòng sau:

main.go
package main  import (     "fmt"     "net/http"      "github.com/gorilla/mux" )  func main() {     r := mux.NewRouter()      r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {         fmt.Fprintf(w, "<h1>This is the homepage. Try /hello and /hello/Sammy\n</h1>")     })      r.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {         fmt.Fprintf(w, "<h1>Hello from Docker!\n</h1>")     })      r.HandleFunc("/hello/{name}", func(w http.ResponseWriter, r *http.Request) {         vars := mux.Vars(r)         title := vars["name"]          fmt.Fprintf(w, "<h1>Hello, %s!\n</h1>", title)     })      http.ListenAndServe(":80", r) } 

Trước tiên, bạn nhập các gói net/httpgorilla/mux , các gói này cung cấp chức năng server HTTP và định tuyến.

Gói gorilla/mux triển khai bộ định tuyến và điều phối yêu cầu dễ dàng hơn và mạnh mẽ hơn, đồng thời duy trì khả năng tương thích giao diện với bộ định tuyến tiêu chuẩn. Tại đây, bạn khởi tạo một bộ định tuyến mux mới và lưu trữ nó trong biến r . Sau đó, bạn xác định ba tuyến đường: / , /hello/hello/{name} . Dấu ( / ) đầu tiên đóng role là trang chủ và bạn bao gồm một thông điệp cho trang. Lời /hello thứ hai ( /hello ) trả lại lời chào cho khách truy cập. Đối với tuyến thứ ba ( /hello/{name} ), bạn chỉ định rằng nó phải lấy tên làm tham số và hiển thị thông báo chào mừng có chèn tên.

Ở cuối file của bạn, bạn khởi động server HTTP bằng http.ListenAndServe và hướng dẫn nó lắng nghe trên cổng 80 , sử dụng bộ định tuyến bạn đã cấu hình .

Lưu và đóng file .

Trước khi chạy ứng dụng Go của bạn , trước tiên bạn cần biên dịch và đóng gói nó để thực thi bên trong containers Docker. Go là một ngôn ngữ biên dịch , vì vậy trước khi một chương trình có thể chạy, trình biên dịch sẽ dịch mã lập trình thành mã máy thực thi.

Bạn đã cài đặt không gian làm việc của bạn và tạo một ứng dụng web Go mẫu. Tiếp theo, bạn sẽ triển khai nginx-proxy với cung cấp certificate Let's Encrypt tự động.

Bước 2 - Triển khai nginx-proxy với Let's Encrypt

Điều quan trọng là bạn phải bảo mật ứng dụng của bạn bằng HTTPS. Để thực hiện điều này, bạn sẽ triển khai nginx-proxy thông qua Docker Compose, cùng với tiện ích bổ sung Let's Encrypt của nó. Điều này đảm bảo an toàn cho các containers Docker được ủy quyền bằng cách sử dụng nginx-proxy và đảm bảo việc bảo mật ứng dụng của bạn thông qua HTTPS bằng cách tự động xử lý việc tạo và gia hạn certificate TLS.

Bạn sẽ lưu trữ cấu hình Docker Compose cho nginx-proxy trong một file có tên nginx-proxy-compose.yaml . Tạo nó bằng lệnh:

  • nano nginx-proxy-compose.yaml

Thêm các dòng sau vào file :

nginx-proxy-compost.yaml
version: '2'  services:   nginx-proxy:     restart: always     image: jwilder/nginx-proxy     ports:       - "80:80"       - "443:443"     volumes:       - "/etc/nginx/vhost.d"       - "/usr/share/nginx/html"       - "/var/run/docker.sock:/tmp/docker.sock:ro"       - "/etc/nginx/certs"    letsencrypt-nginx-proxy-companion:     restart: always     image: jrcs/letsencrypt-nginx-proxy-companion     volumes:       - "/var/run/docker.sock:/var/run/docker.sock:ro"     volumes_from:       - "nginx-proxy" 

Ở đây bạn đang xác định hai containers : một cho nginx-proxy và một cho tiện ích bổ sung Let's Encrypt ( letsencrypt-nginx-proxy-companion ). Đối với proxy, bạn chỉ định image jwilder/nginx-proxy , hiển thị và ánh xạ các cổng HTTP và HTTPS, và cuối cùng xác định dung lượng sẽ có thể truy cập vào containers để lưu giữ dữ liệu liên quan đến Nginx.

Trong khối thứ hai, bạn đặt tên hình ảnh cho cấu hình tiện ích bổ sung Let's Encrypt. Sau đó, bạn cấu hình quyền truy cập vào socket của Docker bằng cách xác định một ổ đĩa và sau đó là các ổ đĩa hiện có từ containers proxy để kế thừa. Cả hai containers đều có thuộc tính restart always , điều này hướng dẫn Docker luôn duy trì chúng (trong trường hợp gặp sự cố hoặc khởi động lại hệ thống).

Lưu và đóng file .

Triển khai nginx-proxy bằng lệnh:

  • docker-compose -f nginx-proxy-compose.yaml up -d

Docker Compose chấp nhận một file có tên tùy chỉnh thông qua cờ -f . Lệnh up chạy các containers và cờ -d , chế độ tách rời, hướng dẫn nó chạy các containers trong nền.

Đầu ra cuối cùng của bạn sẽ giống như sau:

Output
Creating network "go-docker_default" with the default driver Pulling nginx-proxy (jwilder/nginx-proxy:)... latest: Pulling from jwilder/nginx-proxy a5a6f2f73cd8: Pull complete 2343eb083a4e: Pull complete ... Digest: sha256:619f390f49c62ece1f21dfa162fa5748e6ada15742e034fb86127e6f443b40bd Status: Downloaded newer image for jwilder/nginx-proxy:latest Pulling letsencrypt-nginx-proxy-companion (jrcs/letsencrypt-nginx-proxy-companion:)... latest: Pulling from jrcs/letsencrypt-nginx-proxy-companion ... Creating go-docker_nginx-proxy_1 ... done Creating go-docker_letsencrypt-nginx-proxy-companion_1 ... done

Bạn đã triển khai nginx-proxy và đồng hành Let's Encrypt của nó bằng Docker Compose. Tiếp theo, bạn sẽ tạo một Dockerfile cho ứng dụng web Go của bạn .

Bước 3 - Tài liệu hóa ứng dụng web Go

Trong phần này, bạn sẽ tạo một Dockerfile chứa các hướng dẫn về cách Docker sẽ tạo một hình ảnh bất biến cho ứng dụng web Go của bạn. Docker xây dựng một hình ảnh ứng dụng không thể thay đổi — tương tự như một ảnh chụp nhanh của containers — bằng cách sử dụng các hướng dẫn có trong Dockerfile. Tính bất biến của hình ảnh đảm bảo cùng một môi trường mỗi khi containers , dựa trên hình ảnh cụ thể, được chạy.

Tạo Dockerfile bằng editor của bạn:

  • nano Dockerfile

Thêm các dòng sau:

Dockerfile
FROM golang:alpine AS build RUN apk --no-cache add gcc g++ make git WORKDIR /go/src/app COPY . . RUN go get ./... RUN GOOS=linux go build -ldflags="-s -w" -o ./bin/web-app ./main.go  FROM alpine:3.9 RUN apk --no-cache add ca-certificates WORKDIR /usr/bin COPY --from=build /go/src/app/bin /go/bin EXPOSE 80 ENTRYPOINT /go/bin/web-app --port 80 

Dockerfile này có hai giai đoạn. Giai đoạn đầu tiên sử dụng cơ sở golang:alpine , có chứa Go trên Alpine Linux được cài đặt sẵn.

Sau đó, bạn cài đặt gcc , g++ , makegit làm công cụ biên dịch cần thiết cho ứng dụng Go của bạn . Bạn đặt folder làm việc thành /go/src/app , nằm trong GOPATH mặc định. Bạn cũng sao chép nội dung của folder hiện tại vào containers . Giai đoạn đầu tiên kết thúc với việc tìm nạp đệ quy các gói được sử dụng từ mã và biên dịch file main.go để phát hành mà không có biểu tượng và thông tin gỡ lỗi (bằng cách chuyển -ldflags="-s -w" ). Khi bạn biên dịch một chương trình Go, nó sẽ giữ một phần riêng biệt của binary sẽ được sử dụng để gỡ lỗi, tuy nhiên, thông tin bổ sung này sử dụng bộ nhớ và không cần thiết phải bảo tồn khi triển khai tới môi trường production .

Giai đoạn thứ hai dựa trên alpine:3.9 (Alpine Linux 3.9). Nó cài đặt certificate CA tin cậy , sao chép file binary ứng dụng đã biên dịch từ giai đoạn đầu tiên sang hình ảnh hiện tại, hiển thị cổng 80 và đặt file binary ứng dụng làm điểm nhập hình ảnh.

Lưu và đóng file .

Bạn đã tạo một Dockerfile cho ứng dụng Go của bạn . Nó sẽ tìm nạp các gói của nó, biên dịch nó để phát hành và chạy nó khi tạo containers . Trong bước tiếp theo, bạn sẽ tạo file Docker Compose yaml và kiểm tra ứng dụng bằng cách chạy nó trong Docker.

Bước 4 - Tạo và chạy file docker composer

Bây giờ, bạn sẽ tạo file cấu hình Docker Compose và viết cấu hình cần thiết để chạy Docker image mà bạn đã tạo ở bước trước. Sau đó, bạn sẽ chạy nó và kiểm tra xem nó có hoạt động chính xác hay không. Nói chung, file cấu hình Docker Compose chỉ định containers , cài đặt, mạng và dung lượng của chúng mà ứng dụng yêu cầu. Bạn cũng có thể chỉ định rằng các phần tử này có thể bắt đầu và dừng cùng một lúc.

Bạn sẽ lưu trữ cấu hình Docker Compose cho ứng dụng web Go trong một file có tên go-app-compose.yaml . Tạo nó bằng lệnh:

  • nano go-app-compose.yaml

Thêm các dòng sau vào file này:

go-app-compos.yaml
version: '2' services:   go-web-app:     restart: always     build:       dockerfile: Dockerfile       context: .     environment:       - VIRTUAL_HOST=example.com       - LETSENCRYPT_HOST=example.com 

Hãy nhớ thay thế example.com cả hai lần bằng domain của bạn. Lưu và đóng file .

Cấu hình Docker Compose này chứa một containers ( go-web-app ), sẽ là ứng dụng web Go của bạn. Nó xây dựng ứng dụng bằng cách sử dụng Dockerfile bạn đã tạo ở bước trước và lấy folder hiện tại chứa mã nguồn làm bối cảnh để xây dựng. Hơn nữa, nó đặt hai biến môi trường: VIRTUAL_HOSTLETSENCRYPT_HOST . nginx-proxy sử dụng VIRTUAL_HOST để biết domain nào sẽ chấp nhận các yêu cầu. LETSENCRYPT_HOST chỉ định domain để tạo certificate TLS và phải giống với VIRTUAL_HOST , trừ khi bạn chỉ định domain ký tự đại diện.

Bây giờ, bạn sẽ chạy ứng dụng web Go của bạn trong nền thông qua Docker Compose bằng lệnh sau:

  • docker-compose -f go-app-compose.yaml up -d

Kết quả cuối cùng của bạn sẽ giống như sau:

Output
Creating network "go-docker_default" with the default driver Building go-web-app Step 1/12 : FROM golang:alpine AS build ---> b97a72b8e97d ... Successfully tagged go-docker_go-web-app:latest WARNING: Image for service go-web-app was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`. Creating go-docker_go-web-app_1 ... done

Nếu bạn xem lại kết quả được trình bày sau khi chạy lệnh, Docker đã ghi lại từng bước xây dựng hình ảnh ứng dụng theo cấu hình trong Docker file .

Đến đây bạn có thể chuyển đến https:// example.com / để xem trang chủ của bạn . Tại địa chỉ trang chủ của ứng dụng web, bạn sẽ thấy trang là kết quả của / route mà bạn đã xác định trong bước đầu tiên.

Đây là trang chủ. Hãy thử / xin chào và / xin chào / Sammy

Bây giờ chuyển đến https:// example.com /hello . Bạn sẽ thấy thông báo bạn đã xác định trong mã của bạn cho tuyến đường /hello từ Bước 1.

Xin chào từ Docker!

Cuối cùng, hãy thử thêm tên vào địa chỉ ứng dụng web của bạn để kiểm tra tuyến đường khác, chẳng hạn như: https:// example.com /hello/Sammy .

Xin chào, Sammy!

Lưu ý: Trong trường hợp bạn gặp lỗi về certificate TLS không hợp lệ, hãy đợi vài phút để tiện ích bổ sung Let's Encrypt cung cấp certificate . Nếu bạn vẫn gặp lỗi sau một thời gian ngắn, hãy kiểm tra kỹ những gì bạn đã nhập so với các lệnh và cấu hình được hiển thị trong bước này.

Bạn đã tạo file Docker Compose và cấu hình bằng text để chạy ứng dụng Go của bạn bên trong containers . Để hoàn tất, bạn đã chuyển đến domain của bạn để kiểm tra xem cài đặt bộ định tuyến gorilla/mux có đang phân phát chính xác các yêu cầu đến ứng dụng web Dockerized Go của bạn hay không.

Kết luận

Đến đây bạn đã triển khai thành công ứng dụng web Go của bạn với Docker và Nginx trên Ubuntu 18.04. Với Docker, việc duy trì các ứng dụng trở nên ít phức tạp hơn, bởi vì môi trường mà ứng dụng được thực thi được đảm bảo giống nhau mỗi khi nó chạy. Gói gorilla / mux có tài liệu tuyệt vời và cung cấp các tính năng phức tạp hơn, chẳng hạn như đặt tên các tuyến đường và cung cấp các file tĩnh. Để có nhiều quyền kiểm soát hơn đối với module server Go HTTP, chẳng hạn như xác định thời gian chờ tùy chỉnh, hãy truy cập tài liệu chính thức .


Tags:

Các tin liên quan

Cách cạo các trang web và đăng nội dung lên Twitter bằng Python 3
2019-04-22
module Web tích hợp: Cách sử dụng KV Storage
2019-03-22
Cách thu thập thông tin một trang web với Scrapy và Python 3
2019-03-20
Cách cạo các trang web với Beautiful Soup và Python 3
2019-03-20
Cách sử dụng API Web trong Python 3
2019-03-20
Tạo ứng dụng web tiến bộ (PWA) với React
2019-03-02
Tụ điện: Chạy ứng dụng web trên thiết bị di động
2019-02-27
Cách gửi thông báo đẩy web từ ứng dụng Django
2018-10-24
Cách xây dựng ứng dụng web hiện đại để quản lý thông tin khách hàng với Django và React trên Ubuntu 18.04
2018-10-22
Cách cài đặt Django Web Framework trên Ubuntu 18.04
2018-08-06