Node.js imageに基づくDockerコンテナでExpressベースのWebサイトを実行しています。その画像に基づいてコンテナにLet's Encryptをどのように使用すればよいですか?使用方法Node.jsイメージに基づくDockerコンテナでLet's Encryptを使用する
答えて
:https://certbot.eff.org/docs/using.html?highlight=docker#running-with-docker
を次に私が個人的にやっていることは次のとおりです。
- 作成本命を格納し、上記画像
- で本命を生成するために、ドッカーボリュームを作成します。ドッカーのユーザー定義ネットワーク(https://docs.docker.com/engine/userguide/networking/#/user-defined-networks)
- 設定でnginxに基づいた画像を作成してください(おそらくthisが便利です)
- イメージに基づいてNginxコンテナを作成し、ボリュームをマウントしてネットワークに接続します(また、ポート80と443を任意のものに転送します)
- node.jsアプリケーションのコンテナを作成して接続しますあなたは(http://my-app:3210のように右URLへのTLS証明書とプロキシの正しい道をポイントし、)正しくnginxのを設定した場合、同じネットワークに
は今、あなたは、HTTPSでのアプリへのアクセス権を持っている必要があります。
私がやった最初のことは、簡単なエクスプレスベースのドッカー画像を作成することです。
私は彼らのドキュメントに明示の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_EMAIL
とDNSNAME
の値を置き換えてください。電子メールアドレスは有効期限通知に使用されます。
ここで、この新しく生成された証明書を使用する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
偉大なチュートリアルです。これは受け入れられる答えです –
フロントエンド - nginxの - 443ポートをリスニングし、プロキシ・ベック端に
戻るを終了 - あなたは、私が最近のnginxを使用してみましょう暗号化してHTTPSを実装しましたコンテナ
- 1. certbot/lets-encryptをDNSロードバランシングで使用していますか?
- 2. Geolocationプラグインを使用する方法GPSに基づくgetCurrentPostion
- 3. DockerコンテナでTensorBoardを使用する方法(Windowsの場合)
- 4. dockerコンテナを使用してpostgresデータベースに接続する方法
- 5. Dockerコンテナ内でプロキシを使用する
- 6. Dockerコンテナを使用してASP.NET Webアプリケーションをセットアップする方法
- 7. Dockerコンテナのメモリ使用量
- 8. Docker "config"コンテナ/ Dockerイメージ
- 9. コンテナ(Dockerコンテナ)のコンセプトを使用してアプリケーションを配信する方法
- 10. dockerコンテナのS3FSをmesosコンテナライザで使用
- 11. CSS&JavaScriptに基づくギャラリーモーダルで外部の.jpgイメージを使用しますか?
- 12. コンテナに使用できるDockerファイルシステムの容量を制限する方法
- 13. Dockerのロギングにfluentdを使用する場合、コンテナとイメージの名前を取得する方法は?
- 14. デバイスに基づく2つのビューポートの使用方法
- 15. JavaScript/Node.jsを使用してイメージを作成する方法は?
- 16. オラクルでループのために基づくcase文を使用する方法
- 17. Dismoのpredict()をデータフレームに基づく最大モデルで使用する方法
- 18. Dockerでtcpを使用する複数のコンテナを起動する方法
- 19. Docker Dockerを使用してコンテナを作成するrun
- 20. node.jsでプロトタイプを使用する方法
- 21. UbuntuでIISを使用してDockerのコンテナを実行する方法16.04 LTS
- 22. リクエストパラメータに基づいてカスタムレンダラを使用する方法は?
- 23. なぜ3DESでencrypt-decrypt-encrypt sequenceを使用するのですか
- 24. SCSS - @extendに基づくメソッド(classy css)で@mixinsを使用する
- 25. node.jsを使用したDocker開発ワークフロー
- 26. イメージでコンテンツタイプを使用する方法
- 27. Dockerコンテナ用のビルドソフトウェア - 管理方法
- 28. Dockerコンテナのディスク使用量の変更
- 29. DockerコンテナのX11フォワーディングの使用
- 30. JavaScriptを使用してDockerコンテナの名前を取得する方法は?
私が説明したことを実現するための詳細な手順を探しています。 – jsejcksn
これを達成する可能性は低いです。バリエーションが多すぎます。スタックオーバーフローの回答は、「ステップバイステップガイド」ではありません。あなたが試したことを記述して特定の質問をすると、より良い応答を得るかもしれません。 – duncanhall