2016-10-04 12 views

答えて

4

設定に応じて、これを達成する方法はたくさんあります。 1つの一般的な方法は、Dockerコンテナの前にnginxを設定し、nginx設定内で完全に証明書を処理することです。

nginx設定には、「usptreams」(Dockerコンテナ)と「本質的に特定のアップストリームに要求をマップするサーバー」のリストを含めることができます。このマッピングの一環として、SSLを処理することもできます。

certbotを使用して設定することができます。あなたがここを見ても

+0

私が説明したことを実現するための詳細な手順を探しています。 – jsejcksn

+0

これを達成する可能性は低いです。バリエーションが多すぎます。スタックオーバーフローの回答は、「ステップバイステップガイド」ではありません。あなたが試したことを記述して特定の質問をすると、より良い応答を得るかもしれません。 – duncanhall

2

https://certbot.eff.org/docs/using.html?highlight=docker#running-with-docker

を次に私が個人的にやっていることは次のとおりです。

  1. 作成本命を格納し、上記画像
  2. で本命を生成するために、ドッカーボリュームを作成します。ドッカーのユーザー定義ネットワーク(https://docs.docker.com/engine/userguide/networking/#/user-defined-networks
  3. 設定でnginxに基づいた画像を作成してください(おそらくthisが便利です)
  4. イメージに基づいてNginxコンテナを作成し、ボリュームをマウントしてネットワークに接続します(また、ポート80と443を任意のものに転送します)
  5. node.jsアプリケーションのコンテナを作成して接続しますあなたは(http://my-app:3210のように右URLへのTLS証明書とプロキシの正しい道をポイントし、)正しくnginxのを設定した場合、同じネットワークに

は今、あなたは、HTTPSでのアプリへのアクセス権を持っている必要があります。

16

私がやった最初のことは、簡単なエクスプレスベースのドッカー画像を作成することです。

私は彼らのドキュメントに明示のhello world exampleから取った次app.jsを、使用しています:

{ 
    "name": "exampleexpress", 
    "version": "1.0.0", 
    "description": "", 
    "main": "app.js", 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "author": "", 
    "license": "ISC", 
    "dependencies": { 
    "express": "^4.14.0" 
    } 
} 
:私も同じドキュメントに自分の npm initを実行した後に、次の packages.jsonのファイルになってしまった
var express = require('express'); 
var app = express(); 

app.get('/', function (req, res) { 
    res.send('Hello World!'); 
}); 

app.listen(3000, function() { 
    console.log('Example app listening on port 3000!'); 
}); 

私は以下のDockerファイルを作成しました:

FROM node:onbuild 
EXPOSE 3000 
CMD node app.js 

docker buildのステップを実行したときの出力は次のとおりです。私は、簡潔のためにnpm install出力のほとんどを削除しました:

$ docker run -d --name helloworld -p 3000:3000 exampleexpress 
$ curl 127.0.0.1:3000 
Hello World! 

我々がやってことで、これをクリーンアップすることができます:docker rm -f helloworld


$ docker build -t exampleexpress . 
Sending build context to Docker daemon 1.262 MB 
Step 1 : FROM node:onbuild 
# Executing 3 build triggers... 
Step 1 : COPY package.json /usr/src/app/ 
Step 1 : RUN npm install 
---> Running in 981ca7cb7256 
npm info it worked if it ends with ok 
<snip> 
npm info ok 
Step 1 : COPY . /usr/src/app 
---> cf82ea76e369 
Removing intermediate container ccd3f79f8de3 
Removing intermediate container 391d27f33348 
Removing intermediate container 1c4feaccd08e 
Step 2 : EXPOSE 3000 
---> Running in 408ac1c8bbd8 
---> c65c7e1bdb94 
Removing intermediate container 408ac1c8bbd8 
Step 3 : CMD node app.js 
---> Running in f882a3a126b0 
---> 5f0f03885df0 
Removing intermediate container f882a3a126b0 
Successfully built 5f0f03885df0 

は、このイメージを実行すると、このように動作します現在、Dockerコンテナで動作する非常に基本的なエクスプレスベースのWebサイトがありますが、まだTLSが設定されていません。 expressjsドキュメントをもう一度見てみると、security best practiceはTLSを使用しているときにnginxを使用することです。

私は新しいコンポーネント(nginx)を導入したいので、私は2番目のコンテナでそれを行います。

nginxは動作するためにいくつかの証明書が必要なので、letencryptクライアントでそれらを生成してみましょう。 Dockerでのletsencryptの使用方法に関するletsencryptドキュメントは、次の場所にあります。http://letsencrypt.readthedocs.io/en/latest/using.html#running-with-docker

初期証明書を生成するには、次のコマンドを実行します。パブリックインターネットに接続されているシステムでこれを実行する必要があり、80/443のポートにはletsencryptサーバーから到達可能です。また、あなたのDNS名を設定し、あなたが上でこれを実行するのボックスを指している必要があります:

export LETSENCRYPT_EMAIL=<youremailaddress> 
export DNSNAME=www.example.com 

docker run --rm \ 
    -p 443:443 -p 80:80 --name letsencrypt \ 
    -v "/etc/letsencrypt:/etc/letsencrypt" \ 
    -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \ 
    quay.io/letsencrypt/letsencrypt:latest \ 
    certonly -n -m $LETSENCRYPT_EMAIL -d $DNSNAME --standalone --agree-tos 

LETSENCRYPT_EMAILDNSNAMEの値を置き換えてください。電子メールアドレスは有効期限通知に使用されます。


ここで、この新しく生成された証明書を使用するnginxサーバーをセットアップしましょう。私たちは、次のDockerfileと私たち自身のカスタムnginxのイメージにこの設定ファイルを置くことができ

user nginx; 
worker_processes 1; 

error_log /var/log/nginx/error.log warn; 
pid  /var/run/nginx.pid; 


events { 
    worker_connections 1024; 
} 


http { 
    include  /etc/nginx/mime.types; 
    default_type application/octet-stream; 

    log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 
         '$status $body_bytes_sent "$http_referer" ' 
         '"$http_user_agent" "$http_x_forwarded_for"'; 

    access_log /dev/stdout main; 
    sendfile  on; 
    keepalive_timeout 65; 

    server { 
     listen  80; 
     server_name _; 
     return 301 https://$host$request_uri; 
    } 

    server { 
     listen    443 ssl; 
     #add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; 
     server_name   www.example.com; 
     ssl_certificate  /etc/letsencrypt/live/www.example.com/fullchain.pem; 
     ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem; 
     ssl_protocols  TLSv1 TLSv1.1 TLSv1.2; 
     ssl_ciphers   HIGH:!aNULL:!MD5; 

     location ^~ /.well-known/ { 
      root /usr/share/nginx/html; 
      allow all; 
     } 

     location/{ 
      proxy_set_header Host $host; 
      proxy_set_header X-Real-IP $remote_addr; 
      proxy_pass http://expresshelloworld:3000; 
     } 
    } 
} 

:まず、私たちは、TLS用に設定されているnginxの設定ファイルが必要になります

FROM nginx:alpine 
COPY nginx.conf /etc/nginx/nginx.conf 

これをすることができ次のコマンドを使用して構築:docker build -t expressnginx .

次我々はドッカーのサービスディスカバリ機能を利用することができますので、我々は独自のネットワークを作成します:

docker network create -d bridge expressnet 

今、私たちは、HelloWorldとnginxのコンテナを起動することができます

docker run -d \ 
    --name expresshelloworld --net expressnet exampleexpress 
docker run -d -p 80:80 -p 443:443 \ 
    --name expressnginx --net expressnet \ 
    -v /etc/letsencrypt:/etc/letsencrypt \ 
    -v /usr/share/nginx/html:/usr/share/nginx/html \ 
    expressnginx 

nginxのはdocker logs expressnginxの出力を見てとることで、適切に思い付いたことをダブルチェックを。

nginx設定ファイルは、ポート80のすべての要求をポート443にリダイレクトする必要があります。

curl -v http://www.example.com/ 

我々はまた、この時点では、成功したTLS接続を行うことができるはず、と戻って私たちのHello World!応答を参照してください:我々は、次を実行していることをテストすることができ

curl -v https://www.example.com/ 

を今、更新プロセスを設定します。上記のnginx.confには、Webルート照合方法のための既知の既知のパスを指定するための規定があります。次のコマンドを実行すると、更新が処理されます。有効期限が切れる前に、あなたの本命が更新されるように、通常、あなたがcronののいくつかの並べ替えにこのコマンドを実行します:

export [email protected] 
export DNSNAME=www.example.com 

docker run --rm --name letsencrypt \ 
    -v "/etc/letsencrypt:/etc/letsencrypt" \ 
    -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \ 
    -v "/usr/share/nginx/html:/usr/share/nginx/html" \ 
    quay.io/letsencrypt/letsencrypt:latest \ 
    certonly -n --webroot -w /usr/share/nginx/html -d $DNSNAME --agree-tos 
+0

偉大なチュートリアルです。これは受け入れられる答えです –

0

フロントエンド - nginxの - 443ポートをリスニングし、プロキシ・ベック端に

戻るを終了 - あなたは、私が最近のnginxを使用してみましょう暗号化してHTTPSを実装しましたコンテナ

関連する問題