ウェビナーシリーズ:コンテナ入門

[。注意]##

この記事はwebinar series on deploying and managing containerized workloads in the cloudを補足します。 このシリーズでは、コンテナのライフサイクル管理、マルチコンテナアプリケーションの展開、ワークロードのスケーリング、Kubernetesの理解、およびステートフルアプリケーションを実行するためのベストプラクティスを含む、コンテナの本質について説明します。

このチュートリアルには、シリーズの最初のセッションであるコンテナ入門で説明されている概念とコマンドが含まれています。

前書き

Dockerは、コンテナ化されたアプリケーションをデプロイおよび管理するためのプラットフォームです。 コンテナは、柔軟性が高いため、開発者、管理者、およびdevopsエンジニアの間で人気があります。

Dockerには3つの必須コンポーネントがあります。

  • Dockerエンジン

  • Dockerツール

  • Dockerレジストリ

Docker Engineは、コンテナを管理するコア機能を提供します。 基盤となるLinuxオペレーティングシステムと連動して、コンテナのライフサイクルに対処するためのシンプルなAPIを公開します。

Dockerツールは、Docker Engineによって公開されるAPIと通信するコマンドラインツールのセットです。 これらは、コンテナの実行、新しいイメージの作成、ストレージとネットワークの構成、およびコンテナのライフサイクルに影響を与えるさらに多くの操作の実行に使用されます。

Docker Registryは、コンテナイメージが保存される場所です。 各画像には、一意のタグで識別される複数のバージョンを含めることができます。 ユーザーは既存の画像をレジストリから取得し、新しい画像をレジストリにプッシュします。 Docker Hubは、Docker, Inc.によって管理されるホストされたレジストリです。独自の環境内でレジストリを実行して、イメージをエンジンに近づけることもできます。

このチュートリアルの終わりまでに、DockerをDigitalOcean Dropletにインストールし、コンテナーを管理し、イメージを操作し、永続性を追加し、プライベートレジストリをセットアップします。

前提条件

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

デフォルトでは、dockerコマンドにはroot権限が必要です。 ただし、dockerグループのユーザーとしてdockerを実行することにより、sudoプレフィックスなしでコマンドを実行できます。

ドロップレットをこのように構成するには、コマンドsudo usermod -aG docker ${USER}を実行します。 これにより、現在のユーザーがdockerグループに追加されます。 次に、コマンドsu - ${USER}を実行して、新しいグループメンバーシップを適用します。

このチュートリアルでは、サーバーがsudoプレフィックスなしでdockerコマンドを実行するように構成されていることを前提としています。

ステップ1 — Dockerのインストール

ドロップレットにSSHで接続した後、次のコマンドを実行して、既にインストールされている可能性のある既存のdocker関連パッケージを削除し、公式リポジトリからDockerをインストールします。

sudo apt-get remove docker docker-engine docker.io
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce

Dockerをインストールしたら、次のコマンドを使用してインストールを確認します。

docker info

上記のコマンドは、環境にデプロイされたDocker Engineの詳細を表示します。 次のコマンドは、Dockerツールが正しくインストールおよび構成されていることを確認します。 Docker EngineとToolsの両方のバージョンを印刷する必要があります。

docker version

ステップ2 —コンテナーの起動

Dockerコンテナは、レジストリに保存されている既存のイメージから起動されます。 Dockerの画像は、プライベートまたはパブリックのリポジトリに保存できます。 プライベートリポジトリでは、ユーザーは画像を取得する前に認証する必要があります。 公開画像には誰でもアクセスできます。

hello-worldという名前の画像を検索するには、次のコマンドを実行します。

docker search hello-world

hello-worldという名前に一致する複数の画像が存在する可能性があります。 画像の人気を示す最大の星を持つものを選択してください。

次のコマンドを使用して、ローカル環境で使用可能なイメージを確認します。

docker images

まだコンテナを起動していないため、画像はありません。 これで、イメージをダウンロードしてローカルで実行できます。

docker pull hello-world
docker run hello-world

イメージをプルせずにdocker runコマンドを実行すると、DockerEngineは最初にイメージをプルしてから実行します。 docker imagesコマンドを再度実行すると、hello-worldイメージがローカルで使用可能になっていることがわかります。

より意味のあるコンテナ、Apache Webサーバーを起動しましょう。

docker run -p 80:80 --name web -d httpd

docker runコマンドに渡される追加のオプションに気付くかもしれません。 これらのスイッチの説明は次のとおりです。

  • -p —これは、Docker Engineに、ホストのポート80でコンテナーのポート80を公開するように指示します。 Apacheはポート80でリッスンするため、ホストポートで公開する必要があります。

  • --name —このスイッチは、実行中のコンテナーに名前を割り当てます。 これを省略すると、Docker Engineはランダムな名前を割り当てます。

  • -d —このオプションは、コンテナーをデタッチモードで実行するようにDockerEngineに指示します。 これがないと、コンテナはフォアグラウンドで起動され、シェルへのアクセスがブロックされます。 コンテナをバックグラウンドにプッシュすることにより、コンテナの実行中にシェルを使用し続けることができます。

コンテナが実際にバックグラウンドで実行されていることを確認するには、次のコマンドを試してください。

docker ps

出力は、webという名前のコンテナーが、ホストポート80にマップされたポート80で実行されていることを示しています。

次に、Webサーバーにアクセスします。

curl localhost

次のコマンドを使用して、実行中のコンテナを停止して削除します。

docker stop web
docker rm web

docker psを再度実行すると、コンテナーが終了したことが確認されます。

ステップ3 —コンテナにストレージを追加する

コンテナは一時的なものです。つまり、コンテナが終了すると、コンテナ内に保存されているものはすべて失われます。 コンテナの寿命を超えてデータを保持するには、コンテナにボリュームをアタッチする必要があります。 ボリュームは、ホストファイルシステムのディレクトリです。

ホスト上に新しいディレクトリを作成することから始めます。

mkdir htdocs

次に、新しいスイッチを使用してコンテナを起動し、htdocsディレクトリをマウントして、ApacheWebサーバーのドキュメントルートをポイントします。

docker run -p 80:80 --name web -d -v $PWD/htdocs:/usr/local/apache2/htdocs httpd

-vスイッチは、コンテナ内のhtdocsディレクトリをホストのファイルシステムにポイントします。 このディレクトリに加えられた変更は、両方の場所で表示されます。

次のコマンドを実行して、コンテナからディレクトリにアクセスします。

docker exec -it web /bin/bash

このコマンドは、ターミナルをコンテナのシェルにインタラクティブモードで接続します。 コンテナ内にドロップされていることがわかります。

htdocsフォルダーに移動し、単純なHTMLファイルを作成します。 最後に、シェルを終了してホストに戻ります。

cd /usr/local/apache2/htdocs
echo '

Hello World from Container

' > index.html exit

curl localhostコマンドを再度実行すると、Webサーバーが作成したページを返していることがわかります。

ホストからこのファイルにアクセスできるだけでなく、変更することもできます。

cd htdocs
cat index.html
echo '

Hello World from Host

' | sudo tee index.html >/dev/null

curl localhostを再度実行すると、Webサーバーがホストから作成された最新のページを提供していることが確認されます。

次のコマンドでコンテナを終了します。 (-fは、Dockerを最初に停止せずに強制的に終了させます。)

docker rm -f web

ステップ4 —イメージの構築

レジストリから既存のイメージを実行する以外に、独自のイメージを作成してレジストリに保存できます。

既存のコンテナから新しいイメージを作成できます。 コンテナに加えられた変更は最初にコミットされ、次にイメージにタグが付けられ、レジストリにプッシュされます。

httpdコンテナを再度起動して、デフォルトのドキュメントを変更してみましょう。

docker run -p 80:80 --name web -d httpd
docker exec -it web /bin/bash
cd htdocs
echo '

Welcome to my Web Application

' > index.html exit

コンテナは、カスタマイズされたindex.htmlで実行されています。 curl localhostで確認できます。

変更したコンテナをコミットする前に、停止することをお勧めします。 停止した後、commitコマンドを実行します。

docker stop web
docker commit web doweb

docker imagesコマンドでイメージの作成を確認します。 作成したばかりのdowebイメージが表示されます。

この画像にタグを付けてDocker Hubに保存するには、次のコマンドを実行して画像をパブリックレジストリにプッシュします。

docker login
docker tag your_docker_hub_username/doweb
docker push your_docker_hub_username/doweb

ブラウザーまたはコマンドラインからDocker Hubを検索して、新しいイメージを確認できます。

ステップ5 —プライベートレジストリの起動

画像をより安全に保つために、プライベート環境でレジストリを実行することが可能です。 また、Docker Engineとイメージリポジトリの間の遅延も削減されます。

Docker Registryは、他のコンテナと同様に起動できるコンテナとして利用できます。 レジストリには複数の画像が保持されているため、ストレージボリュームをそれに登録することをお勧めします。

docker run -d -p 5000:5000 --restart=always --name registry -v $PWD/registry:/var/lib/registry registry

コンテナは、ポート5000が公開され、registryディレクトリがホストファイルシステムにマップされた状態でバックグラウンドで起動されることに注意してください。 docker psコマンドを実行すると、コンテナーが実行されていることを確認できます。

ローカルイメージにタグを付けて、プライベートレジストリにプッシュできるようになりました。 まず、Docker Hubからbusyboxコンテナをプルして、タグを付けましょう。

docker pull busybox
docker tag busybox localhost:5000/busybox
docker images

前のコマンドは、busyboxコンテナがlocalhost:5000でタグ付けされていることを確認するため、イメージをプライベートレジストリにプッシュします。

docker push localhost:5000/busybox

イメージをローカルレジストリにプッシュしたら、環境から削除してレジストリから引き戻してみましょう。

docker rmi -f localhost:5000/busybox
docker images
docker pull localhost:5000/busybox
docker images

画像をプルし、タグを付け、ローカルレジストリにプッシュし、最後に引き戻すという完全なサイクルを経ました。

専用ホストでプライベートレジストリを実行したい場合があります。 異なるマシンで実行されているDocker Engineは、リモートレジストリと通信してイメージをプルおよびプッシュします。

レジストリは保護されていないため、Docker Engineの構成を変更して、安全でないレジストリへのアクセスを有効にする必要があります。 これを行うには、/etc/docker/daemon.jsonにあるdaemon.jsonファイルを編集します。 ファイルが存在しない場合は作成します。

次のエントリを追加します。

/etc/docker/daemon.jsonの編集

{
  "insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"]
}

REMOTE_REGISTRY_HOSTをリモートレジストリのホスト名またはIPアドレスに置き換えます。 Docker Engineを再起動して、構成の変更が適用されていることを確認します。

結論

このチュートリアルは、Dockerの使用開始に役立ちました。 インストール、コンテナ管理、イメージ管理、ストレージ、プライベートレジストリなどの重要な概念について説明しました。 今後のセッションと記事in this seriesは、Dockerの基本を超えるのに役立ちます。

Related