DockerでNode.jsアプリケーションを構築する方法

前書き

Dockerプラットフォームを使用すると、開発者はアプリケーションを_containers_としてパッケージ化して実行できます。 コンテナは、共有オペレーティングシステム上で実行される独立したプロセスであり、仮想マシンに代わる軽量な代替手段を提供します。 コンテナは新しいものではありませんが、プロセスの分離や環境の標準化などの利点があり、開発者が分散アプリケーションアーキテクチャを使用するにつれて重要性が増しています。

Dockerを使用してアプリケーションを構築およびスケーリングする場合の出発点は、通常、アプリケーション用のイメージを作成することです。その後、イメージをコンテナーで実行できます。 イメージには、アプリケーションコード、ライブラリ、構成ファイル、環境変数、およびランタイムが含まれます。 イメージを使用すると、コンテナ内の環境が標準化され、アプリケーションのビルドと実行に必要なもののみが含まれることが保証されます。

このチュートリアルでは、https://expressjs.com/ [Express]フレームワークとhttps://getbootstrap.com/[Bootstrap]を使用する静的Webサイトのアプリケーションイメージを作成します。 次に、そのイメージを使用してコンテナを構築し、将来使用するためにhttps://hub.docker.com/[Docker Hub]にプッシュします。 最後に、保存されたイメージをDocker Hubリポジトリからプルして別のコンテナーを構築し、アプリケーションを再作成およびスケーリングする方法を示します。

前提条件

このチュートリアルを実行するには、次のものが必要です。

手順1-アプリケーションの依存関係のインストール

イメージを作成するには、まずアプリケーションファイルを作成する必要があります。その後、アプリケーションファイルをコンテナにコピーできます。 これらのファイルには、アプリケーションの静的コンテンツ、コード、依存関係が含まれます。

まず、非ルートユーザーのホームディレクトリにプロジェクトのディレクトリを作成します。 これを「++」と呼びますが、これを別のものに置き換えてください。

mkdir

このディレクトリに移動します。

cd

これがプロジェクトのルートディレクトリになります。

次に、プロジェクトの依存関係とその他の識別情報を含むhttps://docs.npmjs.com/files/package.json [+ package.json +]ファイルを作成します。 `+ nano +`またはお気に入りのエディターでファイルを開きます:

nano package.json

名前、作成者、ライセンス、エントリポイント、依存関係など、プロジェクトに関する次の情報を追加します。 必ず著者情報を自分の名前と連絡先の詳細に置き換えてください。

〜/ node_project / package.json

{
 "name": "",
 "version": "1.0.0",
 "description": "nodejs image demo",
 "author": "",
 "license": "MIT",
 "main": "app.js",
 "keywords": [
   "nodejs",
   "bootstrap",
   "express"
 ],
 "dependencies": {
   "express": "^4.16.4"
 }
}

このファイルには、プロジェクトを共有するプロジェクト名、作成者、およびライセンスが含まれています。 Npm https://docs.npmjs.com/files/package.json#name [推奨]プロジェクト名を短くわかりやすいものにし、https://www.npmjs.com/ [npm registry]での重複を避けます。 ライセンスフィールドにhttps://opensource.org/licenses/MIT[MIT license]をリストし、アプリケーションコードの無料使用と配布を許可しました。

さらに、指定されたファイル:

  • " main ":アプリケーションのエントリポイント、 + app.js。 次にこのファイルを作成します。

  • " dependencies ":プロジェクトの依存関係-この場合、Express 4.16.4以降。

このファイルにはリポジトリがリストされていませんが、https://docs.npmjs.com/files/package.json#repository [リポジトリを `+ package.json +`ファイルに追加する]のガイドラインに従ってリポジトリを追加できます。 これは、アプリケーションをバージョン管理している場合に便利な追加機能です。

変更が完了したら、ファイルを保存して閉じます。

プロジェクトの依存関係をインストールするには、次のコマンドを実行します。

npm install

これにより、プロジェクトディレクトリの `+ package.json +`ファイルにリストしたパッケージがインストールされます。

これで、アプリケーションファイルの作成に進むことができます。

ステップ2-アプリケーションファイルの作成

サメに関する情報をユーザーに提供するウェブサイトを作成します。 アプリケーションには、メインのエントリポイントである「+ app.js 」と、プロジェクトの静的アセットを含む「 views 」ディレクトリがあります。 ランディングページの「 index.html 」は、ユーザーに予備的な情報と、より詳細なサメの情報「 sharks.html 」を含むページへのリンクを提供します。 ` views`ディレクトリで、ランディングページと` + sharks.html`の両方を作成します。

まず、プロジェクトのメインディレクトリで「+ app.js +」を開き、プロジェクトのルートを定義します。

nano app.js

ファイルの最初の部分では、Expressアプリケーションとルーターオブジェクトを作成し、ベースディレクトリとポートを定数として定義します。

〜/ node_project / app.js

const express = require('express');
const app = express();
const router = express.Router();

const path = __dirname + '/views/';
const port = 8080;

+ require`関数は + express + モジュールをロードし、それを使用して + app`および `+ router&`オブジェクトを作成します。 `+ router +`オブジェクトはアプリケーションのルーティング機能を実行し、HTTPメソッドルートを定義するときに、それらをこのオブジェクトに追加して、アプリケーションがリクエストを処理する方法を定義します。

ファイルのこのセクションでは、いくつかの定数、「+ path」と「+ port」も設定します。

  • + path +:ベースディレクトリを定義します。これは、現在のプロジェクトディレクトリ内の `+ views +`サブディレクトリになります。

  • + port +:ポート `+ 8080 +`をリッスンしてバインドするようアプリに指示します。

次に、 `+ router +`オブジェクトを使用してアプリケーションのルートを設定します。

〜/ node_project / app.js

...

router.use(function (req,res,next) {
 console.log('/' + req.method);
 next();
});

router.get('/', function(req,res){
 res.sendFile(path + 'index.html');
});

router.get('/sharks', function(req,res){
 res.sendFile(path + 'sharks.html');
});

`+ router.use `関数はhttps://expressjs.com/en/guide/writing-middleware.html [ミドルウェア関数]を読み込み、ルーターのリクエストをログに記録し、それらをアプリケーションのルートに渡します。 これらは後続の関数で定義され、ベースプロジェクトURLへのGETリクエストは ` index.html `ページを返し、 ` / sharks `ルートへのGETリクエストは ` sharks.html +`を返すことを指定します。 。

最後に、 `+ router `ミドルウェアとアプリケーションの静的アセットをマウントし、ポート ` 8080 +`でリッスンするようアプリに指示します。

〜/ node_project / app.js

...

app.use(express.static(path));
app.use('/', router);

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

完成した `+ app.js`ファイルは次のようになります。

〜/ node_project / app.js

const express = require('express');
const app = express();
const router = express.Router();

const path = __dirname + '/views/';
const port = 8080;

router.use(function (req,res,next) {
 console.log('/' + req.method);
 next();
});

router.get('/', function(req,res){
 res.sendFile(path + 'index.html');
});

router.get('/sharks', function(req,res){
 res.sendFile(path + 'sharks.html');
});

app.use(express.static(path));
app.use('/', router);

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

完了したら、ファイルを保存して閉じます。

次に、アプリケーションにいくつかの静的コンテンツを追加しましょう。 `+ views +`ディレクトリを作成することから始めます:

mkdir views

ランディングページファイル、 `+ index.html`を開きます。

nano views/index.html

次のコードをファイルに追加します。これにより、Boostrapがインポートされ、https://getbootstrap.com/docs/4.0/components/jumbotron/ [jumbotron]コンポーネントが作成され、詳細な `+ sharks.html +`情報ページへのリンクが作成されます。 :

〜/ node_project / views / index.html

<!DOCTYPE html>
<html lang="en">

<head>
   <title>About Sharks</title>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
   <link href="css/styles.css" rel="stylesheet">
   <link href="https://fonts.googleapis.com/css?family=Merriweather:400,700" rel="stylesheet" type="text/css">
</head>

<body>
   <nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md">
       <div class="container">
           <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span>
           </button> <a class="navbar-brand" href="#">Everything Sharks</a>
           <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
               <ul class="nav navbar-nav mr-auto">
                   <li class="active nav-item"><a href="/" class="nav-link">Home</a>
                   </li>
                   <li class="nav-item"><a href="/sharks" class="nav-link">Sharks</a>
                   </li>
               </ul>
           </div>
       </div>
   </nav>
   <div class="jumbotron">
       <div class="container">
           <h1>Want to Learn About Sharks?</h1>
           <p>Are you ready to learn about sharks?</p>
           <br>
           <p><a class="btn btn-primary btn-lg" href="/sharks" role="button">Get Shark Info</a>
           </p>
       </div>
   </div>
   <div class="container">
       <div class="row">
           <div class="col-lg-6">
               <h3>Not all sharks are alike</h3>
               <p>Though some are dangerous, sharks generally do not attack humans. Out of the 500 species known to researchers, only 30 have been known to attack humans.
               </p>
           </div>
           <div class="col-lg-6">
               <h3>Sharks are ancient</h3>
               <p>There is evidence to suggest that sharks lived up to 400 million years ago.
               </p>
           </div>
       </div>
   </div>
</body>

</html>

ここでトップレベルのhttps://getbootstrap.com/docs/4.0/components/navbar/[navbar]を使用すると、ユーザーは* Home ページと Sharks *ページを切り替えることができます。 + navbar-nav`サブコンポーネントでは、Bootstrapの + active`クラスを使用して、ユーザーに現在のページを示します。 また、静的ページへのルートを指定しました。これは、 `+ app.js +`で定義したルートと一致します。

〜/ node_project / views / index.html

...
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
  <ul class="nav navbar-nav mr-auto">
     <li class="active nav-item"><a href="/" class="nav-link">Home</a>
     </li>
     <li class="nav-item"><a href="/sharks" class="nav-link">Sharks</a>
     </li>
  </ul>
</div>
...

さらに、ジャンボトロンのボタンにサメ情報ページへのリンクを作成しました。

〜/ node_project / views / index.html

...
<div class="jumbotron">
  <div class="container">
     <h1>Want to Learn About Sharks?</h1>
     <p>Are you ready to learn about sharks?</p>
     <br>
     <p><a class="btn btn-primary btn-lg" href="/sharks" role="button">Get Shark Info</a>
     </p>
  </div>
</div>
...

ヘッダーにはカスタムスタイルシートへのリンクもあります。

〜/ node_project / views / index.html

...
<link href="css/styles.css" rel="stylesheet">
...

このスタイルシートは、この手順の最後に作成します。

完了したら、ファイルを保存して閉じます。

アプリケーションのランディングページを配置したら、サメの情報ページである `+ sharks.html +`を作成し、関心のあるユーザーにサメに関する詳細情報を提供します。

ファイルを開きます。

nano views/sharks.html

Bootstrapとカスタムスタイルシートをインポートし、特定のサメに関する詳細情報をユーザーに提供する次のコードを追加します。

〜/ node_project / views / sharks.html

<!DOCTYPE html>
<html lang="en">

<head>
   <title>About Sharks</title>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
   <link href="css/styles.css" rel="stylesheet">
   <link href="https://fonts.googleapis.com/css?family=Merriweather:400,700" rel="stylesheet" type="text/css">
</head>
<nav class="navbar navbar-dark bg-dark navbar-static-top navbar-expand-md">
   <div class="container">
       <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span>
       </button> <a class="navbar-brand" href="/">Everything Sharks</a>
       <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
           <ul class="nav navbar-nav mr-auto">
               <li class="nav-item"><a href="/" class="nav-link">Home</a>
               </li>
               <li class="active nav-item"><a href="/sharks" class="nav-link">Sharks</a>
               </li>
           </ul>
       </div>
   </div>
</nav>
<div class="jumbotron text-center">
   <h1>Shark Info</h1>
</div>
<div class="container">
   <div class="row">
       <div class="col-lg-6">
           <p>
               <div class="caption">Some sharks are known to be dangerous to humans, though many more are not. The sawshark, for example, is not considered a threat to humans.
               </div>
               <img src="https://assets.digitalocean.com/articles/docker_node_image/sawshark.jpg" alt="Sawshark">
           </p>
       </div>
       <div class="col-lg-6">
           <p>
               <div class="caption">Other sharks are known to be friendly and welcoming!</div>
               <img src="https://assets.digitalocean.com/articles/docker_node_image/sammy.png" alt="Sammy the Shark">
           </p>
       </div>
   </div>
</div>

</html>

このファイルでは、 `+ active +`クラスを再び使用して現在のページを示していることに注意してください。

完了したら、ファイルを保存して閉じます。

最後に、最初に `+ views `ディレクトリに ` css `フォルダを作成して、 ` index.html `と ` sharks.html +`にリンクしたカスタムCSSスタイルシートを作成します。

mkdir views/css

スタイルシートを開きます。

nano views/css/styles.css

ページに必要な色とフォントを設定する次のコードを追加します。

〜/ node_project / views / css / styles.css

.navbar {
   margin-bottom: 0;
}

body {
   background: #020A1B;
   color: #ffffff;
   font-family: 'Merriweather', sans-serif;
}

h1,
h2 {
   font-weight: bold;
}

p {
   font-size: 16px;
   color: #ffffff;
}

.jumbotron {
   background: #0048CD;
   color: white;
   text-align: center;
}

.jumbotron p {
   color: white;
   font-size: 26px;
}

.btn-primary {
   color: #fff;
   text-color: #000000;
   border-color: white;
   margin-bottom: 5px;
}

img,
video,
audio {
   margin-top: 20px;
   max-width: 80%;
}

div.caption: {
   float: left;
   clear: both;
}

フォントと色の設定に加えて、このファイルは80%の `+ max-width +`を指定することで画像のサイズも制限します。 これにより、ページで希望するよりも多くのスペースを使用できなくなります。

完了したら、ファイルを保存して閉じます。

アプリケーションファイルを配置し、プロジェクトの依存関係をインストールしたら、アプリケーションを起動する準備が整いました。

前提条件の初期サーバーセットアップチュートリアルに従った場合、SSHトラフィックのみを許可するアクティブなファイアウォールがあります。 ポート「8080」へのトラフィックを許可するには、次を実行します。

sudo ufw allow 8080

アプリケーションを開始するには、プロジェクトのルートディレクトリにいることを確認してください。

cd ~/

`+ node app.js`でアプリケーションを起動します:

node app.js

ブラウザを「+ http://:8080+」に移動します。 次のランディングページが表示されます。

image:https://assets.digitalocean.com/articles/docker_node_image/landing_page.png [アプリケーションのランディングページ]

  • Get Shark Info *ボタンをクリックします。 次の情報ページが表示されます。

image:https://assets.digitalocean.com/articles/docker_node_image/sharks.png [サメ情報ページ]

これで、アプリケーションが稼働しました。 準備ができたら、「+ CTRL + C +」と入力してサーバーを終了します。 これで、Dockerfileの作成に進むことができます。これにより、必要に応じてこのアプリケーションを再作成およびスケーリングできます。

ステップ3-Dockerfileの作成

Dockerfileは、実行時にアプリケーションコンテナに含まれるものを指定します。 Dockerfileを使用すると、コンテナー環境を定義し、依存関係またはランタイムバージョンとの矛盾を回避できます。

https://www.digitalocean.com/community/tutorials/building-optimized-containers-for-kubernetes [最適化されたコンテナの構築に関するこれらのガイドライン]に従って、画像レイヤーの数を最小限に抑え、画像を可能な限り効率的にします。画像の機能を単一の目的に制限します-アプリケーションファイルと静的コンテンツを再作成します。

プロジェクトのルートディレクトリで、Dockerfileを作成します。

nano Dockerfile

Dockerイメージは、相互に構築される一連のレイヤー化されたイメージを使用して作成されます。 最初のステップは、アプリケーションビルドの開始点を形成するアプリケーションのベースイメージを追加することです。

https://hub.docker.com//node/ [+ node:+ image]を使用しましょう。これは執筆時点ではhttps://nodejs.org/en/ [推奨されるLTSバージョンNode.jsの]。 `+ alpine `イメージはhttps://alpinelinux.org/[Alpine Linux]プロジェクトから派生したもので、イメージのサイズを小さくするのに役立ちます。 ` alpine +`画像がプロジェクトに適しているかどうかの詳細については、https://hub.docker.com//node/ [ Dockerハブノードの画像ページ]。

次の「+ FROM +」命令を追加して、アプリケーションのベースイメージを設定します。

〜/ node_project / Dockerfile

FROM node:

この画像にはNode.jsとnpmが含まれています。 各Dockerfileは、「+ FROM +」命令で始まる必要があります。

デフォルトでは、Docker Nodeイメージには非ルート* node ユーザーが含まれており、これを使用してアプリケーションコンテナーを root として実行しないようにすることができます。 コンテナを root として実行したり、https://docs.docker.com/engine/security/security/#linux-kernel-capabilities [コンテナ内の機能を制限する]を実行するのを必要なものだけにしないようにすることをお勧めします。プロセスを実行します。 したがって、 node *ユーザーのホームディレクトリをアプリケーションの作業ディレクトリとして使用し、それらをコンテナ内のユーザーとして設定します。 Docker Nodeイメージを使用する際のベストプラクティスの詳細については、https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md [ベストプラクティスガイド]を参照してください。

コンテナ内のアプリケーションコードの権限を微調整するには、「+ app 」ディレクトリとともに「 / home / node 」に「 node_modules 」サブディレクトリを作成しましょう。 これらのディレクトリを作成すると、必要なアクセス許可が確実に付与されます。これは、コンテナにローカルノードモジュールを ` npm install +`で作成するときに重要になります。 これらのディレクトリを作成することに加えて、* node *ユーザーにそれらの所有権を設定します。

〜/ node_project / Dockerfile

...
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

「+ RUN +」命令を統合するユーティリティの詳細については、https://www.digitalocean.com/community/tutorials/building-optimized-containers-for-kubernetes#managing-container-layers [方法の説明]を参照してくださいコンテナレイヤーの管理]。

次に、アプリケーションの作業ディレクトリを「+ / home / node / app」に設定します。

〜/ node_project / Dockerfile

...
WORKDIR /home/node/app

`+ WORKDIR +`が設定されていない場合、Dockerはデフォルトで作成しますので、明示的に設定することをお勧めします。

次に、 + package.json`および + package-lock.json`(npm 5+用)ファイルをコピーします。

〜/ node_project / Dockerfile

...
COPY package*.json ./

「+ npm install」を実行する前、またはアプリケーションコードをコピーする前にこの「+ COPY of」命令を追加すると、Dockerのキャッシュメカニズムを利用できます。 ビルドの各段階で、Dockerはその特定の命令に対してキャッシュされたレイヤーがあるかどうかを確認します。 `+ package.json +`を変更すると、このレイヤーが再構築されますが、変更しない場合、この命令によりDockerは既存のイメージレイヤーを使用し、ノードモジュールの再インストールをスキップできます。

`+ node_modules `ディレクトリの内容を含むすべてのアプリケーションファイルが非ルート* node *ユーザーによって所有されていることを確認するには、 ` npm install +`を実行する前にユーザーを* node *に切り替えます。

〜/ node_project / Dockerfile

...
USER node

プロジェクトの依存関係をコピーしてユーザーを切り替えたら、 `+ npm install`を実行できます。

〜/ node_project / Dockerfile

...
RUN npm install

次に、適切な権限を持つアプリケーションコードをコンテナのアプリケーションディレクトリにコピーします。

〜/ node_project / Dockerfile

...
COPY --chown=node:node . .

これにより、アプリケーションファイルが非ルート* node *ユーザーによって所有されていることが保証されます。

最後に、コンテナのポート「8080」を公開し、アプリケーションを起動します。

〜/ node_project / Dockerfile

...
EXPOSE 8080

CMD [ "node", "app.js" ]

+ EXPOSE +`はポートを公開しませんが、代わりに、コンテナーのどのポートが実行時に公開されるかを文書化する方法として機能します。 `+ CMD +`はコマンドを実行してアプリケーションを起動します-この場合、https://github.com/nodejs/docker-node/blob/master/docs/BestPractices.md#cmd [+ node app.js `] 。 各Dockerfileには1つの ` CMD +`命令のみが存在することに注意してください。 複数を含めると、最後のものだけが有効になります。

Dockerfileでできることはたくさんあります。 手順の完全なリストについては、Dockerのhttps://docs.docker.com/engine/reference/builder/[Dockerfileリファレンスドキュメント]を参照してください。

完全なDockerfileは次のようになります。

〜/ node_project / Dockerfile

FROM node:10-alpine

RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app

WORKDIR /home/node/app

COPY package*.json ./

USER node

RUN npm install

COPY --chown=node:node . .

EXPOSE 8080

CMD [ "node", "app.js" ]

編集が終了したら、ファイルを保存して閉じます。

アプリケーションイメージをビルドする前に、https://docs.docker.com/engine/reference/builder/#dockerignore-file [+ .dockerignore + file]を追加しましょう。 https://git-scm.com/docs/gitignore [+ .gitignore + file]と同様の方法で作業し、 `+ .dockerignore +`はプロジェクトディレクトリ内のどのファイルとディレクトリをコピーしないかを指定します容器。

`+ .dockerignore +`ファイルを開きます:

nano .dockerignore

ファイル内に、ローカルノードモジュール、npmログ、Dockerfile、および `+ .dockerignore +`ファイルを追加します。

〜/ node_project / .dockerignore

node_modules
npm-debug.log
Dockerfile
.dockerignore

Gitを使用している場合は、 `+ .git `ディレクトリと ` .gitignore +`ファイルも追加する必要があります。

完了したら、ファイルを保存して閉じます。

これで、https://docs.docker.com/engine/reference/commandline/build/ [+ docker build +]コマンドを使用してアプリケーションイメージをビルドする準備ができました。 `+ docker build `で ` -t +`フラグを使用すると、覚えやすい名前で画像にタグを付けることができます。 画像をDocker Hubにプッシュするため、タグにDocker Hubユーザー名を含めます。 画像に「」というタグを付けますが、これを自由に任意の名前に置き換えてください。 また、「」を独自のDocker Hubユーザー名に置き換えることを忘れないでください。

docker build -t / .

`。`は、ビルドコンテキストが現在のディレクトリであることを指定します。

イメージの構築には1〜2分かかります。 完了したら、画像を確認します。

docker images

次の出力が表示されます。

OutputREPOSITORY                                         TAG                 IMAGE ID            CREATED             SIZE
/          latest              1c723fb2ef12        8 seconds ago       73MB
node                                               10-alpine           f09e7c96b6de        3 weeks ago        70.7MB

`+docker run + `を使用して、このイメージでコンテナを作成できるようになりました。 このコマンドには3つのフラグが含まれます。

  • + -p +:これはコンテナ上のポートを公開し、ホスト上のポートにマッピングします。 ホストではポート「80」を使用しますが、そのポートで別のプロセスを実行している場合は、必要に応じて自由に変更してください。 これがどのように機能するかについての詳細は、https://docs.docker.com/v17.09/engine/userguide/networking/default_network/binding/ [ポートバインディング]のDockerドキュメントのこの説明を参照してください。

  • + -d +:これはバックグラウンドでコンテナを実行します。

  • +-name +:これにより、コンテナに覚えやすい名前を付けることができます。

次のコマンドを実行して、コンテナを構築します。

docker run --name  -p :8080 -d /

コンテナーが稼働したら、https://docs.docker.com/engine/reference/commandline/ps/ [+ docker ps +]で実行中のコンテナーのリストを検査できます。

docker ps

次の出力が表示されます。

OutputCONTAINER ID        IMAGE                                                   COMMAND             CREATED             STATUS              PORTS                  NAMES
e50ad27074a7        /               "node app.js"       8 seconds ago       Up 7 seconds        0.0.0.0:80->8080/tcp   nodejs-image-demo

コンテナを実行した状態で、ブラウザを「+ http:// +」に移動して、アプリケーションにアクセスできるようになりました。 アプリケーションのランディングページが再び表示されます。

image:https://assets.digitalocean.com/articles/docker_node_image/landing_page.png [アプリケーションのランディングページ]

アプリケーションのイメージを作成したので、将来使用するためにDocker Hubにプッシュできます。

手順4-リポジトリを使用してイメージを操作する

アプリケーションイメージをDocker Hubなどのレジストリにプッシュすることにより、コンテナを構築およびスケーリングするときに、アプリケーションイメージを後で使用できるようにします。 アプリケーションイメージをリポジトリにプッシュし、イメージを使用してコンテナを再作成することにより、これがどのように機能するかを示します。

イメージをプッシュする最初のステップは、前提条件で作成したDocker Hubアカウントにログインすることです。

docker login -u

プロンプトが表示されたら、Docker Hubアカウントのパスワードを入力します。 この方法でログインすると、Docker Hubの資格情報を使用してユーザーのホームディレクトリに `+〜/ .docker / config.json`ファイルが作成されます。

これで、先ほど作成したタグ「+ / +」を使用して、アプリケーションイメージをDocker Hubにプッシュできます。

docker push /

現在のアプリケーションコンテナとイメージを破棄し、リポジトリ内のイメージで再構築して、イメージレジストリのユーティリティをテストしましょう。

最初に、実行中のコンテナをリストします。

docker ps

次の出力が表示されます。

OutputCONTAINER ID        IMAGE                                       COMMAND             CREATED             STATUS              PORTS                  NAMES
       /   "node app.js"       3 minutes ago       Up 3 minutes        0.0.0.0:80->8080/tcp   nodejs-image-demo

出力にリストされている `+ CONTAINER ID `を使用して、実行中のアプリケーションコンテナを停止します。 以下の強調表示されたIDを独自の ` CONTAINER ID +`に置き換えてください:

docker stop

すべての画像を `+ -a +`フラグでリストします:

docker images -a

イメージの名前が「+ / 」で、「 node +」イメージとビルドの他のイメージとともに、次の出力が表示されます。

OutputREPOSITORY                                           TAG                 IMAGE ID            CREATED             SIZE
/            latest              1c723fb2ef12        7 minutes ago       73MB
<none>                                               <none>              2e3267d9ac02        4 minutes ago       72.9MB
<none>                                               <none>              8352b41730b9        4 minutes ago       73MB
<none>                                               <none>              5d58b92823cb        4 minutes ago       73MB
<none>                                               <none>              3f1e35d7062a        4 minutes ago       73MB
<none>                                               <none>              02176311e4d0        4 minutes ago       73MB
<none>                                               <none>              8e84b33edcda        4 minutes ago       70.7MB
<none>                                               <none>              6a5ed70f86f2        4 minutes ago       70.7MB
<none>                                               <none>              776b2637d3c1        4 minutes ago       70.7MB
node                                                 10-alpine           f09e7c96b6de        3 weeks ago         70.7MB

次のコマンドを使用して、停止したコンテナと、未使用またはぶら下がり画像を含むすべての画像を削除します。

docker system prune -a

出力でプロンプトが表示されたら、「+ y +」と入力して、停止したコンテナとイメージを削除することを確認します。 これによりビルドキャッシュも削除されることに注意してください。

これで、アプリケーションイメージを実行しているコンテナとイメージ自体の両方が削除されました。 Dockerコンテナ、イメージ、およびボリュームの削除の詳細については、https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes [Dockerイメージを削除する方法]を参照してください。 、コンテナ、およびボリューム]。

すべてのイメージとコンテナーを削除したら、Docker Hubからアプリケーションイメージをプルできます。

docker pull /

画像をもう一度リストします。

docker images

アプリケーションイメージが表示されます。

OutputREPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE
/      latest              1c723fb2ef12        11 minutes ago      73MB

これで、ステップ3のコマンドを使用してコンテナを再構築できます。

docker run --name  -p :8080 -d /

実行中のコンテナーをリストします。

docker ps
OutputCONTAINER ID        IMAGE                                                   COMMAND             CREATED             STATUS              PORTS                  NAMES
f6bc2f50dff6        /               "node app.js"       4 seconds ago       Up 3 seconds        0.0.0.0:80->8080/tcp   nodejs-image-demo

もう一度 `+ http:// +`にアクセスして、実行中のアプリケーションを表示します。

結論

このチュートリアルでは、ExpressおよびBootstrapを使用して静的Webアプリケーションを作成し、このアプリケーションのDockerイメージを作成しました。 このイメージを使用してコンテナーを作成し、イメージをDocker Hubにプッシュしました。 そこから、イメージとコンテナーを破棄し、Docker Hubリポジトリーを使用してそれらを再作成できました。

Docker ComposeやDocker Machineなどのツールを使用して複数コンテナーのセットアップを作成する方法について詳しく知りたい場合は、次のガイドをご覧ください。

コンテナデータの操作に関する一般的なヒントについては、以下を参照してください。

他のDocker関連のトピックに興味がある場合は、https://www.digitalocean.com/community/tags/docker/tutorials [Dockerチュートリアル]の完全なライブラリをご覧ください。

前の投稿:Ubuntu 16.04でOrientDBクラスターを構成する方法
次の投稿:macOS上のRuby on RailsアプリケーションでPostgreSQLを使用する方法