[。注意]##
この記事は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にインストールし、コンテナーを管理し、イメージを操作し、永続性を追加し、プライベートレジストリをセットアップします。
前提条件
このチュートリアルを実行するには、次のものが必要です。
-
このUbuntu 16.04 initial server setup tutorialに従ってセットアップされた1つのUbuntu 16.04ドロップレット。これには、sudo非rootユーザーとファイアウォールが含まれます。
-
Docker Hub account。 This overview of 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
上記のコマンドは、環境にデプロイされた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の基本を超えるのに役立ちます。