コンテナーを使って始めるWebinarシリーズ

この記事は、クラウドでコンテナ化ワークロードをデployおよび管理するためのWebinar系列の一部です。series covers the fundamentals of containers, including container lifecycle management, deploying multi-container applications, scaling workloads, and understanding Kubernetes, as well as highlighting best practices for running stateful applications. 今回のtutorialは、Seriesの第一回であるGetting Started with Containersに対応しています。

本教程包括该系列中介绍的第一节关于容器的基本概念和命令,涵盖了容器生命周期管理、部署多容器应用程序、扩展工作负载以及了解Kubernetes等主题,同时介绍了运行有状态应用程序的最佳实践。

Introduction

Docker is a platform for deploying and managing containerized applications. Containers are popular among developers, administrators, and DevOps engineers because of the flexibility they provide.

Docker consists of three key components:

  • Docker Engine
  • Docker Tools
  • Docker Registry

The Docker Engine provides the core capabilities for managing containers. It interacts with the underlying Linux operating system to expose simple APIs to handle the lifecycle of containers.

Docker Tools are a set of command-line tools that communicate with the API exposed by the Docker Engine. They are used to run containers, create new images, configure storage and networks, and perform other operations that affect the lifecycle of a container.

Docker Registryは、コンテナーイメージが格納される場所です。各イメージには、ユニークなタグを通じて複数のバージョンを持つことができます。ユーザーは、レジストリから既存のイメージをプルし、新しいイメージをプッシュします。Docker Hubは、Docker, Inc.が管理するホステッドレジストリです。また、イメージをエンジンに近く保つために、自分の環境内でレジストリを実行することも可能です。

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

前提条件

このチュートリアルを追うには、以下が必要です:

デフォルトで、dockerコマンドはroot権限が必要です。しかし、sudo接頭詞を省略してコマンドを実行することができます。dockerコマンドをdockerグループのユーザーとして実行します。

この方法でDropletを設定するには、sudo usermod -aG docker ${USER}コマンドを実行します。これにより、現在のユーザーがdockerグループに追加されます。その後、新しいグループメンバーシップを適用するためにsu - ${USER}コマンドを実行してください。

このチュートリアルは、サーバーがdockerコマンドをsudo接頭詞なしで実行するように設定されていることを前提としています。

手順1 — Dockerのインストール

DropletにSSHを接続した後、既にインストールされているdocker関連のパッケージを削除し、公式のリポジトリからDockerをインストールするための以下のコマンドを実行します。

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

Dockerをインストールした後、以下のコマンドでインストールを確認してください。

  1. docker info

上記のコマンドは、環境にデプロイされたDockerエンジンの詳細を表示します。次のコマンドは、Dockerツールが正しくインストールされており、設定されていることを確認します。Dockerエンジンとツールのバージョンが表示されるべきです。

  1. docker version

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

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

名前がhello-worldのイメージを検索するには、以下のコマンドを実行します:

  1. docker search hello-world

名前がhello-worldと一致する複数のイメージが存在する可能性があります。最大のスター数を持つものを選択してください。これは、イメージの人気を示します。

以下のコマンドで、ローカル環境で利用可能なイメージを確認します:

  1. docker images

まだコンテナを起動していないため、イメージはありません。今すぐイメージをダウンロードし、ローカルで実行しましょう:

  1. docker pull hello-world
  2. docker run hello-world

docker runコマンドを実行する際にイメージをプルしないで、Dockerエンジンはまずイメージをプルし、その後実行します。docker imagesコマンドを再度実行すると、ローカルにhello-worldイメージが利用可能であることがわかります。

もっと意味のあるコンテナを起動してみましょう:Apacheウェブサーバーです。

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

docker runコマンドに渡される追加のオプションについて気づいたことがあるかもしれません。以下は、これらのスイッチの説明です:

  • このコードはDocker Engineを使って、コンテナーのポート80をホストの80番目のポートに exposureします。Apacheは80番目のポートでListenerを起動しているために必要です。
  • --name オプションはコンテナーに名前を与えます。無ければDocker Engineはランダムな名前を与えます。
  • -d オプションはコンテナーをdetachedモードで运行させます。このオプションを省略した場合、コンテナーは前台で起動され、shellを使用することができなくなります。Detached modeで起動することで、shellを使うことができます。

実行してみましょう:

  1. docker ps

出力から見て、名前がwebであり、80番目のポートがホストの80番目のポートにマッピュされていることがわかります。

Webサーバーへアクセスしましょう:

  1. curl localhost

次に、実行してみましょう:

  1. docker stop web
  2. docker rm web

出力から見て、名前がwebであり、80番目のポートがホストの80番目のポートにマッピュされていることがわかります。

Step 3 — Adding Storage to Containers

コンテナは一時性であり、コンテナが終了した後に保存されたデータは失われます。持久化数据を保持するには、コンテナに卷(volume)を附加する必要があります。卷はホストのファイルシステムから直接アクセス可能なディRECTORYです。

先にホスト上に新しいディRECTORYを作成します:

  1. mkdir htdocs

次に、コンテナを新しく起動し、htdocsディRECTORYをApache Webサーバーのドキュメントルートとして mounting します:

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

-vオプションはコンテナ内のhtdocsディRECTORYをホストのファイルシステムに対応させ、このディRECTORY内の変更は両方の場所で見えます。

コンテナ内では以下のコマンドを実行しておく:

  1. docker exec -it web /bin/bash

このコマンドはターミナルをコンテナのshellに入り、interactiveモードでコンテナ内に入ります。あなたはその後、ホストに戻ります:

コンテナ内でhtdocsフォルダに移動し、簡単なHTMLファイルを作成します。最後にexitコマンドを使用してshellから退出します:

  1. cd /usr/local/apache2/htdocs
  2. echo '<h1>Hello World from Container</h1>' > index.html
  3. exit

exitコマンドを使った後、ホストでも同じHTMLファイルを見ることができます。

次回curl localhostを実行すると、Webサーバーは私たちがホスト側で作成したページを返します。

  1. cd htdocs
  2. cat index.html
  3. echo '<h1>Hello World from Host</h1>' | sudo tee index.html >/dev/null

再度curl localhostを実行してみると、Webサーバーは最新のページを返します。

コンテナを終了するために次のコマンドを使用します。(-fはDockerを強制終了するために使用されます。)

  1. docker rm -f web

第四步:画像の作成


除了从注册中心运行现有的镜像外,我们还可以创建自己的镜像并将其存储在注册中心。

你可以从现有的容器创建新的镜像。对容器的更改首先被提交,然后对镜像进行标记并推送到注册中心。

让我们再次启动httpd容器,并修改默认文档:

  1. docker run -p 80:80 --name web -d httpd
  2. docker exec -it web /bin/bash
  3. cd htdocs
  4. echo '<h1>Welcome to my Web Application</h1>' > index.html
  5. exit

现在容器正在以自定义的index.html运行。您可以使用curl localhost来验证它。

在提交更改之前,最好先停止容器。停止后,执行commit命令:

  1. docker stop web
  2. docker commit web doweb

确认创建了名为doweb的图像。可以使用docker images命令查看它。

为了将此图像标记并存储在Docker Hub中,请运行以下命令将其推送到公共注册中心:

  1. docker login
  2. docker tag your_docker_hub_username/doweb
  3. docker push your_docker_hub_username/doweb

可以在浏览器或命令行中搜索Docker Hub以验证新图像。

第五步:私有Registry的启动

private環境でレジストリを运行することが可能です。これにより画像の安全性を上げ、Docker Engineとimage repository之间のlatencyを減らすことができます。

Docker RegistryはContainerとして起動できるようになっています。 registryは多くのimageを保持しており、そのためにvolumeをattachすることが良いです。

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

注意してくださいが、containerはbackgroundで起動され、port 5000をexposeしており、registryディRECTORYはホストファイルシステムにmappedされています。 containerの起動を確認するには、docker psコマンドを実行してください。

現在、containerは运行中であり、docker psコマンドでverifyできます。私たちは今、local imageをtagしてpushしてみましょう。先にDocker Hubからbusyboxcontainerをpullしてください。

  1. docker pull busybox
  2. docker tag busybox localhost:5000/busybox
  3. docker images

前のコマンドは、busyboxcontainerがnow tagged with localhost:5000であることを示しています。 imageをprivate registryにpushします。

  1. docker push localhost:5000/busybox

imageをpushした後、local registryからpullしてみましょう。 imageをpullした後、削除してからpullして戻します。

  1. docker rmi -f localhost:5000/busybox
  2. docker images
  3. docker pull localhost:5000/busybox
  4. docker images

私たちはfull cycle of pulling the image, tagging it, pushing it to the local registry, and finally pulling it back.

There may be cases where you want to run the private registry on a dedicated host. Docker Engine running on different machines will talk to the remote registry to pull and push images.

レジストリが安全ではないため、Docker Engineの設定を変更してアクセスすることが必要です。これを行うには、/etc/docker/daemon.jsonファイルを編集します。存在しなければ新規に作成します。

以下の記述を追加します:

Editing /etc/docker/daemon.json
{
  "insecure-registries" : ["REMOTE_REGISTRY_HOST:5000"]
}

“`json
{
“registry”: {
“host”: “REMOTE_REGISTRY_HOST”,
“port”: “5000”
}
}
“`

上記の値は、远程レジストリのホスト名やIPアドressを置き換えてください。変更後、Docker Engineを再起動して configurations changes を適用します。

### Conclusion

This tutorial has helped you get started with Docker. It covered the essential concepts including the installation, container management, image management, storage, and private registry. The upcoming sessions and articles in this series will help you go beyond the basics of Docker.

Source:
https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-docker