お探しのクイックスタートガイド。
昨年ソフトウェアのトレンドを追ったのであれば、Dockerという言葉を聞くのにうんざりしているに違いありません。 コンテナ、隔離された仮想マシン、スーパーバイザー、DevOpsに関連するその他のVoodooマジックについて話している開発者の圧倒的な数に圧倒される可能性が高いでしょう。 今日はそれを理解します。 最後に、サービスとしてのコンテナとは何か、なぜコンテナが必要なのかを理解する時が来ました。
TL; DR
- 「なぜこれが必要なのですか?」
- すべての重要な用語の概要。
- なぜCaaSとDockerが必要なのですか。
- クイックスタート。
- Dockerをインストールします。
- コンテナを作成します。
- 実際のシナリオ。
- 静的Webサイトをホストするnginxコンテナーを作成します。
- ビルドツールを使用してDockerコマンドを自動化する方法を学びます。
「なぜこれが必要なのですか?」
少し前まで、私は自分自身に同じ質問をしました。 長い間頑固な開発者であった私は、ついに座って、コンテナを使用することのすばらしさを受け入れました。 ここに、それらを適用しようとする理由についての私の意見があります。
Docker?
Docker-コンテナ化されたアプリケーションを作成するためのソフトウェア。 コンテナは小さく、ソフトウェアを実行するための環境情報を保存しないでください。
コンテナイメージは、コード、ランタイム、システムツール、システムライブラリ、設定など、実行に必要なすべてを含むソフトウェアの軽量でスタンドアロンの実行可能パッケージです。
-Dockerの公式Webサイト。
要するに、コンテナは、入れられたアプリケーションを実行するための基本的な機能を備えた小さな仮想マシンです。
仮想マシン?
「仮想マシン」(VM)という名前は、それ自体を表しています。これは、より大きなマシン内のマシンのハードウェアを模倣する実際のマシンの仮想バージョンです。 そのため、1つの大きなサーバー上で多くの仮想マシンを実行できます。 映画「Beginning」を見たことがありますか? 仮想マシンは「開始」のようなものです。 VMを機能させるソフトウェアは、ハイパーバイザーと呼ばれます。
ハイパーバイザー?
新しい用語をめぐる頭脳がありますか? 正当な理由のために、少し時間がかかります。 仮想マシンは、ハイパーバイザーが原因でのみ機能します。 これは、物理マシンが複数の異なる仮想マシンをホストできるようにする特別なソフトウェアです。 外部から見ると、VMは独自のプログラムを実行し、ホストハードウェアを使用しているようです。 ただし、このハイパーバイザーはリソースを仮想マシンに割り当てます。
注:ソフトウェア(VirtualBoxなど)をインストールしようとして失敗した場合は、コンピューターのBIOSで仮想化システムがアクティブになっていないことが原因である可能性があります。 おそらく、これは私が一度覚えている以上に私に起こりました。 神経質な笑い**
あなたが私のようなオタクなら、Hypervisorとは何かに関する素晴らしい投稿があります。
質問に答える...
CaaSとは何ですか? 長い間、仮想マシンを使用しています。 コンテナが突然良くなったのはなぜですか? 仮想マシンが悪いと言う人は誰もいません。扱いが難しいだけです。
原則として、DevOpsは複雑であり、任命された人は常に彼に関連する仕事をする必要があります。 仮想マシンは多くのスペースとRAMを占有し、一定の構成も必要です。 それらを適切に管理するには経験が必要であるという事実は言うまでもありません。
ダブルワークを行わないために、自動化する
Dockerでは、通常の構成と環境設定を無視して、代わりにコーディングに集中できます。 Docker Hubを使用すると、事前に作成された画像を取得して、短時間で機能させることができます。
しかし、最大の利点は、同種の環境を作成できることです。 さまざまな依存関係のリストを設定してアプリケーションを実行する代わりに、Dockerのみをインストールする必要があります。 Dockerはクロスプラットフォームなので、各チーム開発者は同じ環境で作業します。 開発、本番、および本番サーバーについても同様です。 これはすごい! もう「私のマシンで動く」ということはありません。
クイックスタート
インストールから始めましょう。 驚くべきことに、開発マシンにインストールされているソフトウェアの一部のみが必要であり、すべてが正常に機能します。 Dockerがあれば十分です。
Dockerをインストールする
幸いなことに、インストールプロセスは非常に簡単です。 これが、 Ubuntuでのインストール方法です。
$ sudo apt-get update $ sudo apt-get install -y docker.io
必要なのはそれだけです。 Dockerが機能していることを確認するには、別のコマンドを実行できます。
$ sudo systemctl status docker
Dockerは結果を返すはずです。
● docker.service – Docker Application Container Engine Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-01-14 12:42:17 CET; 4h 46min ago Docs: https://docs.docker.com Main PID: 2156 (dockerd) Tasks: 26 Memory: 63.0M CPU: 1min 57.541s CGroup: /system.slice/docker.service ├─2156 /usr/bin/dockerd -H fd:// └─2204 docker-containerd --config /var/run/docker/containerd/containerd.toml
システムサービスが停止している場合は、2つのコマンドの組み合わせを実行してDockerを展開し、起動時に起動することを確認します。
$ sudo systemctl start docker && sudo systemctl enable docker
Dockerの基本インストールでは、 docker
をsudo
として実行する必要があります。 ただし、ユーザーをdocker
グループに追加すると、 sudo
なしでコマンドを実行できます。
$ sudo usermod -aG docker ${USER} $ su - ${USER}
コマンドを実行すると、ユーザーがdocker
グループに追加されます。 これを確認するには、 $ id -nG
実行します。 リストにあるユーザー名で出力デバイスに戻ると、すべてが正しく行われています。
MacとWindowsはどうですか? 幸いなことに、インストールは簡単です。 インストールウィザードを起動する簡単なファイルをダウンロードします。 これ以上簡単なことはありません。 Macの場合はインストールウィザードを、Windowsの場合はこちらをご覧ください 。
コンテナ展開
Dockerをデプロイして実行した後、少し実験することができます。 仕事をする必要がある最初の4つのチーム:
- create-コンテナがイメージから作成されます;
- ps-実行中のコンテナのリストが表示されます。オプションで、すべてのコンテナのリストに
-a
フラグが表示されます。 - start-作成されたコンテナを開始します。
- attach-ターミナルの標準入力と出力を作業コンテナに接続し、仮想マシンのように文字通りコンテナに接続します。
小さく始めましょう。 Docker HubからUbuntuイメージを取得し、そこからコンテナーを作成します。
$ docker create -it ubuntu:16.04 bash
-it
をオプションの関数として追加して、コンテナに統合端末を提供します。 ターミナルに接続して、 bash
コマンドを実行することもできます。 ubuntu: 16.04
指して、Docker Hubからタグバージョン16.04のUbuntuイメージを取得します。
createコマンドを実行した後、コンテナが作成されたことを確認します。
$ docker ps -a
リストは次のようになります。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7643dba89904 ubuntu:16.04 "bash" X min ago Created name
コンテナが作成され、実行する準備ができました。 コンテナーのstart
は簡単です。 コンテナーの start
IDコマンドを指定します。
$ docker start 7643dba89904
コンテナーが実行されているかどうかを再度確認しますが、 -a
フラグはありません。
$ docker ps
実行中の場合は、参加してください。
$ docker attach 7643dba89904
カーソルが変化しています。 なんで? コンテナに入ったばかりだからです。 これで、Ubuntuで慣れているbashコマンドを、クラウドで実行されているインスタンスのように実行できます。 試してみてください。
$ ls
すべてがうまく機能し、 $ ll
でも機能します。 必要なのは、単純なdockerコンテナーだけです。 これは、開発、テスト、その他何でもできる小さな仮想プラットフォームです! 仮想マシンや重いソフトウェアを使用する必要はありません。 私のポイントをテストするには、この小さなコンテナに何かをインストールします。 ノードのインストールはうまくいきます。 コンテナを終了する場合は、exitと入力しexit
。 コンテナが停止し、 $ docker ps -a
入力して一覧表示できます。
ご注意 各Dockerコンテナはデフォルトでsudo
として機能します。つまり、 sudo
は存在しません。 実行される各コマンドは、 sudo
特権で自動的に起動されます。
実際のシナリオ
この資料で作業する時間。 これは、実際のプロジェクトや本番アプリケーションで使用するものです。
ステートレスコンテナまたはプロトコル?
前述のように、各コンテナは分離されており、状態は保持されません。 つまり、コンテナを削除すると、その内容は完全に削除されます。
$ docker rm 7643dba89904
この場合、どのようにデータを保存しますか?
ボリュームを聞いたことがありますか? ボリュームを使用すると、ホストマシン上のディレクトリをコンテナ内のディレクトリにマップできます。
$ docker create -it -v $(pwd):/var/www ubuntu:latest bash
新しいコンテナを作成する場合、作成するボリュームを示す-v
フラグを追加します。 このコマンドは、コンピューター上の現在の作業ディレクトリをコンテナ内の/ var / www
ディレクトリにバインドします。
$ docker start <container_id>
を使用してコンテナを起動した後、メインマシンでコードを編集して、コンテナの変更を確認できます。 イメージの保存からデータベースファイルの保存まで、さまざまなユースケースのデータを保存できるようになりました。もちろん、ライブリブート機能が必要な開発用にも保存できます。
ご注意 createコマンドとstartコマンドは、runコマンドと同時に実行できます。
$ docker run -it -d ubuntu:16.04 bash
ご注意 唯一の追加は-dフラグで、これはコンテナがバックグラウンドで個別に動作するように指示します。
ボリュームについてそんなに話しているのはなぜですか?
いくつかの簡単な手順で、静的なWebサイトをホストする単純なnginx Webサーバーを作成できます。
新しいディレクトリを作成し、好きな名前を付けます。便宜上、 myappという名前を付けます。 必要なのは、 myappディレクトリに簡単なindex.htmlファイルを作成して貼り付けるだけです。
<!-- index.html --> <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 Quick Start</title> </head> <body> <div class="container"> <h1>Hello Docker</h1> <p>This means the nginx server is working.</p> </div> </body> </html>
= "スタイルシート"整合性=「SHA256-MfvZlkHCEqatNoGiOXveE8FIwMzZg4W85qfrfIFBfYc = SHA512-dTfge / zgoMYpP7QbHy4gWMEGsbsdZeCXz7irItjcC3sPUFtf0kuFbDz / ixG7ArTxmDjLXDmezHubeNikyKGVyQ == <!-- index.html --> <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 Quick Start</title> </head> <body> <div class="container"> <h1>Hello Docker</h1> <p>This means the nginx server is working.</p> </div> </body> </html>
タイトルテキスト付きの共通Webページがあります。 nginxコンテナを起動するために残ります。
$ docker run --name webserver -v $(pwd):/usr/share/nginx/html -d -p 8080:80 nginx
Dockerハブからnginxイメージをキャプチャして、nginxを即座に構成します。 ボリューム構成は上記で行ったものと同様です。 nginxがHTMLファイルをホストするデフォルトのディレクトリを指しています。 新しいのは--name
パラメーターで、これはwebserver
および-p 8080: 80
ます。 コンテナポート80をホストマシンのポート8080にマッピングしました 。 myappディレクトリでコマンドを忘れずに実行してください。
コンテナーが$ docker ps
で機能し、ブラウザーウィンドウが起動するかどうかを確認します。 http: // localhost: 8080
移動しhttp: // localhost: 8080
。
ほんの2、3のコマンドで起動するnginx Webサーバーがあります。 必要に応じてindex.htmlで編集します。 ページをリロードして、コンテンツが変更されたことを確認します。
ご注意 stopコマンドを使用して、実行中のコンテナを停止できます。
$ docker stop <container_id>
人生をもっと楽にする方法は?
言い回しがあります:何かを2回行う必要がある場合は、自動化します。 幸いなことに、Dockeがこれを処理しました。 index.htmlファイルを使用して、 Dockerファイルを追加します。 彼の名前はDockerfileで 、拡張子はありません。
# Dockerfile FROM nginx:alpine VOLUME /usr/share/nginx/html EXPOSE 80
Dockerfile -Dockerイメージのアセンブリ構成。 焦点は画像にあります ! nginx:alpineイメージをイメージのベースとしてキャプチャし、ボリュームを作成し、ポート80を設定することを示します。
イメージを作成するために、buildコマンドがあります。
$ docker build . -t webserver:v1
.
Dockerファイルがイメージのビルドに使用される場所を示し、 -t
はイメージのタグをマークします。 イメージはwebserver:v1
として知られます。
このコマンドでは、Docker Hubからイメージを抽出するのではなく、独自のイメージを作成しました。 すべての画像を表示するには、 images
コマンドを使用しimages
。
$ docker images
作成されたイメージを実行します。
$ docker run -v $(pwd):/usr/share/nginx/html -d -p 8080:80 webserver:v1
Dockerfile Strengthは、コンテナに提供できるアドオンです。 好みに合わせてイメージを事前に作成できます。繰り返しのタスクが気に入らない場合は、もう1ステップ行ってdocker-composeをインストールしてください 。
Docker-compose?
Docker-composeを使用すると、1つのコマンドからコンテナーを作成して実行できます。 しかし、さらに重要なことは、コンテナーのクラスター全体を構築し、docker-composeを使用して構成できることです。
インストールページに移動して、コンピューターにdocker-composeをインストールします。
Docker Composeをインストールする
デバイスに戻ったら、 $ docker-compose --version
実行します。 いくつかの作曲を扱います。
Dockerfileとともに、docker -compose.ymlという別のファイルを追加し、このスニペットを貼り付けます。
# docker-compose.yml version: '2' services: webserver: build: . ports: - "8080:80" volumes: - .:/usr/share/nginx/html
インデントには注意してください。そうしないと、* docker-compose.yml **が正しく機能しません。 実行するためだけに残ります。
$ docker-compose up (-d)
ご注意 docker-compose-d
コマンドの引数を使用して、切り離された状態で起動します。$ docker-compose ps
を実行して現在動作しているものを確認したり、$ docker-compose stop
を使用してコンテナーを$ docker-compose stop
ます。
Dockerは、現在のディレクトリ( .
)のDockerfileからイメージを収集し、上記のようにポートを表示し、ボリュームを「ファンブル」します。 何が起こるか見てください! ビルドおよび実行コマンドで行ったのと同じこと。 今では、それらの代わりにdocker-compose up
1つだけ実行します。
ブラウザに戻ると、すべてが以前と同じように機能することがわかります。 唯一の違いは、ターミナルでの退屈なコマンドの記述が不要になったことです。 それらをDockerfile
とDockerfile
docker-compose.yml
2つの構成ファイルに置き換えました。 これらのファイルは両方ともGitリポジトリに追加できます。 なぜこれが重要なのですか? 予想どおり、本番環境では常に正しく機能するためです。 まったく同じコンテナネットワークが運用サーバーに展開されます!
このセクションを終了するには、コンソールに戻り、すべてのコンテナのリストを再度表示します。
$ docker ps -a
コンテナを削除する場合は、前述のrm
コマンドを実行できます。 イメージを削除するには、 rmi
コマンドを使用します。
$ docker rmi <image_id>
不要になった場合は、コンテナの残余物を残さないでください。
より広い視野?
Dockerがコンテナーを作成するための唯一のテクノロジーではないことを確認したので、あまり人気のないテクノロジーを間違いなく言及しなければなりません。 Dockerは、最も一般的なコンテナー化オプションです。 しかし、 RKTも正常に機能するようです。
掘り下げて、コンテナのオーケストレーションに言及する必要があります。 氷山の一角についてだけ話しました。 Docker-composeは、コンテナネットワークを作成するためのツールです。 ただし、大量のコンテナを管理し、最大の稼働時間を提供する必要が生じた場合、オーケストレーションが役立ちます。
大規模なコンテナベースのクラスターの管理は簡単な作業ではありません。 コンテナの数が増えるにつれて、通常行うさまざまなDevOpsタスクを自動化する方法が必要になります。 オーケストレーションは、ドロップされたコンテナ、ネットワークコンテナなどをスケーリングまたは再作成する必要がある場合に、ホストの作成、コンテナの作成または削除に役立つものです。 そしてここで、 GoogleのKubernetesと独自のDocker開発-Swarm Modeという次のツールが役立ちます 。
おわりに
CaaSを使用することの大きな利点とDockerのシンプルさを納得できなかった場合、既存のアプリケーションの1つを確認してDockerコンテナーに移動することを強くお勧めします。
Dockerコンテナは、開発、インストール、テストから運用アプリケーションのホストまで、好きなことを実行できる小さな仮想マシンです。
Dockerの均一性は、実稼働環境の魔法のようなものです。 これにより、アプリケーションの展開とサーバー管理が容易になります。 なぜなら、ローカルで機能するものはクラウドでも機能するからです。 これは私が冷静と呼ぶものです。 誰もが何度も聞いたことがある悪名高い文を誰も聞かないでしょう。
まあ、それは私の車で動作します...
出典: Dockerのクラッシュコース-大きな魚と泳ぐことを学ぶ