ウェビナーシリーズ:コンテナ入門
この記事は、クラウドでのコンテナー化されたワークロードのデプロイと管理に関するウェビナーシリーズを補足するものです。 このシリーズでは、コンテナのライフサイクル管理、マルチコンテナアプリケーションのデプロイ、ワークロードのスケーリング、Kubernetesの理解など、コンテナの基本事項を取り上げ、ステートフルアプリケーションを実行するためのベストプラクティスを紹介します。
このチュートリアルには、シリーズの最初のセッション「コンテナ入門」で取り上げた概念とコマンドが含まれています。
序章
Dockerは、コンテナー化されたアプリケーションをデプロイおよび管理するためのプラットフォームです。 コンテナーは、その柔軟性により、開発者、管理者、およびDevOpsエンジニアの間で人気があります。
Dockerには3つの重要なコンポーネントがあります。
- Dockerエンジン
- Dockerツール
- Dockerレジストリ
Docker Engineは、コンテナーを管理するコア機能を提供します。 基盤となるLinuxオペレーティングシステムとインターフェイスして、コンテナのライフサイクルを処理するための単純なAPIを公開します。
Docker Toolsは、DockerEngineによって公開されたAPIと通信するコマンドラインツールのセットです。 これらは、コンテナーの実行、新しいイメージの作成、ストレージとネットワークの構成、およびコンテナーのライフサイクルに影響を与えるさらに多くの操作の実行に使用されます。
Docker Registryは、コンテナーイメージが格納される場所です。 各画像には、一意のタグで識別される複数のバージョンを含めることができます。 ユーザーはレジストリから既存のイメージをプルし、それに新しいイメージをプッシュします。 Docker Hub は、 Docker、Inc.によって管理されるホスト型レジストリです。独自の環境内でレジストリを実行して、イメージをエンジンに近づけることもできます。
このチュートリアルの終わりまでに、DockerをDigitalOcean Dropletにインストールし、コンテナーを管理し、イメージを操作し、永続性を追加し、プライベートレジストリを設定します。
前提条件
このチュートリアルに従うには、次のものが必要です。
- このUbuntu16.04初期サーバーセットアップチュートリアルに従ってセットアップされた1つのUbuntu16.04ドロップレット。これには、sudo非rootユーザーとファイアウォールが含まれます。
- DockerHubアカウント。 Docker Hub のこの概要は、始めるのに役立ちます。
デフォルトでは、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
上記のコマンドは、環境にデプロイされたDockerEngineの詳細を示しています。 次のコマンドは、Dockerツールが正しくインストールおよび構成されていることを確認します。 DockerEngineと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
イメージがローカルで使用可能になっていることがわかります。
より意味のあるコンテナであるApacheWebサーバーを起動してみましょう。
docker run -p 80:80 --name web -d httpd
docker run
コマンドに渡される追加のオプションに気付くかもしれません。 これらのスイッチの説明は次のとおりです。
-p
—これはDockerEngineにホストのポート80
でコンテナーのポート80
を公開するように指示します。 Apacheはポート80
でリッスンするため、ホストポートで公開する必要があります。--name
—このスイッチは、実行中のコンテナーに名前を割り当てます。 これを省略すると、DockerEngineはランダムな名前を割り当てます。-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 '<h1>Hello World from Container</h1>' > index.html exit
curl localhost
コマンドを再度実行すると、Webサーバーが作成したページを返していることがわかります。
ホストからこのファイルにアクセスできるだけでなく、次のように変更することもできます。
cd htdocs cat index.html echo '<h1>Hello World from Host</h1>' | 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 '<h1>Welcome to my Web Application</h1>' > index.html exit
コンテナは、カスタマイズされたindex.html
で実行されています。 curl localhost
で確認できます。
変更されたコンテナをコミットする前に、それを停止することをお勧めします。 停止した後、commitコマンドを実行します。
docker stop web docker commit web doweb
docker images
コマンドでイメージの作成を確認してください。 作成したばかりのdoweb
イメージが表示されます。
このイメージにタグを付けてDockerHubに保存するには、次のコマンドを実行してイメージをパブリックレジストリにプッシュします。
docker login docker tag your_docker_hub_username/doweb docker push your_docker_hub_username/doweb
ブラウザまたはコマンドラインからDockerHubを検索すると、新しいイメージを確認できます。
ステップ5—プライベートレジストリを起動する
プライベート環境でレジストリを実行して、イメージをより安全に保つことができます。 また、Dockerエンジンとイメージリポジトリ間のレイテンシーも削減されます。
Docker Registryは、他のコンテナーと同じように起動できるコンテナーとして使用できます。 レジストリには複数のイメージが保持されているため、レジストリにストレージボリュームをアタッチすることをお勧めします。
docker run -d -p 5000:5000 --restart=always --name registry -v $PWD/registry:/var/lib/registry registry
ポート5000
が公開され、registry
ディレクトリがホストファイルシステムにマップされた状態で、コンテナがバックグラウンドで起動されることに注意してください。 docker ps
コマンドを実行すると、コンテナが実行されていることを確認できます。
これで、ローカルイメージにタグを付けて、プライベートレジストリにプッシュできます。 まず、DockerHubから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
画像をプルし、タグを付け、ローカルレジストリにプッシュし、最後にプルバックするという完全な循環を実行しました。
専用ホストでプライベートレジストリを実行したい場合があります。 異なるマシンで実行されているDockerEngineは、リモートレジストリと通信して、イメージをプルおよびプッシュします。
レジストリは保護されていないため、安全でないレジストリにアクセスできるようにDockerEngineの構成を変更する必要があります。 これを行うには、/etc/docker/daemon.json
にあるdaemon.json
ファイルを編集します。 ファイルが存在しない場合は作成します。
次のエントリを追加します。
/etc/docker/daemon.jsonを編集する
{ "insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"] }
REMOTE_REGISTRY_HOST
をリモートレジストリのホスト名またはIPアドレスに置き換えます。 Docker Engineを再起動して、構成の変更が適用されていることを確認します。
- 結論このチュートリアルは、Dockerの使用を開始するのに役立ちました。 インストール、コンテナ管理、イメージ管理、ストレージ、プライベートレジストリなどの重要な概念について説明しました。 このシリーズの今後のセッションと記事は、Dockerの基本を超えるのに役立ちます。