Skip to main content

Play Framework HTTPS Hello World với Docker

 Dưới đây là cách cấu hình khung phát để phục vụ giao thông HTTPS với Docker cung cấp thời gian chạy của nó.
 Cài đặt Play Framework sử dụng brew install sbt, sau đó trong quá trình thiết lập ứng dụng mới, cho phép bạn chỉ định versions cho project.

 Tạo mới project với sbt new playframework/play-scala-seed.g8. Nó sẽ tạo ra một thư mục hello-worldvà một thư mục target.

Build project bằng cách nhập hello-worldvà sbt dist, file build target/universal/hello-world-1.0-SNAPSHOT.zip

 Extract đến  1 location, dùng svcđể triển khai:
set -x 
unzip -d svc target / universal / * - 1.0-SNAPSHOT.zip 
mv svc / * / * svc / 
rm svc / bin / * bat 
mv svc / bin / * svc / bin / start
set -x && unzip -d svc target / universal / * - 1.0-SNAPSHOT.zip && mv svc / * / * svc / & & rm svc / bin / * bat && mv svc / bin / * svc / bin / start
Build container Docker với Dockerfilegiống như thế này, có image base openjdk:8-jre, gồm có Play Framework và các thư viện phụ thuộc, bashvà JRE
FROM openjdk: 8-jre 
COPY svc / svc 
EXPOSE 9000 9443 
CMD /svc/bin/start -Dhttps.port=9443 -Dplay.crypto.secret=secret
Xây dựng từ cùng thư mục chứa Dockerfilevà svcvới docker build -t hello-world .
Run Docker container với ports nếu bạn định sử dụng một trình duyệt hoặc curlđể tương tác với nó. Bạn cũng có thể gọi curltừ bên trong container nếu nó được cài đặt ( openjdk:8-jrebó curl, nhưng những thứ khác có thể không).
docker run -it -p 9000: 9000-p 9443: 9443 --rm hello-world
 -ppublishes ports, -itcung cấp điều khiển TTY để bạn có thể CTRL Ccontainer và --rm xóa container ví dụ container (không phải image) khi exit (hai dấu nối, không phải là một dấu gạch nối). Bạn có thể thêm -dđể detach và run nó trong background.
docker psnên resemble, và bạn nhìn thấy các mappings của port:
Tương tác với container sử dụng curltừ localhost:
$ curl -I localhost:9000
HTTP/1.1 200 OK
Set-Cookie: PLAY_SESSION=935c3dbf94ba41f969fbf084de627bc695c2b326-csrfToken=fb0f50c61fa2e0512a83cb3fe07e6645c2ed8597-1497822065731-aebab6068130ca25cfdc16ec; Path=/; HTTPOnly
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'self'
X-Permitted-Cross-Domain-Policies: master-only
Content-Length: 439
Content-Type: text/html; charset=utf-8
Date: Sun, 18 Jun 2017 21:41:05 GMT
Hoặc trên trình duyệt:

Test thử HTTPS:
$ curl -Ikv https://localhost:9443/
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 9443 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate: localhost
> HEAD / HTTP/1.1
> Host: localhost:9443
> User-Agent: curl/7.51.0
> Accept: */*
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Set-Cookie: PLAY_SESSION=23aec23a5d9dabcf8568777821a8ecc4b45d2fd8-csrfToken=89bd94f48863a982efb861e500b5439bdfbca1dc-1497822198482-3fa6567fcee05ccb0084e73e; Path=/; HTTPOnly
Set-Cookie: PLAY_SESSION=23aec23a5d9dabcf8568777821a8ecc4b45d2fd8-csrfToken=89bd94f48863a982efb861e500b5439bdfbca1dc-1497822198482-3fa6567fcee05ccb0084e73e; Path=/; HTTPOnly
< X-Frame-Options: DENY
X-Frame-Options: DENY
< X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; mode=block
< X-Content-Type-Options: nosniff
X-Content-Type-Options: nosniff
< Content-Security-Policy: default-src 'self'
Content-Security-Policy: default-src 'self'
< X-Permitted-Cross-Domain-Policies: master-only
X-Permitted-Cross-Domain-Policies: master-only
< Content-Length: 439
Content-Length: 439
< Content-Type: text/html; charset=utf-8
Content-Type: text/html; charset=utf-8
< Date: Sun, 18 Jun 2017 21:43:18 GMT
Date: Sun, 18 Jun 2017 21:43:18 GMT
<
* Curl_http_done: called premature == 0
* Connection #0 to host localhost left intact
docker run --rm -it alpine:latest sh -c "apk --no-cache add openssl && echo newline | openssl s_client -connect 192.168.2.241:9443 -cipher ECDHE-RSA-AES256-GCM-SHA384 -curves secp521r1"
Và bạn sẽ thấy một dòng như:
Server Temp Key: ECDH, P-521, 521 bits
Server khác nhau (OpenJDK, HAProxy, v.v ...), Client (Chrome hoặc curl) và opensslkết hợp version mặc định cho các bộ và mật mã khác nhau. Kiểm tra một ít với Docker, như ubuntu:14.04hoặc centos:latest, ....!

Comments

Popular posts from this blog

Ứng dụng giải thuật MiniMax trong trò chơi cờ tướng - Tìm hiểu về trí tuệ nhân tạo (Phần 2)

Chắc hẳn mọi người đều biết về trò chơi thú vị như cờ tướng. Tiếp theo loạt bài về trí tuệ nhân tạo, bài viết này mình sẽ nói về cụ thể giải thuật Minimax ứng dụng trong trò chơi trí tuệ cờ tướng như thế nào. OK! Let's go. 1. Ý tưởng Cờ tướng là trò chơi đối kháng, trong đó hai người luôn phiên nhau đi nước đi của mình. Trạng thái bắt đầu là trạng thái khởi tạo bàn cờ, sau mỗi nước đi của một bên, trạng thái bàn cờ sẽ được thay đổi thành một trạng thái mới hiện hành. Cờ tướng có luật của nó, và trò chơi sẽ kết thúc khi một người có được trạng thái phản ánh sự thắng cuộc hoặc hai người rơi vào trạng thái hòa cờ. Ta tìm cách phân tích xem từ một trạng thái nào đó sẽ dẫn đến đấu thủ nào sẽ thắng với điều kiện cả hai có trình độ như nhau. Giải thuật Minimax sẽ được áp dụng vào trong trò chơi cờ tướng. Hai đấu thủ trong trò chơi sẽ được gọi là MIN và MAX và hai đấu

Sử dụng Jedis làm việc với Redis trong Java

Bài viết này mình sẽ   giới thiệu về Jedis , một thư viện client Java cho  Redis . 1. Tại sao lại là Jedis? Redis liệt kê các thư viện client nổi tiếng nhất trên  trang web chính thức  của họ  .  Có nhiều lựa chọn thay thế cho Jedis, nhưng chỉ có hai lựa chọn khác xứng đáng để đề xuất đó là  lettuce  và  Redisson . Hai clients này có một số tính năng độc đáo như an toàn luồng, xử lý kết nối lại trong suốt và API không đồng bộ, tất cả các tính năng mà Jedis thiếu. Tuy nhiên, Jedis nhỏ và nhanh hơn đáng kể so với hai loại kia.  Bên cạnh đó, nó là thư viện client được lựa chọn của các nhà phát triển Spring Framework, và nó có cộng đồng lớn nhất trong cả ba. 2. Maven Dependencies Hãy bắt đầu bằng cách khai báo dependency trong file  pom.xml  : 1 2 3 4 5 < dependency >      < groupId >redis.clients</ groupId >      < artifactId >jedis</ artifactId >      < version >2.8.1</ version > </ dependency >

Sử dụng Jenkins để Build Docker Images

Khởi chạy Jenkins Khởi chạy Jenkins như một Docker Container với lệnh sau: docker run -d -u root --name jenkins \ -p 8080:8080 -p 50000:50000 \ -v /root/jenkins_2112:/var/jenkins_home \ jenkins/jenkins:2.112-alpine Load Dashboard Tên người dùng  admin có mật khẩu mặc định là  344827fbdbfb40d5aac067c7a07b9230 Trên hệ thống của bạn, bạn có thể tìm mật khẩu bằng docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword Có thể mất vài giây để Jenkins hoàn thành việc bắt đầu và có sẵn.  Trong các bước tiếp theo, bạn sẽ sử dụng trang Dashboard để định cấu hình các plugin và bắt đầu tạo Image Docker. Cấu hình Plugin Docker Bước đầu tiên là cấu hình  plugin Docker  .  Plugin này dựa trên plugin Jenkins Cloud.  Khi build Docker Image, nó sẽ tạo ra một "Cloud Agent" thông qua plugin.  Tác nhân sẽ là Docker Container được cấu hình để giao tiếp với Docker Daemon Job build của Jenkins sẽ sử dụng vùng chứa nà