Thứ tư, 28/10/2015 | 00:00 GMT+7

Cách chạy Nginx trong Docker Container trên Ubuntu 14.04

Hướng dẫn này chỉ ra cách triển khai Nginx trong containers Docker.

Bằng cách chứa Nginx, ta cắt giảm chi phí sysadmin của bạn . Ta sẽ không cần quản lý Nginx thông qua trình quản lý gói hoặc xây dựng nó từ nguồn. Vùng chứa Docker cho phép ta chỉ cần thay thế toàn bộ containers khi version mới của Nginx được phát hành. Ta chỉ cần duy trì file cấu hình Nginx và nội dung của ta .

Nginx mô tả chính nó là:

nginx [engine x] là một server Reverse Proxy và HTTP, một server proxy thư và một server proxy TCP chung, ban đầu được viết bởi Igor Sysoev.

Trong thực tế, nhiều sysadmins sử dụng Nginx để cung cấp nội dung web, từ các trang web file phẳng đến các API ngược dòng trong NodeJS. Trong hướng dẫn này, ta sẽ cung cấp một trang web cơ bản, vì vậy ta có thể tập trung vào việc cấu hình Nginx với containers Docker.

Docker container là một dạng phổ biến của một thực hành hoạt động tương đối cũ: container hóa. Containerization khác với ảo hóa ở chỗ ảo hóa trừu tượng hóa phần cứng, trong khi container hóa trừu tượng hóa hệ điều hành cơ sở. Về mặt thực tế, điều này nghĩa là ta có thể lấy một ứng dụng (hoặc một group ứng dụng) và bọc chúng trong một container (hoặc các container ) để biến chúng thành module , di động, có thể ghép và nhẹ.

Tính di động này nghĩa là bạn có thể cài đặt Docker Engine ( còn gọi là Docker Core, và thậm chí chỉ Docker) trên nhiều hệ điều hành khác nhau và bất kỳ containers chức năng nào được viết bởi bất kỳ ai cũng sẽ chạy trên đó.

Nếu bạn muốn tìm hiểu thêm về Docker, bạn có thể xem hướng dẫn Docker giới thiệu .

Với mục đích của bài viết này, ta sẽ cài đặt Docker Engine trên Ubuntu 14.04.

Ta sẽ cài đặt version Docker ổn định hiện tại cho Ubuntu, là 1.8.1.

Hướng dẫn này dành cho user Nginx mới sử dụng Docker. Nếu bạn chỉ muốn các lệnh đơn giản để cài đặt containers Nginx của bạn , bạn có thể thực hiện Bước 1 rồi chuyển sang Bước 5.

Nếu bạn muốn từng bước xây dựng containers của bạn và tìm hiểu về ánh xạ cổng và chế độ tách rời, hãy làm theo toàn bộ hướng dẫn.

Yêu cầu

Để chứa Nginx, vui lòng hoàn thành các bước sau:

Docker 1.8.1 dựa trên một số tính năng kernel khá gần đây, vì vậy hãy đảm bảo kernel ở mức 3.10 trở lên. Một hình ảnh mới sẽ chạy một nhân khá mới, nhưng nếu bạn cần kiểm tra, chỉ cần chạy uname -r .

  • uname -r

Ta đã bao gồm kết quả từ Ubuntu 14.04 Server mới bên dưới, hơn 3.10, vì vậy bạn không phải lo lắng gì trừ khi bạn đang chạy điều này trên một hình ảnh cũ hơn .

Output
3.13.0-57-generic

Bước 1 - Cài đặt Docker

Docker lưu trữ một tập lệnh khởi động để chạy Docker trên máy của bạn. Ta có thể chỉ cần chạy lệnh:

  • sudo curl -sSL https://get.docker.com/ | sh

Nói chung, bạn không nên chuyển các tập lệnh ngẫu nhiên từ internet vào shell ( | sh ) của bạn , vì chúng có thể làm bất cứ điều gì. Hãy xem get.docker.com nếu bạn muốn biết những gì bạn đang làm.

Sau khi hoàn tất, bạn sẽ thấy version đã cài đặt như hình bên dưới (bản đọc của bạn có thể mới hơn; điều này là tốt) và một số hướng dẫn để chạy dưới dạng không root / không có sudo. Tuy nhiên, ta đang chạy qua hướng dẫn này như với user sudo, vì vậy không cần phải lo lắng về điều này vì mục đích của hướng dẫn này.

Output
Client: Version: 1.8.3 API version: 1.20 Go version: go1.4.2 Git commit: f4bf5c7 Built: Mon Oct 12 05:37:18 UTC 2015 OS/Arch: linux/amd64 Server: Version: 1.8.3 API version: 1.20 Go version: go1.4.2 Git commit: f4bf5c7 Built: Mon Oct 12 05:37:18 UTC 2015 OS/Arch: linux/amd64

Tùy chọn: Chạy containers hello-world đảm bảo mọi thứ hoạt động như mong đợi.

  • sudo docker run hello-world

Bạn sẽ thấy kết quả tương tự như được hiển thị bên dưới.

Output
$ docker run hello-world Unable to find image 'hello-world:latest' locally latest: Pulling from library/hello-world 535020c3e8ad: Pull complete af340544ed62: Already exists library/hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Digest: sha256:d5fbd996e6562438f7ea5389d7da867fe58e04d581810e230df4cc073271ea52 Status: Downloaded newer image for hello-world:latest Hello from Docker. This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu container with: $ docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker Hub account: https://hub.docker.com For more examples and ideas, visit: https://docs.docker.com/userguide/

Với phần hoàn chỉnh này, ta có thể đi sâu vào những kiến thức cơ bản về Docker.

(Tùy chọn) Bước 2 - Xem lại Kiến thức cơ bản về containers : Chạy, Liệt kê, Xóa

Phần này chỉ ra cách chạy một containers cơ bản và sau đó loại bỏ nó. Nếu bạn đã biết cách sử dụng Docker nói chung và muốn chuyển sang phần Nginx, hãy chuyển sang Bước 5.

Ta đã cài đặt Ứng dụng khách Docker như một phần của quá trình cài đặt Docker, vì vậy ta có quyền truy cập vào công cụ dòng lệnh cho phép ta tương tác với các containers của bạn .

Nếu ta chạy lệnh sau;

  • sudo docker ps -a

Bạn sẽ nhận được kết quả tương tự như sau;

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3b149c3ddea hello-world "/hello" 3 minutes ago Exited (0) 3 minutes ago nostalgic_hopper

Ta có thể xem một số thông tin cơ bản về containers của ta .

Bạn sẽ nhận thấy nó có một cái tên vô nghĩa như nostalgic_hopper ; những tên này được tạo tự động nếu bạn không chỉ định tên khi tạo containers .

Ta cũng có thể thấy rằng containers ví dụ hello-world đã được chạy 3 phút trước và thoát ra 3 phút trước.

Nếu ta chạy lại containers này bằng lệnh này (thay nostalgic_hopper bằng tên containers của bạn ):

  • sudo docker start nostalgic_hopper

Sau đó chạy lệnh để liệt kê các containers :

  • sudo docker ps -a

Bây giờ ta sẽ thấy rằng containers đã chạy gần đây;

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a3b149c3ddea hello-world "/hello" 4 minutes ago Exited (0) 9 seconds ago nostalgic_hopper

Theo mặc định, containers Docker chạy các lệnh được chỉ định của chúng và sau đó thoát.

Một số containers sẽ được cài đặt để chạy qua một danh sách các nhiệm vụ và hoàn thành, trong khi những containers khác sẽ chạy vô thời hạn.

Bây giờ ta đã xem qua một số khái niệm cơ bản về Docker, hãy xóa hình ảnh hello-world vì ta sẽ không cần nó nữa (hãy nhớ thay nostalgic_hopper bằng tên containers của bạn hoặc sử dụng ID containers của bạn).

  • sudo docker rm nostalgic_hopper

Tiếp theo, ta sẽ bắt đầu sử dụng Nginx.

(Tùy chọn) Bước 3 - Học cách phơi phóng cổng

Trong phần này, ta sẽ download hình ảnh Nginx Docker và hướng dẫn bạn cách chạy containers để nó có thể truy cập dưới dạng web server .

Theo mặc định, các containers không thể truy cập được từ Internet, vì vậy ta cần ánh xạ cổng nội bộ của containers tới cổng của Server. Đó là những gì phần này sẽ dạy cho bạn!

Tuy nhiên, trước tiên, ta sẽ lấy hình ảnh Nginx.

Bước 5 chứa các lệnh cuối cùng để triển khai containers đầy đủ, vì vậy nếu bạn không quá quan tâm đến chi tiết triển khai, bạn có thể bỏ qua ngay tại đó.

Chạy lệnh sau để lấy hình ảnh Nginx Docker:

  • sudo docker pull nginx

Điều này download tất cả các thành phần cần thiết cho containers . Docker sẽ lưu vào bộ nhớ cache những thứ này, vì vậy khi ta chạy containers , ta không cần download (các) containers images mỗi lần.

Docker duy trì một trang gọi là Dockerhub , một repository công khai các file Docker (bao gồm cả hình ảnh chính thức và hình ảnh do user gửi). Hình ảnh ta download là hình ảnh Nginx chính thức, giúp ta không phải xây dựng hình ảnh của riêng mình.

Hãy bắt đầu containers Nginx Docker của ta bằng lệnh này:

  • sudo docker run --name docker-nginx -p 80:80 nginx
  • run là lệnh để tạo một containers mới
  • Cờ --name là cách ta chỉ định tên của containers (nếu để trống, một tên sẽ được gán cho ta , như hoài_hopper từ Bước 2)
  • -p chỉ định cổng mà ta đang hiển thị ở định dạng -p local-machine-port:internal-container-port . Trong trường hợp này, ta đang ánh xạ Cổng 80 trong containers thành Cổng 80 trên server
  • nginx là tên của hình ảnh trên dockerhub ( ta đã download file này trước đây bằng lệnh pull, nhưng Docker sẽ tự động thực hiện việc này nếu hình ảnh bị thiếu)

Đó là tất cả những gì ta cần để nâng cấp Nginx! Dán địa chỉ IP của Server vào trình duyệt web và bạn sẽ thấy “Chào mừng bạn đến với nginx!” Của Nginx trang.

Bạn cũng sẽ nhận thấy trong phiên shell của bạn rằng log cho Nginx đang được cập nhật khi bạn đưa ra yêu cầu đối với server của bạn , vì ta đang chạy containers của bạn một cách tương tác.

Hãy nhấn phím tắt ngắt CTRL+C để quay lại phiên shell của ta .

Nếu bạn cố gắng tải trang ngay bây giờ, bạn sẽ nhận được trang "kết nối bị từ chối". Điều này là do ta đóng container của bạn . Ta có thể xác minh điều này bằng lệnh này:

  • sudo docker ps -a

Bạn sẽ thấy một cái gì đó tương tự như kết quả hiển thị bên dưới.

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05012ab02ca1 nginx "nginx -g 'daemon off" 57 seconds ago Exited (0) 47 seconds ago docker-nginx

Ta có thể thấy rằng containers Docker của ta đã thoát.

Nginx sẽ không hữu ích lắm nếu ta cần gắn vào containers images để nó hoạt động, vì vậy trong bước tiếp theo, ta sẽ hướng dẫn bạn cách tách containers để cho phép nó chạy độc lập.

Xóa containers docker-nginx có bằng lệnh này:

  • sudo docker rm docker-nginx

Trong bước tiếp theo, ta sẽ hướng dẫn bạn cách chạy nó ở chế độ tách rời.

(Tùy chọn) Bước 4 - Học cách chạy ở chế độ tách rời

Tạo một containers Nginx mới, tách biệt bằng lệnh này:

  • sudo docker run --name docker-nginx -p 80:80 -d nginx

Ta đã thêm cờ -d để chạy containers này trong nền.

Đầu ra chỉ nên là ID của containers mới.

Nếu ta chạy lệnh danh sách:

  • sudo docker ps

Ta sẽ thấy một vài điều trong kết quả mà ta chưa từng thấy trước đây.

Output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b91f3ce26553 nginx "nginx -g 'daemon off" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, 443/tcp docker-nginx

Ta có thể thấy rằng thay vì Exited (0) X minutes ago ta hiện đã Up About a minute và ta cũng có thể thấy ánh xạ cổng.

Nếu ta truy cập lại địa chỉ IP của server trong trình duyệt của bạn , ta sẽ có thể thấy thông báo "Chào mừng bạn đến với nginx!" trang . Lần này nó chạy trong nền vì ta đã chỉ định cờ -d , cờ này yêu cầu Docker chạy containers này ở chế độ tách rời.

Bây giờ ta có một version Nginx đang chạy trong một containers riêng biệt!

Tuy nhiên, nó vẫn chưa đủ hữu ích vì ta không thể chỉnh sửa file cấu hình và containers không có quyền truy cập vào các file trang web nào của ta .

Dừng containers bằng cách chạy lệnh sau:

  • sudo docker stop docker-nginx

Bây giờ containers đã dừng (bạn có thể kiểm tra bằng sudo docker ps -a nếu bạn muốn chắc chắn), ta có thể loại bỏ nó bằng cách chạy lệnh sau;

  • sudo docker rm docker-nginx

Bây giờ ta sẽ chuyển đến version cuối cùng của containers , với một điểm dừng nhanh để tạo file trang web tùy chỉnh.

Bước 5 - Xây dựng một trang web để phân phát trên Nginx

Trong bước này, ta sẽ tạo một trang index tùy chỉnh cho trang web của ta . Cài đặt này cho phép ta có nội dung trang web liên tục được lưu trữ bên ngoài containers (tạm thời).

Hãy tạo một folder mới cho nội dung trang web của ta trong folder chính của ta và di chuyển đến nó, bằng cách chạy các lệnh hiển thị bên dưới.

  • mkdir -p ~/docker-nginx/html
  • cd ~/docker-nginx/html

Bây giờ ta hãy tạo một file HTML ( ta hiển thị các lệnh cho Vim, nhưng bạn có thể sử dụng bất kỳ editor nào bạn thích).

  • vim index.html

Vào chế độ insert bằng cách nhấn i . Dán nội dung hiển thị bên dưới (hoặc tự do thêm đánh dấu HTML của bạn ).

<html>   <head>     <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" integrity="sha256-MfvZlkHCEqatNoGiOXveE8FIwMzZg4W85qfrfIFBfYc= sha512-dTfge/zgoMYpP7QbHy4gWMEGsbsdZeCXz7irItjcC3sPUFtf0kuFbDz/ixG7ArTxmDjLXDmezHubeNikyKGVyQ==" crossorigin="anonymous">     <title>Docker nginx Tutorial</title>   </head>   <body>     <div class="container">       <h1>Hello Digital Ocean</h1>       <p>This nginx page is brought to you by Docker and Digital Ocean</p>     </div>   </body> </html> 

Nếu bạn đã quen với HTML, bạn sẽ thấy rằng đây là một trang web siêu cơ bản. Ta đã bao gồm một <link> được trỏ đến CDN cho Bootstrap (một khung CSS cung cấp cho trang web một bộ sưu tập các kiểu đáp ứng). Bạn có thể đọc thêm về Bootstrap .

Ta có thể lưu file này ngay bây giờ bằng cách nhấn ESC , sau đó :wqENTER :

  • write ( w ) yêu cầu Vim ghi các thay đổi vào file
  • bỏ ( q ) cho Vim biết để thoát

Bây giờ ta đã có một trang index đơn giản để thay thế trang đích Nginx mặc định.

Bước 6 - Liên kết containers với hệ thống file local

Trong phần này, ta sẽ tổng hợp tất cả lại với nhau. Ta sẽ bắt đầu containers Nginx của bạn để nó có thể truy cập được trên Internet qua Cổng 80 và ta sẽ kết nối nó với nội dung trang web của ta trên server .

Thông tin cơ bản về dung lượng ; nghĩa là, liên kết đến nội dung server vĩnh viễn từ containers của bạn:

Docker cho phép ta liên kết các folder từ hệ thống file local của máy ảo với các containers của ta .

Trong trường hợp của ta , vì ta muốn phục vụ các trang web, ta cần cung cấp cho containers của bạn các file để hiển thị.

Ta có thể sao chép các file vào containers như một phần của Dockerfile hoặc sao chép chúng vào containers sau khi thực tế, nhưng cả hai phương pháp này đều để trang web của ta ở trạng thái tĩnh bên trong containers . Bằng cách sử dụng tính năng data volumes của Docker, ta có thể tạo một softlink giữa hệ thống file của Server và hệ thống file của containers . Điều này cho phép ta chỉnh sửa các file trang web hiện có của bạn và thêm các file mới vào folder và containers của ta sẽ tự động truy cập chúng. Nếu bạn muốn đọc thêm về Docker và dung lượng , hãy xem tài liệu data volumes .

Vùng chứa Nginx được cài đặt theo mặc định để tìm kiếm trang index tại /usr/share/nginx/html , vì vậy trong containers Docker mới của ta , ta cần cấp cho nó quyền truy cập vào các file của ta tại vị trí đó.

Tạo liên kết:

Để thực hiện việc này, ta sử dụng cờ -v để ánh xạ một folder từ máy local của ta ( ~/docker-nginx/html ) tới một đường dẫn tương đối trong containers ( /usr/share/nginx/html ).

Ta có thể thực hiện điều này bằng cách chạy lệnh sau:

  • sudo docker run --name docker-nginx -p 80:80 -d -v ~/docker-nginx/html:/usr/share/nginx/html nginx

Ta có thể thấy rằng phần bổ sung mới cho lệnh -v ~/docker-nginx/html:/usr/share/nginx/html là liên kết dung lượng của ta .

  • -v chỉ định rằng ta đang liên kết một tập
  • phần bên trái : là vị trí của file / folder trên máy ảo của ta ( ~/docker-nginx/html )
  • phần ở bên phải : là vị trí mà ta đang liên kết đến trong containers của ta ( /usr/share/nginx/html )

Sau khi chạy lệnh đó, nếu bây giờ bạn trỏ trình duyệt của bạn đến địa chỉ IP của DigitalOcean Server, bạn sẽ thấy tiêu đề đầu tiên của Hello Digital Ocean (hoặc bất kỳ trang web nào bạn đã tạo ở Bước 5).

Nếu bạn hài lòng với các mặc định khác của Nginx, bạn đã sẵn sàng.

Bạn có thể tải thêm nội dung lên folder ~/docker-nginx/html/ và nó sẽ được thêm vào trang web trực tiếp của bạn.

Ví dụ: nếu ta sửa đổi file index của bạn và nếu ta reload cửa sổ trình duyệt của bạn , ta sẽ có thể thấy nó cập nhật trong thời gian thực. Ta có thể xây dựng toàn bộ trang web từ các file HTML phẳng theo cách này nếu ta muốn. Ví dụ: nếu ta đã thêm trang about.html , ta có thể truy cập trang đó tại http:// your_server_ip /about.html mà không cần tương tác với containers .

(Tùy chọn) Bước 7 - Sử dụng file cấu hình Nginx của bạn

Phần này dành cho user nâng cao muốn sử dụng file cấu hình Nginx của riêng họ với containers Nginx của họ. Vui lòng bỏ qua bước này nếu bạn không có file cấu hình tùy chỉnh mà bạn muốn sử dụng.

Hãy quay lại một folder để ta không ghi vào folder HTML công khai của bạn :

  • cd ~/docker-nginx

Nếu bạn muốn xem file cấu hình mặc định, chỉ cần sao chép nó bằng lệnh Docker copy:

  • sudo docker cp docker-nginx:/etc/nginx/conf.d/default.conf default.conf

Vì ta sẽ sử dụng file .conf tùy chỉnh cho Nginx, ta cần xây dựng lại containers .

Đầu tiên dừng containers :

  • sudo docker stop docker-nginx

Xóa nó bằng:

  • sudo docker rm docker-nginx

Như vậy, bạn có thể chỉnh sửa local file mặc định (để cung cấp một folder mới hoặc sử dụng proxy_pass để chuyển tiếp lưu lượng đến một ứng dụng / containers khác như bạn làm với cài đặt Nginx thông thường). Bạn có thể đọc về file cấu hình của Nginx trong hướng dẫn file cấu hình Nginx của ta .

Khi bạn đã lưu file cấu hình tùy chỉnh của bạn , đã đến lúc tạo containers Nginx. Chỉ cần thêm cờ -v thứ hai với các đường dẫn thích hợp để cung cấp cho containers Nginx mới các liên kết thích hợp để chạy từ file cấu hình của bạn .

  • sudo docker run --name docker-nginx -p 80:80 -v ~/docker-nginx/html:/usr/share/nginx/html -v ~/docker-nginx/default.conf:/etc/nginx/conf.d/default.conf -d nginx

Lệnh này cũng vẫn liên kết trong các trang web tùy chỉnh với containers .

Xin lưu ý bạn cần khởi động lại containers bằng lệnh docker restart nếu bạn thực hiện bất kỳ thay đổi nào đối với file cấu hình của bạn sau khi khởi động containers , vì Nginx không reload nóng nếu file cấu hình của nó bị thay đổi:

  • sudo docker restart docker-nginx

Kết luận

Đến đây bạn có một containers Nginx đang chạy phục vụ một trang web tùy chỉnh.

Từ đây, ta khuyên bạn nên đọc liên kết containers của Docker nếu bạn muốn tìm hiểu về cách liên kết các containers với nhau cho mục đích sử dụng Nginx làm Reverse Proxy để cung cấp các ứng dụng web dựa trên containers khác.

Nếu bạn muốn quản lý một group các containers , chẳng hạn như containers ứng dụng, containers database và containers Nginx này, hãy xem Docker Compose .


Tags:

Các tin liên quan

Cách thêm ngx_pagespeed vào Nginx trên CentOS 7
2015-09-30
Cách thêm ngx_pagespeed vào Nginx trên Ubuntu 14.04
2015-09-22
Cách thêm ngx_pagespeed vào Nginx trên Debian 8
2015-09-20
Cách bảo vệ server Nginx với Fail2Ban trên Ubuntu 14.04
2015-08-14
Cách cài đặt HHVM với Nginx trên Ubuntu 14.04
2015-08-12
Cách thiết lập xác thực mật khẩu với Nginx trên Ubuntu 14.04
2015-08-10
Cách cài đặt Nginx trên Debian 8
2015-07-09
Cách lưu trữ nhiều trang web một cách an toàn với Nginx và Php-fpm trên Ubuntu 14.04
2015-07-01
Cách tạo blog bằng Ghost và Nginx trên Ubuntu 14.04
2015-06-28
Cách tạo chứng chỉ ECC trên Nginx cho Debian 8
2015-06-23