前書き

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

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

  • Dockerエンジン

  • Dockerツール

  • Dockerレジストリ

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

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

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

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

前提条件

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

  • このhttps://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04[Ubuntu 16.04初期サーバーセットアップチュートリアル]に従って、1つのUbuntu 16.04ドロップレットをセットアップしました。 rootユーザーとファイアウォール。

  • Docker Hubアカウントhttps://docs.docker.com/docker-hub/ [このDocker Hubの概要]は、開始に役立ちます。

デフォルトでは、 `+ docker `コマンドにはルート権限が必要です。 ただし、* 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 +`コマンドを実行すると、Docker Engineは最初にイメージをプルしてから実行します。 `+ docker images`コマンドを再度実行すると、 + hello-world`イメージがローカルで利用できることがわかります。

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

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

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

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

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

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

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

docker ps

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

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

curl localhost

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

docker stop web
docker rm web

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

ステップ3-コンテナーへのストレージの追加

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

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

mkdir htdocs

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

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 +`イメージが表示されます。

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

docker login
docker tag /doweb
docker push /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" : [":5000"]
}

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

結論

このチュートリアルは、Dockerの使用開始に役立ちました。 インストール、コンテナ管理、イメージ管理、ストレージ、プライベートレジストリなどの重要な概念について説明しました。 今後のセッションと記事https://go.digitalocean.com/containers-and-microservices-webinars-series [このシリーズ]は、Dockerの基本を超えて役立つでしょう。